An end-to-end Clojure toolkit for generative artists — from REPL sketch to screen, print, and plotter.
Eido is a declarative, data-first library for generative art. You describe images as plain data — maps, vectors, keywords — and render the same scene to whatever medium you're working in: raster PNG, animated GIF or SVG, archival TIFF for print, or motion-stream formats — stroke-only SVG, DXF, GRBL G-code, and HPGL — for pen plotters, CNC, lasers, and CAD.
Eido is an art tool, not a charting library — it was designed around the practice of generative artists, plotter artists, and edition makers. Data visualization is possible, but a dedicated charting library will serve you better there.
Gallery · Docs · API Reference
This project has been on my mind since I discovered Clojure in 2020. As a graphics nerd, describing images as plain data — not issuing drawing commands — felt like the natural thing to build.
The approach is inspired by Christian Johansen's Replicant, which showed how far a minimal, data-first approach to rendering can go. Eido applies that thinking to image generation — 2D shapes, 3D scenes, and animations alike.
- Images are values. A scene is a plain Clojure map — printable, serializable, diffable. Nothing opaque.
- One function.
rendertakes a scene (or a sequence of scenes) and produces output. That's the API. - Description, not instruction. You declare what the image contains; eido decides how to draw it.
- Animations are sequences. 60 frames = 60 maps in a vector. No timeline, no keyframes, no mutation.
- 3D sculpting pipeline. Composable mesh→mesh operations: deform, extrude, subdivide, mirror — all pure data, all chainable via
->. - 2D↔3D bridge. The same field/noise/palette vocabulary works in both dimensions. UV-mapped procedural textures, normal maps, and specular maps connect 2D generative tools to 3D surfaces.
- Non-photorealistic rendering. Hatch and stipple patterns from 2D applied to 3D faces with lighting-driven density.
- Particle simulation. Physics-based effects configured as data — emitters, forces, and lifetime curves.
- Typography as paths. Text compiled to vector paths — compatible with gradients, transforms, 3D extrusion.
- Procedural fills. Noise-driven, field-based, and programmatic fills described entirely as data — no shaders, no GPU.
- Semantic IR. A rich middle layer preserves visual intent — fills, effects, transforms, generators — before lowering to drawing instructions.
- No state, no framework. Every function takes data and returns data. You bring your own workflow.
- Zero dependencies. Just Clojure and the standard library.
If it cannot be represented as plain data, it probably should not be in the library.
See the Getting Started guide on the website.
Requires Clojure 1.12+ and Java 11+.
(require '[eido.core :as eido])
(eido/render
{:image/size [400 400]
:image/background [:color/rgb 245 243 238]
:image/nodes
[{:node/type :shape/circle
:circle/center [200 200]
:circle/radius 120
:style/fill [:color/rgb 200 50 50]}]}
{:output "circle.png"})See the full documentation for shapes, text, colors, gradients, transforms, animation, particles, 3D, and more.
The gallery showcases examples across several categories — 2D scenes, 3D scenes, mixed 2D/3D, particles, typography, and artistic expression — each with source code.
The gallery scenes and the site that renders them live in their own repository: leifericf/eido-site. That repo depends on a tagged release of this library and rebuilds on every push.
clj -X:testBeta — The core API is stabilizing. Breaking changes may still occur between releases, but the fundamentals are in place.





