Ripl: One Scene API for Canvas, SVG, Terminal, and WebGPU
Ripl provides a unified, cross-platform API for 2D and 3D graphics rendering with a focus on high performance and interactive data visualization. Write once, render to Canvas, SVG, WebGPU, or the terminal - in the browser, on the server, or in a headless environment.
At a glance
- What is it?
- Ripl is a zero-dependency TypeScript library that renders the same 2D or 3D scene to Canvas, SVG, terminal, or WebGPU with a DOM-like API. It targets interactive data visualization but carries trade-offs in maturity and backend parity.
- Who is it for?
- Adopt Ripl if you need one codebase for interactive charts that must run in the browser, on a Node server, or in a terminal, and you accept the risk of a young project with a fast release cadence. Do not choose it for production 3D work where WebGL maturity or extensive community support is critical.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 61 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on November 13, 2026, and from our analysis. They are not legal advice.
Star history
- andrewcourtice/ripl328 ★ · +4
| Repository | 2026-08-04 | 2026-11-13 |
|---|---|---|
| andrewcourtice/ripl | 324 | 328 |
4 Stars in the last 101 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The Problem: Canvas and SVG Force an Early Choice
The README states the core problem plainly: the Canvas API is low-level with no concept of objects, hierarchy, or events, while SVG is easier to reason about but has its own performance limits and API differences. Projects usually commit to one at the outset. Ripl removes that decision by exposing one API over both, modelled on the DOM and CSSOM. This is for engineers building interactive data visualizations who want to write a scene once and render it to Canvas, SVG, a terminal, or a Node process. The promise is that switching contexts is a one-line change. That is the central value proposition, and it is ambitious. The cost is that you must trust a library that is still very young, with a v1.0.0 released only weeks before the latest v1.3.0.
Architecture: A Hoisted Scenegraph with O(n) Rendering
Ripl is a Yarn 4 monorepo with packages for core, canvas, svg, charts, 3d, webgpu, terminal, node, and devtools. The core package contains elements, scene, renderer, animation, scales, math, color, interpolation, gradients, and tasks. The rendering contexts are separate packages: @ripl/canvas, @ripl/svg, @ripl/terminal, and @ripl/webgpu. The README mentions a hoisted scenegraph and O(n) rendering, which suggests the scene is stored in a flat structure rather than a deep tree, likely to speed up traversal. Visual properties cascade through the element tree, much like CSS. The renderer manages an automatic requestAnimationFrame loop. This architecture is what allows the same scene to be rendered by different backends. The DOM-like event system supports bubbling, delegation, stop propagation, and disposable subscriptions. That is a concrete mechanism, not just a marketing phrase.
Getting Started: Real Commands and Config Keys
The README does not provide installation commands, but the package structure implies a typical npm/Yarn workflow. You would install @ripl/web for browser usage, as it re-exports core plus the canvas context with browser platform bindings. For a headless Node environment, you would use @ripl/node. That is a notable gap: the README lists features but no usage snippet. Based on the DOM-like model, you likely create a scene, add elements, and then attach a renderer to a context. The one-line context switch is the core claim, but without a code sample, you cannot confirm the exact syntax. You would need to consult the package documentation or the source in the repository.
Feature Surface: Charts, 3D, and Interactivity
Ripl ships 25 pre-built chart types via @ripl/charts, including line, bar, scatter, candlestick, heatmap, treemap, sankey, chord, and force-directed. That is a wide net. It also includes 14 scale types inspired by D3, such as ordinal, band, diverging, log, quantile, and time. For 3D, there are 9 shapes, 5 light types, Blinn-Phong materials, textures, raycasting, and fog. The 3D backends are Canvas and WebGPU, with the WebGPU backend using WGSL shaders and hardware depth testing. The interactive navigator provides pan, zoom, and brush gestures on any context, which is the flat-scene analogue of a 3D camera. This is a substantial feature list. The risk is that breadth can hide shallow implementation. The README claims the Canvas and WebGPU backends sample textures the same way and resolve fog term for term, which is a strong parity claim. You should verify that parity with your own tests, especially for the terminal backend, which cannot do gradients or shadows.
Limitations and Failure Modes
The most obvious limitation is that the terminal context renders braille and ANSI truecolor. That means it cannot reproduce gradients, shadows, blend modes, or 3D shading as the Canvas or WebGPU backends do. The README does not state this explicitly, but it is an inherent constraint of the medium. The documentation does not mention WebGL at all, so if you need WebGL for 3D, Ripl is the wrong tool. Another limitation is the project's age: v1.0.0 was released on 2026-07-23, and v1.3.0 came on 2026-08-11, less than three weeks later. That rapid release cadence suggests the API may still be shifting. The README also does not provide any benchmarks or performance numbers, so the O(n) claim is unverified. If you need to render tens of thousands of elements, you cannot assume Ripl will meet your performance targets without testing.
Alternatives: D3 and Scene.js Take Different Approaches
D3 is the most direct alternative for data visualization. D3 does not provide a unified rendering API; it manipulates the DOM directly for SVG and uses Canvas with imperative drawing. With D3, you write different code for SVG and Canvas, which is exactly the problem Ripl solves. But D3 has a mature ecosystem and a decade of community knowledge. Another alternative is Scene.js, which is a JavaScript library for SVG, CSS, and Canvas animation. Scene.js focuses on animation timelines and keyframes, not on a unified scenegraph across backends. It also requires you to choose the rendering target per scene. Ripl's approach is more like a DOM abstraction layer that sits above multiple backends. The trade-off is that D3 gives you fine-grained control and a huge ecosystem, while Ripl gives you portability at the cost of a smaller community and a younger codebase.
Maintenance, Licensing, and Upgrade Cost
Ripl is MIT licensed, which means you can use it in commercial projects without paying royalties, but the license does not include warranty or support. The project is actively maintained, with the last push on 2026-08-11 and three releases in less than a month. That activity is a double-edged sword: it means bugs are fixed quickly, but it also means the API may change between minor versions. The README does not include a migration guide or a changelog, so upgrading from v1.0.0 to v1.3.0 could require manual adjustments. The zero-dependency claim is a maintenance advantage: you do not need to track transitive dependencies. However, the monorepo structure with 12 packages means you must understand which packages to include. Tree-shaking is promised, but you should verify that your bundler can drop unused contexts, especially if you only need the terminal backend.
Editorial conclusion
Adopt Ripl if you need one codebase for interactive charts that must run in the browser, on a Node server, or in a terminal, and you accept the risk of a young project with a fast release cadence. Do not choose it for production 3D work where WebGL maturity or extensive community support is critical. Before committing, verify that the specific chart types and 3D features you need are fully implemented in the backend you target, and check the changelog between v1.0.0 and v1.3.0 for breaking changes. Confirm that the zero-dependency promise holds for your bundler and that tree-shaking works as documented.
Frequently asked questions
What rendering targets does andrewcourtice/ripl support?
Canvas, SVG, a terminal rendering context that outputs braille characters and ANSI truecolor, and a Node process for headless use. For 3D there are two backends, one on Canvas and one on WebGPU with hardware depth testing and WGSL shaders, plus WebGPU-accelerated 3D as its own package.
Does ripl have any runtime dependencies?
No. The feature list ends with zero runtime dependencies, and the root manifest has no dependencies field at all. The twenty entries in its devDependencies are tooling: Lerna, Vitest, TypeScript, ESLint with its Vue and markdown plugins, Playwright, tsdown, publint and the Are the Types Wrong core.
How do I use ripl with Vue 3?
Three adapter packages exist. @ripl/vue provides declarative Vue 3 components and compositions over the core 2D surface, @ripl/vue-3d covers the 3D context with its shapes, camera and lights, and @ripl/vue-charts provides components for all 25 chart types.
What does the ripl terminal backend actually output?
Braille characters with ANSI truecolor, from its own terminal package. It is a rendering context in the same sense as Canvas and SVG rather than a separate text utility, which is what lets the same scene compile to a log line.
How is ripl published if the root version is 1.0.0?
The root manifest is a private workspace named ripl-workspace whose version stays at 1.0.0. The publish script builds every workspace and then publishes from each package's own declared version, while the release tags carry their own line at v1.2.0, v1.3.0 and v1.4.0.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/andrewcourtice-ripl)Star history chart for your README
[](https://hysenlabs.com/projects/andrewcourtice-ripl)Was this useful?