Long-Form Editions
Overview
A long-form edition series is one algorithm that produces many unique outputs — each driven by a deterministic seed. The same seed always produces the same image. This is the workflow behind Art Blocks, fxhash, and numbered print editions.
Eido provides this pipeline:
- Define a parameter spec — what varies across editions
- Write a scene function — turns parameters into a scene
- Render a batch with metadata and optional manifests
- Analyze trait distribution across the series
Parameter Specs
A parameter spec defines what varies across editions using data-driven distributions:
(def spec
{:hue {:type :uniform :lo 0.0 :hi 360.0}
:density {:type :gaussian :mean 20.0 :sd 5.0}
:palette {:type :choice :options [:sunset :ocean :forest]}
:bold? {:type :boolean :probability 0.3}
:weight {:type :weighted-choice
:options [:light :medium :heavy]
:weights [0.5 0.35 0.15]}})Each edition samples from these distributions using a deterministic seed derived from the master seed + edition number. Distribution types: :uniform, :gaussian, :choice, :weighted-choice, :boolean, :pareto, :triangular, :eased.
Scene Function
The scene function takes sampled parameters and an edition number, and returns a scene map:
(defn make-scene [params edition]
{:image/size [800 800]
:image/background [:color/hsl (:hue params) 0.1 0.95]
:image/nodes
[(build-artwork params)]})This is where your creative algorithm lives. The parameters control variation; the algorithm defines the visual language.
Batch Rendering
(require '[eido.gen.series :as series])
(series/render-editions
{:spec spec
:master-seed 42
:start 0
:end 50
:scene-fn make-scene
:output-dir "editions/"
:format :png
:render-opts {:scale 2}
:traits {:density [[15 "sparse"] [25 "medium"] [100 "dense"]]}
:emit-manifest? true})This renders 50 editions, writing:
editions/edition-0.pngthroughedition-49.pngeditions/metadata.edn— parameters and traits for every editioneditions/edition-0.ednthroughedition-49.edn— per-edition manifests (with:emit-manifest? true)
Each manifest contains the full scene map, seed, parameters, and Eido version — everything needed to reproduce that exact output.
Complete Package
For a full archival package — images, manifests, and a contact sheet in one call — use export-edition-package:
(series/export-edition-package
{:spec spec
:master-seed 42
:start 0
:end 50
:scene-fn make-scene
:output-dir "editions/"
:contact-cols 10
:thumb-size [160 160]})
This produces everything render-editions does (with manifests enabled), plus a contact-sheet.png — a grid of thumbnails useful for proofing, exhibition planning, and social media.
Trait Analysis
Traits categorize continuous parameters into named labels for metadata and marketplace display:
(series/trait-summary
{:spec spec :master-seed 42
:start 0 :end 100
:traits {:density [[15 "sparse"] [25 "medium"] [100 "dense"]]
:palette identity}})Returns frequency counts — how many editions fall into each trait bucket. Useful for verifying that your parameter spec produces a good distribution.
Reproducibility
Every render can produce a manifest — a machine-readable EDN sidecar file:
;; Re-render from a manifest
(eido/render-from-manifest "editions/edition-42.edn")
;; Or re-render to a different format
(eido/render-from-manifest "editions/edition-42.edn"
{:output "edition-42-print.tiff" :dpi 300})The manifest stores the complete scene map — the same data you'd pass to render. This is the primary reproduction mechanism. The Eido version is recorded for diagnostics, but the scene map alone is usually sufficient.