Releases: nteract/semiotic
Semiotic v3.2.2
[3.2.2] - 2026-03-30
Added
- 346 new scene builder tests — Exhaustive coverage for all XY and ordinal scene builders with actual coordinate/position assertions.
- FunnelChart and LikertChart HOC tests — 60 tests for the two previously untested HOCs.
- Render pipeline benchmarks — Scene builder throughput, RingBuffer ops, end-to-end ingest-to-render.
- Dev-mode
d.dataaccess warning — Frame callbacks warn when accessing wrapper properties instead ofd.data?.field. Zero production overhead. - Streaming-first docs — Landing and Getting Started pages restructured to lead with the streaming engine.
Fixed
@modelcontextprotocol/sdkremoved from production dependencies — MCP CLI now bundles the SDK via esbuild.npm install semioticno longer pulls in the 4MB+ SDK.@types/d3-quadtreemoved to devDependencies- Stacked area points at wrong Y position — Fixed cumulative Y computation.
- Null Y datums assigned stacked Y — Added null/NaN guard.
- Stale forecast overlays on prop removal — Clears overlays when both forecast and anomaly become falsy.
- GeoCanvasHitTester inconsistent hit radius — Unified to
Math.max((r||4)+5, 12). - backgroundGraphics not honoring margins — Fixed in StreamXYFrame and StreamGeoFrame.
See CHANGELOG.md for full details.
Semiotic v3.2.1
[3.2.1] - 2026-03-30
Added
- LikertChart — new ordinal HOC for Likert scale survey data (diverging horizontal / stacked vertical).
onClickprop on all HOCs — Direct click handler receiving(datum, { x, y }).categoryFormatprop — Custom tick label formatting on ordinal HOCs.category-highlightannotation type — Highlight category columns/rows.labelPositionon threshold annotations — Position labels left/center/right (y) or top/center/bottom (x).- Coordinate-based linked crosshair —
linkedHoverwithmode: "x-position"for synced vertical crosshairs. - Tooltip viewport-aware flip — Auto-flip near container edges.
- Data-driven histogram bin snapping — Snaps to actual computed bin boundaries.
- IBM Carbon color palettes —
CARBON_CATEGORICAL_14,CARBON_ALERT,"carbon"/"carbon-dark"theme presets. - Legend line wrapping — Horizontal legends wrap to multiple rows.
showPointson AreaChart and StackedAreaChart
Changed
- ThemeProvider categorical colors flow to all HOCs automatically.
- 12px minimum hit target (Fitts's law) on all canvas hit testers.
Fixed
- Legend
styleFncontract, LikertChart tooltip,category-highlightannotation positioning, crosshair cleanup on unmount,FlippingTooltipdependency array, removed deadslicePaddingprop.
See CHANGELOG.md for full details.
Semiotic v3.2.0
[3.2.0] - 2026-03-25
Added
- Hover dot color matching — The hover indicator dot now automatically matches the hovered element's color (line stroke, area stroke, point fill) instead of hardcoded blue.
- Adaptive time tick formatting — hierarchical axis labels that auto-space to prevent overlap.
- Forecast: training line styling —
trainStroke,trainLinecap,trainUnderline,trainOpacity,forecastOpacityonForecastConfig. - Forecast: per-datum anomaly styling —
anomalyColor,anomalyRadius, andanomalyStylenow accept functions for data-driven rendering. - 128 new unit tests
Fixed
- SVGOverlay left axis label missing in dual-axis mode
- ThemeStore
mode: "dark"merged onto wrong base - Tick label overlap on time axes
- Function accessors with forecast/anomaly now bake resolved values for annotation rendering
- Geo hover ring color, tick color dark mode fallback, annotation accessor fallback
See CHANGELOG.md for full details.
Semiotic v3.1.2
Semiotic v3.1.2
Critical MCP server fix — all 5 tools now receive arguments correctly. Geo chart rendering support added. HTTP transport mode for remote MCP inspectors.
Note: v3.1.1 was yanked from npm. Upgrade directly from 3.1.0 to 3.1.2.
Fixed
- MCP server tools received no arguments — all 5 tools used empty
{}Zod schemas, causing the MCP SDK to strip all incoming parameters. Every tool call silently fell into "missing field" error paths. Fixed by defining proper Zod input schemas for all tools. - MCP geo chart rendering —
renderHOCToSVGrejected geo components not in thevalidatePropsvalidation map. Geo components now skip validation gracefully and render correctly. - MCP
--portparsing —--httpwithout--portno longer produces NaN (falls back to 3001). - MCP "top-level fields" dead code — removed unreachable spread logic from
renderChart/diagnoseConfighandlers; updated Zod descriptions to match actual schema behavior. - suggestChart Histogram heuristic — removed unreachable
data.length >= 10check (suggestChart accepts 1–5 samples per its Zod schema). - renderHOCToSVG validation fragility — tightened unknown-component skip check to require exactly one "Unknown component" error.
Added
- MCP
getSchematool — returns the prop schema for any component on demand, or lists all 30 components with[renderable]markers. Reduces token overhead vs loading full schema. - MCP
suggestCharttool — analyzes 1–5 sample data objects and recommends chart types with confidence levels, reasons, and example JSX. Supportsintentparameter (comparison, trend, distribution, relationship, composition, geographic, network, hierarchy). - MCP geo chart support — ChoroplethMap, ProportionalSymbolMap, FlowMap, and DistanceCartogram added to the render registry (25 renderable components total).
- MCP HTTP transport —
npx semiotic-mcp --http --port 3001starts a session-based HTTP server with CORS headers for browser-based MCP inspectors and remote access. - suggestChart input validation — Zod schema enforces
.min(1).max(5)on data array.
Changed
- MCP server now has 5 tools total:
getSchema,suggestChart,renderChart,diagnoseConfig,reportIssue. - npm keywords added for MCP directory discoverability (
mcp,model-context-protocol,mcp-server). prepublishOnlycleansdist/to prevent stale dynamic import chunks in published tarball.
Install
npm install semiotic@3.1.2MCP Setup
{
"mcpServers": {
"semiotic": {
"command": "npx",
"args": ["semiotic-mcp"]
}
}
}Semiotic v3.1.0
Semiotic v3.1.0
Geographic visualization, accessibility foundation, performance optimizations, and comprehensive bug fixes.
Added
Geographic Visualization (semiotic/geo)
- ChoroplethMap — sequential color encoding on GeoJSON features with
valueAccessor,colorScheme, and reference geography strings ("world-110m","world-50m") - ProportionalSymbolMap — sized/colored point symbols on a geographic basemap with
sizeBy,sizeRange, andcolorBy - FlowMap — origin-destination flow lines with width encoding, animated particles (
showParticles,particleStyle), andlineType("geo"|"line") - DistanceCartogram — ORBIS-style projection distortion based on travel cost with concentric ring overlay, north indicator, configurable strength and line mode
- StreamGeoFrame — low-level geo frame with full control over areas, points, lines, canvas rendering, and push API for streaming
- Zoom/Pan — all geo charts accept
zoomable,zoomExtent,onZoomwith imperativegetZoom()/resetZoom() - Drag Rotate — globe spinning for orthographic projections, latitude clamped to [-90, 90]
- Tile Maps —
tileURL,tileAttribution,tileCacheSizefor slippy-map basemaps (Mercator only) - Reference geography —
resolveReferenceGeography()returns Natural Earth GeoJSON features;mergeData()joins external data into features - GeoParticlePool — object-pool polyline particle system for animated flow particles
- GeoCanvasHitTester — spatial indexing for hover/click hit detection on canvas-rendered geo marks
- 6 documentation pages, 2 playground pages, 1 recipe page
- Comprehensive test suites: FlowMap (25), ChoroplethMap (16), DistanceCartogram (19), colorUtils (+6), hooks (+3)
Accessibility (WCAG 2.1 AA ~70%)
- Canvas
aria-labelon all Stream Frames describing chart type and data shape - Legend keyboard navigation — roving tabindex, Enter/Space activate, arrow keys navigate
aria-live="polite"region mirroring tooltip text for screen readers- SVG
<title>and<desc>on all overlay components aria-labelon ChartContainer toolbar buttons- 35 Playwright accessibility integration tests
Streaming
- Streaming legend support —
useStreamingLegendhook discovers categories from pushed data dynamically - 20+ Playwright streaming regression tests (canvas pixel sampling, legend appearance, tooltip content, stability)
Performance
- Color map cache — skips rebuild when categories unchanged
- Stacked area cache — skips cumulative sum when data unchanged
- Buffer array cache — dirty flag prevents re-materialization on hover/transition ticks
- Canvas buffer reuse — skips GPU reallocation when dimensions unchanged
- Path2D caching on geo nodes — eliminates per-hover allocations
- Streaming push backpressure — microtask batching in DataSourceAdapter
AI Tooling
- MCP server consolidated from 19 tools to 3 (
renderChart,diagnoseConfig,reportIssue) - Self-healing error boundaries —
SafeRenderrunsdiagnoseConfigon chart failures (dev mode) - 61 new unit tests for
withChartWrapper, network utilities, and ordinal push API
Fixed
- Grey fills on push API charts — end-to-end fix for color pipeline when colorScale is unavailable during streaming
- LineChart infinite re-render loop — circular dependency between statistical overlay effect and line style
tooltip={false}now correctly disables tooltips on all 22 remaining HOCs- Network HOC tooltip double-chrome wrapping (7 charts)
Math.min/max(...spread)stack overflow on >100K datasets- Unbounded memory growth in "growing" window mode (capped at 1M default)
- Geo hooks crash — "Rendered more hooks than during previous render" in FlowMap and ChoroplethMap
- ChoroplethMap colorScale crash with null areas during async loading
- Function
colorByproduced undefined colors —useColorScalederives categories from data whencolorByis a function - Area/StackedArea tooltips showing "-" instead of values
- Force graph centering and streaming refresh
- FIFO category ordering for streaming ordinal charts
- Edge hit areas expanded to 5px minimum tolerance
- Sankey crossing reduction via barycenter ordering
- Anti-meridian line handling for geo projections
- And 20+ more fixes — see CHANGELOG.md
Improved
@ts-nocheckremoved from Legend.tsx — full type safety restored- 38
as anycasts eliminated from PipelineStore useSyncExternalStorereplaces custom shim (concurrent mode safe)- Shared
useChartSetuphook — 10 HOCs refactored, ~170 lines removed
Tests
- 1944 total tests, 106 test files
- Direct tests for StreamXYFrame (39) and StreamOrdinalFrame (44)
- Legend tests (33), tooltipUtils tests (35), ordinal scene builder tests (67)
Semiotic v3.0.1
Semiotic v3.0.1
Bug fixes, emphasis prop, direct labels, gap strategy fixes, and export improvements.
Added
emphasisprop — all charts acceptemphasis="primary" | "secondary".ChartGridspans primary charts across two columnsdirectLabelrendering — labels now actually render via new"text"annotation typegapStrategyfixes —"break"correctly splits lines at null boundaries;"interpolate"no longer coerces null to 0
Fixed
- PNG export now composites canvas + SVG layers (previously captured only axes)
directLabelannotations no longer silently droppedgapStrategy="break"no longer draws lines through gapscolorBytype mismatch in network/hierarchy charts- Duplicate
amplitudeproperty inStreamOrdinalFrameProps
See CHANGELOG.md for details.
Semiotic v3.0.0
Semiotic v3.0.0
Complete rewrite of Semiotic. Stream-first canvas architecture, 37 HOC chart components, full TypeScript, AI tooling, coordinated views, realtime encoding, and native server-side rendering.
Highlights
- Stream-first rendering — all frames are canvas-first with SVG overlays for labels, axes, and annotations
- 37 HOC chart components — XY (LineChart, Scatterplot, Heatmap, ...), Ordinal (BarChart, BoxPlot, ...), Network (ForceDirectedGraph, SankeyDiagram, ...), Realtime (RealtimeLineChart, ...)
- Full TypeScript strict mode with generic type parameters on all components
- Server-side rendering — component-level SSR (automatic in Next.js/Remix/Astro) + standalone
semiotic/server - Realtime visual encoding — decay, pulse, transition, staleness effects
- Coordinated views — LinkedCharts, CategoryColorProvider, cross-filtering, linked hover/brush
- AI tooling —
semiotic/aischema, MCP server, CLI,validateProps,diagnoseConfig - 9 sub-package entry points —
semiotic,semiotic/xy,semiotic/ordinal,semiotic/network,semiotic/realtime,semiotic/geo,semiotic/ai,semiotic/data,semiotic/server
See CHANGELOG.md for the full list.
Annotation & Brush Bug-Squashing
FIXES
- Updating note props wouldn't cause the note to rerender (thanks @torioLuz!)
- Brushing could return null extent, failing the destructuring default (in the docs even!)
Smarter Tooltips, Clean Up Logging Issues
Minor release (the real work is going on in the semiotic-2 branch) that adds some functionality thanks to @torioLuz and otherwise just cleans up some minor logging bugs
FEATURES
- Outbound tick lines option (@torioLuz could you make a PR to document this on semiotic-docs and/or a codepen or other to show how to use it?)
- Add more tooltip attributes to improve tooltip behavior (@torioLuz could you make a PR to document this on semiotic-docs and/or a codepen or other to show how to use it?)
FIXES
- Remove console log from OrdinalFrame
React 16.8+ Compatibility
Semiotic 2.0 deprecates a lot of old compatibility props, removes the download button and gets rid of deprecated lifecycle events. It should also (hopefully) take advantage of some of the newer React features. Please take a look and file any issues you discover.
DownloadButtonis gone. It provided some convenience and much hassle and my philosophy on how to handle exporting data is that it should be a case-by-case feature handled outside of the dataviz framework.- Since everyone didn't always want to render with sketchy rendering it's optional now, so to enable sketchy rendering you will need to import Rough or a Rough-like library and pass it to your frame using the
sketchyRenderingEngineprop. So something like:
import roughjs from "roughjs/dist/rough.es5.umd.js"
<XYFrame
sketchyRenderingEngine={roughjs}
/>
- Old names for props (like
areasin XYFrame which was replaced bysummaries) are no longer honored. react15Wrapperis removed from FacetController since React 15 is no longer supportedwordcloudhas been removed fromNetworkFrameit was never a very good word cloud
Other changes should be coming. If you have any suggestions just let me know. Bugfixes to 1.X will, of course, continue.