Before writing a plugin, check whether a render-only
override or an
existing geom composed differently gets you there. A new geom is the right
tool for a genuinely new shape, not a restyle of an existing one.
One array, both halves
Everything you add is registered through a singleplugins array. Passing it once seeds two things at once — what you can write (the typed builder methods) and what can compile and render — so the authoring surface and the runtime can never drift apart.
Two entry points
The ergonomic one. Returns the typed builder (
geom / stat / transform /
scale / coord / createSpec / pipe) and a GraphProvider already
bound to the same plugins. Reach for this in a React app.The primitives
createGraphyKit wraps. Use createGraphyBuilder({ plugins }) for the headless authoring surface and
pass the same array to <GraphProvider plugins={...}>. Choose this for framework-agnostic or advanced wiring.plugins array. The kit is pure sugar — it calls createGraphyBuilder and pre-binds a provider, nothing more.
What you can add
A geom has two halves because it both places observations (compile) and paints them (render). Stats and transforms only touch data, so they’re compile-only — no renderer.
Slots
Replace a region’s render — no plugin, no geom.
Custom geoms
Define a new shape with
Geom — position roles, aesthetics, and the compile
step.Geom renderers
defineGeomRenderer, render-only overrides, hit-testing, and hover.Custom stats
A layer-scoped data reshaping that runs before mapping.
Custom transforms
Reshape the dataset before it becomes a layer.
Related
- How a chart is built — the pipeline your plugin joins
- Rendering — the renderer that hosts slots and geom renderers

