@moritzbrantner/viz-engine
v0.3.0
Published
Experimental renderer-agnostic visualization engine backed by JavaScript fallbacks and Rust/WASM kernels for XY, geo, finance, and table data.
Readme
@moritzbrantner/viz-engine
Experimental renderer-agnostic visualization engine backed by JavaScript fallbacks and Rust/WASM kernels for XY, geo, finance, and table data.
createVizEngine lets multiple chart layers share datasets and indexes, then
returns a render frame that SVG, Canvas, WebGL, React components, workers, or
server renderers can consume.
import { createVizEngine } from "@moritzbrantner/viz-engine/core";
const engine = createVizEngine({ backend: "auto" });
const datasetId = engine.addDataset({ kind: "xy", points });
engine.addLayer({
datasetId,
kind: "binned-series",
targetBinCount: 120,
valueMode: "average",
});
const frame = engine.computeFrame({
viewport: { height: 320, width: 800, xDomain: [0, 1_440] },
});Typed-array frames are the default for render workloads. Object-shaped frames are still available when debugging or adapting a renderer:
const typedFrame = engine.computeFrame({ viewport });
const objectFrame = engine.computeFrame({ frameFormat: "objects", viewport });
const hydratedFrame = engine.hydrateFrame(typedFrame);Import Paths
| Import path | Use it for |
| ------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| @moritzbrantner/viz-engine/core | Current zero-config embedded core APIs without React. |
| @moritzbrantner/viz-engine/core/embedded | Explicit embedded core alias. |
| @moritzbrantner/viz-engine/core/lazy | Async core API with lazy WASM loading. |
| @moritzbrantner/viz-engine/worker | Worker client and host APIs for off-main-thread frame computation. |
| @moritzbrantner/viz-engine/react | React provider and hooks. |
| @moritzbrantner/viz-engine | Backward-compatible root export. It still includes React bindings during the pre-1.0 transition. |
Docs
- Getting started
- Frame formats
- Table data
- Backends and WASM
- Lazy WASM
- Focused examples
- React bindings
- Worker handoff
- Typed frame migration
- Why this exists
Architecture
- TypeScript owns engine state, backend selection, frame assembly, cache coordination, hit testing, and renderer-facing data shapes.
- Rust crates own reusable computation for data-heavy kernels.
- JavaScript fallbacks preserve the same public contracts.
- Renderers own visuals and consume returned frame layers.
- React hooks coordinate lifecycle and UI state only.
The package boundary is:
moritzbrantner-viz-engine-core: local Rust XY computation
moritzbrantner-viz-engine-wasm: local browser binding for XY computation
finance-data: reusable Rust financial market-data core in rust-packages
finance-statistics: reusable Rust return/risk/statistics crate in rust-packages
@moritzbrantner/viz-engine: TypeScript runtime wrapper
charts/maps/tables/future packages: visualsThe rule is:
Rust crates own computation.
TypeScript owns integration.
charts/maps/tables/future packages own visuals.Development
bun install
bun run check-types
bun run test
bun run build
bun run package:smokeBenchmark commands and caveats live in bench/README.md.
