Architecture
Headless Core
@finchart/core has zero dependencies and no DOM — it computes layout and emits draw commands. The same commands drive browser rendering and let tests inspect what the chart would draw.
- Runs anywhere — Node, workers, tests, SSR, no
jsdomneeded - Test without a browser — assert on draw commands directly, with no screenshot required (testing guide)
- Bring your own renderer —
@finchart/domwires it to a real<canvas>, but that's just one wiring choice
Framework Agnostic
The core doesn't know React exists. @finchart/react is a thin wrapper on top of it, wired the same way @finchart/dom is.
- Use it from TypeScript directly, no framework required
- A wrapper for another framework would sit on the exact same core
Extensions use the core's contracts
Indicators expose computed outputs as data sources, so one calculation can feed another indicator or several series. Drawing tools use the plugin and input-consumer contracts to capture gestures before chart panning. Both ship as separate packages; adding them did not require indicator- or drawing-specific methods in @finchart/core. See custom indicators and drawing tools.
Choose the browser assembly
browserDeps() supplies a ready-to-use renderer, scheduler, and interactions. For a smaller or specialized chart, createPlotDeps accepts the pieces you choose. The bundle guide measures concrete @finchart setups and explains which imports change their size. Those figures are bundle budgets, not performance or size comparisons with other libraries.