chartgpu
v0.2.0
Published
High-performance WebGPU charting library
Maintainers
Readme
ChartGPU is a TypeScript charting library built on WebGPU for smooth, interactive rendering—especially when you have lots of data.
Highlights
- 🚀 WebGPU-accelerated rendering for high FPS with large datasets
- 📈 Multiple series types: line, area, bar, scatter, pie, candlestick
- 🌡️ Scatter density/heatmap mode (
mode: 'density') for large point clouds — seedocs/api/options.md#scatterseriesconfigandexamples/scatter-density-1m/ - 📍 Annotation overlays: reference lines (horizontal/vertical), point markers, and text labels — see
docs/api/options.md#annotationsandexamples/annotations/ - 🧭 Built-in interaction: hover highlight, tooltip, crosshair
- 🔁 Streaming updates via
appendData(...)(cartesian series) - 🔍 X-axis zoom (inside gestures + optional slider UI)
- 🎛️ Theme presets (
'dark' | 'light') and custom theme support
Architecture
At a high level, ChartGPU.create(...) owns the canvas + WebGPU lifecycle, and delegates render orchestration (layout/scales/data upload/render passes + internal overlays) to the render coordinator. For deeper internal notes, see docs/api/INTERNALS.md (especially “Render coordinator”).
flowchart TB
UserApp["Consumer app"] --> PublicAPI["src/index.ts (Public API exports)"]
PublicAPI --> ChartCreate["ChartGPU.create(container, options)"]
PublicAPI --> SyncAPI["connectCharts(charts)"]
subgraph MainThread["🔷 MAIN THREAD RENDERING (Default)"]
subgraph ChartInstance["Chart instance (src/ChartGPU.ts)"]
ChartCreate --> SupportCheck["checkWebGPUSupport()"]
ChartCreate --> Canvas["Create canvas + mount into container"]
ChartCreate --> Options["resolveOptionsForChart(options)<br/>(adds bottom reserve when slider present)"]
ChartCreate --> GPUInit["GPUContext.create(canvas)"]
ChartCreate --> Coordinator["createRenderCoordinator(gpuContext, resolvedOptions)"]
ChartCreate --> InstanceAPI["ChartGPUInstance APIs"]
InstanceAPI --> RequestRender["requestAnimationFrame (coalesced)"]
RequestRender --> Coordinator
InstanceAPI --> SetOption["setOption(...)"]
InstanceAPI --> AppendData["appendData(...)"]
InstanceAPI --> Resize["resize()"]
subgraph PublicEvents["Public events + hit-testing (ChartGPU.ts)"]
Canvas --> PointerHandlers["Pointer listeners"]
PointerHandlers --> PublicHitTest["findNearestPoint() / findPieSlice()"]
PointerHandlers --> EmitEvents["emit('click'/'mouseover'/'mouseout')"]
end
DataZoomSlider["dataZoom slider (absolute-positioned DOM overlay)<br/>chart reserves bottom space for x-axis"] --> Coordinator
end
subgraph WebGPUCore["WebGPU core (src/core/GPUContext.ts)"]
GPUInit --> AdapterDevice["navigator.gpu.requestAdapter/device"]
GPUInit --> CanvasConfig["canvasContext.configure(format)"]
end
subgraph RenderCoordinatorLayer["Render coordinator (src/core/createRenderCoordinator.ts)"]
Coordinator --> Layout["GridArea layout"]
Coordinator --> Scales["xScale/yScale (clip space for render)"]
Coordinator --> DataUpload["createDataStore(device) (GPU buffer upload/caching)"]
Coordinator --> DensityCompute["Encode + submit compute pass<br/>(scatter density mode)"]
DensityCompute --> RenderPass["Encode + submit render pass"]
subgraph InternalOverlays["Internal interaction overlays (coordinator)"]
Coordinator --> Events["createEventManager(canvas, gridArea)"]
Events --> OverlayHitTest["hover/tooltip hit-testing"]
Events --> InteractionX["interaction-x state (crosshair)"]
Coordinator --> OverlaysDOM["DOM overlays: legend / tooltip / text labels / annotation labels"]
end
end
end
subgraph Renderers["GPU renderers (src/renderers/*)"]
RenderPass --> GridR["Grid"]
RenderPass --> AreaR["Area"]
RenderPass --> BarR["Bar"]
RenderPass --> ScatterR["Scatter"]
RenderPass --> ScatterDensityR["Scatter density/heatmap"]
RenderPass --> LineR["Line"]
RenderPass --> PieR["Pie"]
RenderPass --> CandlestickR["Candlestick"]
RenderPass --> ReferenceLineR["Reference lines"]
RenderPass --> AnnotationMarkerR["Annotation markers"]
RenderPass --> CrosshairR["Crosshair overlay"]
RenderPass --> HighlightR["Hover highlight overlay"]
RenderPass --> AxisR["Axes/ticks"]
end
subgraph Shaders["WGSL shaders (src/shaders/*)"]
GridR --> gridWGSL["grid.wgsl"]
AreaR --> areaWGSL["area.wgsl"]
BarR --> barWGSL["bar.wgsl"]
ScatterR --> scatterWGSL["scatter.wgsl"]
ScatterDensityR --> scatterDensityBinningWGSL["scatterDensityBinning.wgsl"]
ScatterDensityR --> scatterDensityColormapWGSL["scatterDensityColormap.wgsl"]
LineR --> lineWGSL["line.wgsl"]
PieR --> pieWGSL["pie.wgsl"]
CandlestickR --> candlestickWGSL["candlestick.wgsl"]
ReferenceLineR --> referenceLineWGSL["referenceLine.wgsl"]
AnnotationMarkerR --> annotationMarkerWGSL["annotationMarker.wgsl"]
CrosshairR --> crosshairWGSL["crosshair.wgsl"]
HighlightR --> highlightWGSL["highlight.wgsl"]
end
subgraph ChartSync["Chart sync (src/interaction/createChartSync.ts)"]
SyncAPI --> ListenX["listen: 'crosshairMove'"]
SyncAPI --> DriveX["setCrosshairX(...) on peers"]
end
InteractionX --> ListenX
DriveX --> InstanceAPIDemo

Candlestick Charts
Financial OHLC (open-high-low-close) candlestick rendering with classic/hollow style toggle and color customization. The live streaming demo renders 5 million candlesticks at over 100 FPS with real-time updates.

Scatter Density (1M points)
GPU-binned density/heatmap mode for scatter plots (mode: 'density') to reveal structure in overplotted point clouds. See docs/api/options.md#scatterseriesconfig and the demo in examples/scatter-density-1m/.

10M points (benchmark)
10,000,000 points rendered at ~120 FPS (benchmark mode).

Quick start
import { ChartGPU } from 'chartgpu';
const container = document.getElementById('chart')!;
await ChartGPU.create(container, {
series: [{ type: 'line', data: [[0, 1], [1, 3], [2, 2]] }],
});Annotations
Add reference lines, point markers, and text overlays to highlight important data features:
await ChartGPU.create(container, {
series: [{ type: 'line', data: [[0, 1], [1, 3], [2, 2]] }],
annotations: [
// Horizontal reference line
{
id: 'ref-y',
type: 'lineY',
y: 2.5,
layer: 'belowSeries',
style: { color: '#ffd166', lineWidth: 2, lineDash: [8, 6], opacity: 0.95 },
label: { text: 'threshold' },
},
// Point marker at peak
{
id: 'peak',
type: 'point',
x: 1,
y: 3,
layer: 'aboveSeries',
marker: { symbol: 'circle', size: 8, style: { color: '#ff4ab0' } },
label: { template: 'peak={y}', decimals: 2 },
},
],
});See Annotations Documentation and the annotations example.
Installation
npm install chartgpu
React Integration
React bindings are available via chartgpu-react:
npm install chartgpu-reactimport { ChartGPUChart } from 'chartgpu-react';
function MyChart() {
return (
<ChartGPUChart
options={{
series: [{ type: 'line', data: [[0, 1], [1, 3], [2, 2]] }],
}}
/>
);
}See the chartgpu-react repository for full documentation and examples.
Browser support (WebGPU required)
- Chrome 113+ or Edge 113+ (WebGPU enabled by default)
- Safari 18+ (WebGPU enabled by default)
- Firefox: not supported (WebGPU support in development)
Documentation
- Full documentation: Getting Started
- API reference:
docs/api/README.md
Examples
- Browse examples:
examples/ - Run locally:
npm installnpm run dev(openshttp://localhost:5176/examples/)
Contributing
See CONTRIBUTING.md.
License
MIT — see LICENSE.
