Companies // Open-source library
Bertha's Charts
Rust is the language systems people reach for when correctness and performance both matter, and its charting ecosystem never caught up. The mature option renders static images and is no longer actively developed. Everything interactive is a wrapper — a Rust API over a JavaScript engine that does the actual drawing. If you build for the web in Rust, or you want chart performance that JavaScript cannot give you, there is no incumbent to buy from. There is a gap.
The kernel
Bertha Charts is a WebGL chart kernel built in Rust from scratch. The core is framework-agnostic — scales, coordinate systems, a scene graph, and a lazily memoized transform DAG, with no rendering and no bindings in it. A wgpu renderer targets WebGL2 in the browser and native surfaces elsewhere. Text and axes live in a DOM overlay where type belongs, never rasterized into the canvas. On top of one kernel sit two first-class surfaces: Rust-native Leptos bindings and a React package that owns canvas lifecycle, WASM initialization, and resize handling.
What ships today
- Chart specs: bar, line, area, scatter, heatmap, sparkline — each with axes, tooltips, legends, labels, and snap targets built in.
- Network charts: sankey first, with force-directed, chord, and tree layouts behind it.
- Domain crates for transforms, statistics, and geo, opt-in behind feature flags.
- Incubating crates — annotations, distribution marks, finance indicators — kept private until their APIs earn publication.
The code is public: the repository on GitHub, a live gallery, berthacharts on crates.io, and @berthacharts/react on npm.
Limits and honest notes
This is a v0.0.x pre-release, and it reads like one on purpose. The public traits are not yet a stability contract, the chart specs still carry more opinion than a general-purpose library should, and the performance story — the reason a GPU kernel in Rust deserves to exist — has not been benchmarked in public yet. That is the roadmap, in order: composability over canned charts, a zero-copy data path across the WASM boundary, and published numbers against the JavaScript incumbents. The record gets revised as the results come in.