# Generators

URL: /docs/generators

The built-in asset types and how to choose between them.

Every asset names a `generator`. Options come from `settings.defaults["<id>"]` merged beneath
the asset's own `options` (the asset wins). Each generator validates its own option shape.

| Generator                                       | Output                  | Needs `url`? | Key options                                                                                                                 |
| ----------------------------------------------- | ----------------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------- |
| [`scroll-reel`](/docs/generators/scroll-reel)   | mp4 (+ gif/webp/poster) | Yes          | `width`/`height`/`fps`/`durationMs`, `choreography`, `autoSections`, `loop`, `colorScheme`/`viewports`, `aspect`, `outputs` |
| [`interaction`](/docs/generators/interaction)   | mp4                     | Yes          | `actions[]`, `cursor`, `focus`                                                                                              |
| [`screenshots`](/docs/generators/screenshots)   | png / jpeg              | Yes          | `viewports[]`, `fullPage`, `format`, `elements[]`, `deviceScaleFactor`                                                      |
| [`wall`](/docs/generators/wall)                 | mp4                     | No           | `columns[]` (tiles by name or `{ src }` + per-column motion), `pulses`, `loops`, `pan`, `gap`/`tileAspect`, `preview`       |
| [`specimen`](/docs/generators/specimen)         | mp4                     | No           | `font`, `template`, `pulses`, `colors`, `seed`                                                                              |
| [`icons`](/docs/generators/icons)               | mp4 / png               | No           | `icons`/`dir`, `template`, `steps` (order/stagger sweeps), `layout`, `base`/`accent`, `output.format`                       |
| [`palette`](/docs/generators/palette)           | png                     | No           | `colors[]`, `layout`, corner fields                                                                                         |
| [`palette-reel`](/docs/generators/palette-reel) | mp4                     | No           | `colors[]`, `details`, timing                                                                                               |

## URL-based vs local generators

- **URL-based** (`scroll-reel`, `interaction`, `screenshots`) capture a live page, so the asset
  needs a `url` (and a running site or a [managed server](/docs/configuration#managed-server)).
  With a managed server, an omitted `url` defaults to the server root.
- **Local** (`wall`, `specimen`, `icons`, `palette`, `palette-reel`) render from a font file, a
  colour list, an icon set, or other assets — no `url` required. A `wall` composites the assets its
  columns name (deriving its dependencies from them) plus local files via `{ src }` tiles; `icons`
  renders a grid of local icon files.

## Video fidelity

The video generators capture **frame-stepped** by default: a virtual clock is driven, each
frame is screenshotted, and frames are piped to ffmpeg — so output is frame-accurate,
supersampled by `deviceScaleFactor`, parallelised across `workers`, and byte-identical
run-to-run. The one deliberate exception is the
[interaction](/docs/generators/interaction) generator, which always records **realtime** —
scripted interactions, time-based hero animations, and autoplay video are inherently live.
(`wall` also offers `capture: "realtime"` as a fast iteration mode.)
