TanStack Charts 0.6.4 is a pre-alpha release. Its API may change between releases.
TanStack Charts is a small, framework-agnostic chart grammar for TypeScript and JavaScript. Give each mark its natural data, map fields or accessors to visual channels, and use compact scales to define common numeric and categorical axes. TanStack Charts compiles that declaration into a responsive, keyed scene and renders accessible SVG by default, with Canvas available as an opt-in surface.
TanStack Charts builds on the grammar-of-graphics tradition established by Leland Wilkinson and developed through projects such as ggplot2, Vega-Lite, and Observable Plot. Observable Plot is the closest API influence for mark-local data, channels, and layered composition. TanStack Charts applies those ideas to typed application infrastructure with explicit scale and algorithm boundaries, responsive scene compilation, and framework lifecycle.
The library is designed for two equally important authors:
The same definition can feed the vanilla DOM host and framework adapters. React and Octane also provide optional Canvas entries; the experimental React Native adapter consumes definitions from the universal entry.
import { areaY, defineChart, lineY } from '@tanstack/charts'
import { scaleLinear } from '@tanstack/charts-scales/linear'
interface ClosingPrice {
day: number
Close: number
}
const observations: readonly ClosingPrice[] = [
{ day: 1, Close: 64.96 },
{ day: 2, Close: 63.41 },
{ day: 3, Close: 61.26 },
{ day: 4, Close: 62.08 },
{ day: 5, Close: 61.89 },
{ day: 6, Close: 63.28 },
{ day: 7, Close: 62.81 },
{ day: 8, Close: 63.05 },
]
const rows = observations.flatMap((row, index) => {
if (index < 2) return []
const window = observations.slice(index - 2, index + 1)
const average =
window.reduce((total, observation) => total + observation.Close, 0) /
window.length
return [{ ...row, average }]
})
const closingPriceChart = defineChart({
marks: [
areaY(rows, {
x: 'day',
y1: 'average',
y2: 'Close',
fill: '#2563eb',
fillOpacity: 0.18,
}),
lineY(rows, {
x: 'day',
y: 'Close',
stroke: '#2563eb',
}),
lineY(rows, {
x: 'day',
y: 'average',
stroke: '#64748b',
}),
],
x: {
scale: scaleLinear,
nice: true,
axis: { label: 'Trading day' },
},
y: {
scale: scaleLinear,
nice: true,
grid: true,
axis: { label: 'Close (USD)' },
},
})The rolling average is an ordinary, visible data transform. Both axes use the compact numeric scale, and their factories infer domains from the materialized channels. When the horizontal values become real calendar dates, replace only the x scale with D3's scaleUtc; the compact y scale and chart definition stay unchanged. Scales defines that upgrade boundary.
TanStack Charts owns the parts that make a declarative chart reliable inside an application:
TanStack Charts keeps data preparation explicit and spatial algorithms outside the rendering runtime.
| Responsibility | Owner |
|---|---|
| Common numeric and categorical scale mappings | @tanstack/charts-scales |
| Common group, bin, window, normalize, select, and row-stack transforms | TanStack's eager data-transform helpers |
| Temporal, nonlinear, piecewise, spatial, and other specialized algorithms | Your application using only the granular D3 modules needed |
| Fetching, cleaning, profiling, and exploratory analysis | Your data layer, server, or AI workflow |
| Mark-channel domain inference, responsive ranges, guide layout, scenes, rendering, and chart lifecycle | TanStack Charts |
| Page controls, queries, filters, persistence, memoization, and application state | Your application |
Prepared data can come from TanStack transforms, D3, SQL, a server, or ordinary TypeScript; marks consume it without requiring a special series container.
The normal path is intentionally short:
Every automatic behavior has an explicit escape hatch. The Guides cover those controls by task rather than repeating the API reference.
| Package | Use it for |
|---|---|
| @tanstack/charts | Definitions, marks, scenes, SVG, Canvas, export, and vanilla DOM |
| @tanstack/charts-scales | Compact linear, band, point, and ordinal scales |
| @tanstack/react-charts | React <Chart> |
| @tanstack/react-native-charts | Experimental React Native SVG <Chart> |
| @tanstack/preact-charts | Preact <Chart> |
| @tanstack/vue-charts | Vue <Chart> |
| @tanstack/solid-charts | Solid <Chart> |
| @tanstack/svelte-charts | Svelte <Chart> |
| @tanstack/angular-charts | Angular <tanstack-chart> |
| @tanstack/lit-charts | Lit <tanstack-chart> |
| @tanstack/alpine-charts | Alpine x-chart |
| @tanstack/octane-charts | Octane <Chart> |
All packages are ESM and tree-shakeable. Built-in marks and optional capabilities also have subpath exports when a library or design system needs tighter bundle boundaries.