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:

  1. Define a parameter spec — what varies across editions
  2. Write a scene function — turns parameters into a scene
  3. Render a batch with metadata and optional manifests
  4. 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.png through edition-49.png
  • editions/metadata.edn — parameters and traits for every edition
  • editions/edition-0.edn through edition-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]})
Rendered output

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.