Skip to content

Nested models

The pieces the models above are built from.

Alphabetical. Each says where it is used.

Art

Artwork a style renders in its own medium: ascii-art prints it in characters, particles fills the screen with it in points. Generated locally from a prompt (or taken from a file), optionally animated into a short loop.

Field Type Default Description
prompt string (optional) null Generate the image locally (Z-Image), e.g. 'a basketball player dribbling, black background'. Plain backgrounds and strong silhouettes read best in characters and points
file string (optional) null Use this image (project file or URL) instead of a prompt
motion string (optional) null Animate it with the video model (needs ComfyUI), e.g. 'dribbles the ball between his legs'. Omit for a still
seconds number 3.0 Length of the animated loop
Constraints: 1 to 8.
size list of 2 integers [1024, 768] Generated image size (the loop keeps its aspect)
Constraints: exactly 2 items.
seed integer 7
frames integer 36 Frames shipped to the page (sampled evenly from the loop)
Constraints: 1 to 96.
width integer 220 Sampling width in pixels of the shipped frames: characters and points are drawn from these
Constraints: 40 to 480.
label string (optional) null Short name shown with the art (defaults to the prompt)
video_model enum (optional) null Video model: ltx (LTX-2.3, the default) or wan (Wan 2.2 A14B: renders at ~1280x720 and 16 fps, retimed to 24; clean, physical motion and first/last-frame control, but no finer detail than LTX after restore, and slower). Unset = the site's video_model, then studio.toml's, then ltx
Allowed values: "ltx", "wan".

Used in: Theme.art.

AtBox

A box on the stage, in fractions of its width and height (0 is the left or top edge, 1 the right or bottom).

Field Type Default Description
x number required Where the box's left edge is, 0-1 across the stage
Constraints: 0 to 1.
y number required Where the box's top edge is, 0-1 down the stage
Constraints: 0 to 1.
w number 0.34 How wide the box is, 0-1 of the stage's width
Constraints: at most 1.
h number (optional) null How tall the box is, 0-1 of the stage's height (default: as tall as its words)
Constraints: at most 1.
align enum "left" How the words line up inside the box
Allowed values: "left", "center", "right".

Used in: Step.at.

AtGrid

A slot on the theme's 12-column grid: the content width between the page's gutters, cut into 12 columns.

Field Type Default Description
grid string required The columns, written as CSS writes them: "9 / span 4" (start at column 9, four columns wide), "1 / 7" (columns 1 to 6) or "5" (column 5 alone)
row enum "middle" Where the slot sits down the stage
Allowed values: "top", "middle", "bottom".
align enum "left" How the words line up inside the slot
Allowed values: "left", "center", "right".

Used in: Step.at.

Badge

A small pill above a headline: 'Brand Voices is here', optionally a link, with a dot or a tag in front.

Field Type Default Description
text string required The words in the pill
href string (optional) null Make the pill a link (an arrow follows the words)
tag string (optional) null A short filled label before the words, e.g. 'New'
icon enum (optional) null A mark before the words: dot (a small accent dot) or spark
Allowed values: "dot", "spark".

Used in: HeroBlock.badge, Step.badge.

Beat

One shot of a story film: a still generated from prompt (or taken from image), brought to life by motion.

Field Type Default Description
id string required
prompt string "" The opening frame, described like a photograph: subject, place, light, lens (not used by a frozen moment)
motion string "" What moves and how the camera moves, e.g. 'the door swings open, the camera pushes in' (not used by a frozen moment)
seconds number 4.0 Length of the shot (1 to 10 generated; a frozen moment may run longer)
Constraints: 1 to 60.
seed integer 7
image string or ImageInput (optional) null Start from this image instead of generating it from prompt: a file, or an image input (generate:, edit: ...)
end_image string or ImageInput (optional) null The clip's last frame (same forms as image): the motion is steered to land on it, e.g. a closed door ending open
strength number 1.0 How tightly the clip holds the start image. Lower it (0.7-0.85) when an action shot freezes on its first frame
Constraints: 0.3 to 1.0.
motion_seed integer (optional) null Seed for the motion only, to re-roll a clip and keep its still
trim number 0.0 Seconds cut from the start of the clip (an action shot that holds its first frame before moving). Re-uses the render: nothing is re-animated
Constraints: at least 0.
fade number (optional) null The join into this beat from the one before, in seconds of crossfade: 0 is a hard cut (a change of angle, a jump to a new moment), more is a longer dissolve. Default: the film's beat_fade. Not used on the first beat, or on a camera beat that continues the one before (that join is always frame-exact)
Constraints: 0 to 2.
video_model enum (optional) null Video model: ltx (LTX-2.3, the default) or wan (Wan 2.2 A14B: renders at ~1280x720 and 16 fps, retimed to 24; clean, physical motion and first/last-frame control, but no finer detail than LTX after restore, and slower). Unset = the site's video_model, then studio.toml's, then ltx. strength applies to ltx only
Allowed values: "ltx", "wan".
locked boolean false Keep this beat's clip (and its storyboard still) as rendered, even when its prompt or motion changes; the rest of the film still builds around it
freeze Freeze (optional) null A frozen moment instead of a generated clip: one frame, upscaled, with a 2.5D camera moving through it, rendered offline in seconds (see Freeze). prompt, motion, image and end_image are not used
camera CameraMove or CameraPreset or enum (optional) null A camera move on this moving beat: a named move (camera: dolly-in, or {move: orbit-left, amount: 0.8}, see CameraPreset) or keys (see CameraMove): camera: {keys: [{t: 0, box: [0,0,1,1]}, {t: 0.5, box: [...]}, ...]}. The crowd keeps moving, the camera does what the move or the keys say. Needs an image (or a prompt to make one); not for a frozen moment
Allowed values: "static", "dolly-in", "dolly-out", "crash-zoom", "dolly-zoom", "orbit-left", "orbit-right", "crane-up", "crane-down", "fpv", "whip-pan", "push-through".
restore integer (optional) null Run SeedVR2 over this beat's clip at this height (e.g. 1088) to clean grain and redraw fine detail, then scale it back to beat_res. Like the section's beat_restore but for one beat, e.g. a camera beat (rendered near 1024 px) next to sharp frozen moments; slow (minutes per second of film)
Constraints: 480 to 2160.
faces Faces (optional) null restore: repair the faces in this beat's clip (GFPGAN), after it is generated. Off by default; or a mapping with strength, min_size, smooth

Used in: FilmScene.beats.

BeatFrame

A frame of a beat of a film: the first or last frame of what that beat renders (after its trim), or the frame at a time. Chain beats with it: a beat whose image is the last frame of the frozen moment before it starts exactly where that moment ends. The beat must come first in the film (or be rendered); build --only renders a frozen moment on the way, a generated beat that is not rendered yet stands in with its start image.

Field Type Default Description
beat string required The id of the beat
at enum or number "last" first, last, or seconds into the beat's clip (after its trim)
Allowed values: "first", "last".
pick enum "last" With at: last, sharpest takes the sharpest of the last few frames instead of the very last one
Allowed values: "last", "sharpest".
section string (optional) null The film section holding the beat (found by the beat id when omitted)

Used in: ImageInput.beat_frame.

Brand

A brand as tokens: what theme.from reads from a web page, a logo or a brand.yaml, or what you write yourself. Missing colours are derived from the ones given with the presets' contrast rules.

Field Type Default Description
mode enum (optional) null light or dark (default: what the colours say)
Allowed values: "light", "dark".
colors map of string to string {} Brand colours as #hex: accent (the main brand colour) and any of accent2, bg, bg2, ink, accent_ink
fonts map of string to string or FontFile {} Brand fonts by role (display, body, mono): a Google Fonts family or {file: ...} of the project's own
radius string (optional) null Corner radius of buttons and cards, e.g. 6px
logo string (optional) null The brand's logo (an image file in the project), shown in the nav when nav.logo is not set
source string (optional) null Where these tokens were read from (written by studio brand)

Used in: Theme.from.

CameraKey

Field Type Default Description
t number required Seconds
at list of 3 numbers required Camera position
Constraints: exactly 3 items.
look list of 3 numbers required Point the camera looks at
Constraints: exactly 3 items.

Used in: Take.camera.

CameraMove

A keyed camera move on a generated (moving) beat: the same keys as a frozen moment's camera, but the people keep walking. The start image is given a depth map, the camera path is flown through it to make a guide video (the moving subjects softened so they stay free), and the video model generates the beat along that guide, so the camera does what the keys say instead of what the prompt hopes.

Field Type Default Description
keys list of FreezeKey required Camera keys over the beat: {t, box, hold} exactly as in a frozen moment (freeze.camera). The camera rests on the first box until its t and on the last after its t
Constraints: at least 1 items.
ease enum "inOutSine" How the camera travels between boxes (as freeze.ease; flow keeps moving through keys)
Allowed values: "linear", "inOutSine", "inOutQuad", "inOutCubic", "inOutQuart", "smoother", "flow".
backend enum "auto" What generates the beat along the guide: ltx (LTX-2.3 IC-LoRA depth control, the depth guide a take uses), wan (Wan 2.2 Fun Control, the guide as the control video) or uni3c (Wan Uni3C camera controlnet; needs a model file that is not installed by default). auto: the one measured to follow the keys best (see docs/ENGINE.md)
Allowed values: "auto", "ltx", "wan", "uni3c".
subjects string "the people" Who is free to move, as you would say it to a person (found by Florence-2, cut out by SAM 2.1). The guide fixes the camera and the static world and only hints at where these are. Empty: nothing is freed (the guide pins everything, people included)
soften number 0.045 How far the subjects are softened in the guide, as a share of the frame width (a Gaussian blur of their own depth). 0 keeps their exact depth, which pins their silhouettes too (they only slide with the camera); larger frees them more but tells the model less about where they are
Constraints: 0 to 0.3.
guide_strength number 1.0 How strongly the guide steers the model (LTX: the IC-LoRA guide strength; Wan: Fun Control has no scale, so this is the Uni3C strength)
Constraints: 0 to 2.
parallax number 0.5 Depth effect of the guide's camera (as freeze.parallax): near things shift against far ones as the camera moves, so the model sees a real camera move
Constraints: 0 to 2.
dolly number (optional) null Extra push-in of near things (default follows parallax)
Constraints: 0 to 3.
continues boolean false Carry the previous beat's camera across the cut: this beat's camera starts where the previous camera beat ended, with the speed it ended at (no ease to a stop at the boundary), and it starts on that beat's last frame, graded to match
res list of 2 integers (optional) null Size the video model runs at (the frames are scaled to beat_res; ltx: multiples of 64, wan/uni3c: multiples of 16). Default: ltx about 1024x576 (more pixels let the subjects drift in tests; beat_restore adds the detail back), wan ~1280x720
Constraints: exactly 2 items.
anchor number 0.6 ltx: how firmly the pure-camera render of the start image (the picture flown along the keys) is pinned as keyframes along the way, once a second and at the end. It keeps what things look like and sharpens close-ups (in tests: Laplacian variance 48-63 against 29-48 without, 66 in the pure render) and tightens the camera (0.8% against 1.3% zoom error). 0 = only the first frame is pinned
Constraints: 0 to 1.
match number (optional) null How far the generated frames are pulled back toward the base plate's tone and grain (the start image of the first beat of the chain, flown along the same camera): a video model drifts in contrast, haze and grain from clip to clip, and a cut shows it. 0 = off. Default: 0.7 for a beat in a chain of continues beats, else off
Constraints: 0 to 1.
seed integer (optional) null Seed for the generation (default: the beat's motion_seed, then seed)

Used in: Beat.camera.

CameraPreset

A named camera move on a generated beat: camera: dolly-in, or camera: {move: orbit-left, amount: 0.8, at: [0.4, 0.5]}. Everything a keyed move takes (backend, subjects, soften, guide_strength, res, anchor, match, seed) applies; the camera path comes from the move instead of keys.

Field Type Default Description
keys list of FreezeKey [] Not used by a named move (its path is the move's): leave it out
ease enum "inOutSine" How the camera travels between boxes (as freeze.ease; flow keeps moving through keys)
Allowed values: "linear", "inOutSine", "inOutQuad", "inOutCubic", "inOutQuart", "smoother", "flow".
backend enum "auto" What generates the beat along the guide: ltx (LTX-2.3 IC-LoRA depth control, the depth guide a take uses), wan (Wan 2.2 Fun Control, the guide as the control video) or uni3c (Wan Uni3C camera controlnet; needs a model file that is not installed by default). auto: the one measured to follow the keys best (see docs/ENGINE.md)
Allowed values: "auto", "ltx", "wan", "uni3c".
subjects string "the people" Who is free to move, as you would say it to a person (found by Florence-2, cut out by SAM 2.1). The guide fixes the camera and the static world and only hints at where these are. Empty: nothing is freed (the guide pins everything, people included)
soften number 0.045 How far the subjects are softened in the guide, as a share of the frame width (a Gaussian blur of their own depth). 0 keeps their exact depth, which pins their silhouettes too (they only slide with the camera); larger frees them more but tells the model less about where they are
Constraints: 0 to 0.3.
guide_strength number 1.0 How strongly the guide steers the model (LTX: the IC-LoRA guide strength; Wan: Fun Control has no scale, so this is the Uni3C strength)
Constraints: 0 to 2.
parallax number 0.5 Depth effect of the guide's camera (as freeze.parallax): near things shift against far ones as the camera moves, so the model sees a real camera move
Constraints: 0 to 2.
dolly number (optional) null Extra push-in of near things (default follows parallax)
Constraints: 0 to 3.
continues boolean false Carry the previous beat's camera across the cut: this beat's camera starts where the previous camera beat ended, with the speed it ended at (no ease to a stop at the boundary), and it starts on that beat's last frame, graded to match
res list of 2 integers (optional) null Size the video model runs at (the frames are scaled to beat_res; ltx: multiples of 64, wan/uni3c: multiples of 16). Default: ltx about 1024x576 (more pixels let the subjects drift in tests; beat_restore adds the detail back), wan ~1280x720
Constraints: exactly 2 items.
anchor number (optional) null How firmly the pure-camera render is pinned along the way (as a keyed move's anchor). Default: the move's tested value, 0.6 for dollies, zooms, whip pans and static shots, 0.3 for moves that open gaps behind near things (orbit, crane, dolly zoom, fpv, push-through), which the model then repaints
Constraints: 0 to 1.
match number (optional) null How far the generated frames are pulled back toward the base plate's tone and grain (the start image of the first beat of the chain, flown along the same camera): a video model drifts in contrast, haze and grain from clip to clip, and a cut shows it. 0 = off. Default: 0.7 for a beat in a chain of continues beats, else off
Constraints: 0 to 1.
seed integer (optional) null Seed for the generation (default: the beat's motion_seed, then seed)
move enum required A named camera move (engine/camera_moves.py), flown through the start image's depth and followed by the video model like keyed moves: static (locked-off tripod), dolly-in / dolly-out (the camera travels toward or away from at, near things grow faster than far ones), crash-zoom (a sudden lens zoom into at, then a hold), dolly-zoom (vertigo: the subject keeps its size while the background swells), orbit-left / orbit-right (an arc around the subject, which stays put while the foreground and background slide past each other), crane-up / crane-down (the camera rises or sinks, tilting to keep the subject), fpv (a drone flying forward with a banking roll), whip-pan (a fast pan with motion blur), push-through (a deep push past the foreground into the scene beyond). See docs/scenes.md for which read clearly on LTX-2.3
Allowed values: "static", "dolly-in", "dolly-out", "crash-zoom", "dolly-zoom", "orbit-left", "orbit-right", "crane-up", "crane-down", "fpv", "whip-pan", "push-through".
amount number 1.0 How far the move goes: 1 is the tested recipe, 0.5 half as far, 1.5 further (a deeper push, a wider arc, a faster zoom)
Constraints: 0.25 to 2.0.
at list of 2 numbers (optional) null The point the move is about, x y in 0-1 of the start image (the subject): where a dolly or a zoom goes, what an orbit or a crane keeps still, what a dolly zoom keeps the same size. Default: the centre
Constraints: exactly 2 items.

Used in: Beat.camera.

Carry

An element that travels across the cut: it leaves its place in this section and settles in its place in the next (FLIP: the browser measures both), so the eye is led over the join.

Field Type Default Description
from string "h1, h2" CSS selector of the element in this section (the last match on its final screen)
to string "h1, h2" CSS selector of the element in the next section (the first match on its first screen)
via enum "dissolve" What the rest of the picture does while the element travels
Allowed values: "dissolve", "cut", "wipe", "iris".

Used in: Transition.carry.

Cinemagraph

Make a picture a cinemagraph: a still where only one thing moves (steam from a cup, a curtain in a breeze, light on water, a candle flame), and everything else is held perfectly still. Put it on any image input (hero.image, a product or strip image, a gallery tile, a section backdrop):

image: { generate: "a cup of coffee, steam rising ...", cinemagraph: { moves: "the steam above the cup" } }

The still stays the picture. The engine finds what moves (Florence-2 + SAM 2.1 from moves), has a local video model (LTX-2.3 or Wan 2.2) bring a crop around it to life, keeps only the moving part, closes the loop and encodes a small video of that part; the page lays it over the still through a soft mask, so outside the mask the pixels are the still's and never change. Plain images (no cinemagraph) are untouched and keep their cache.

Field Type Default Description
moves string required What moves, as you would say it to a person: "the steam above the cup", "the sheer curtains", "the light on the water", "the candle flame". Found on the still by Florence-2 grounding; it must be visible in the picture
motion string (optional) null How it moves, for the video model: "slow, curling upward", "swaying a little in a soft breeze". Default: gentle motion of moves
seconds number 4.0 Length of the loop in seconds (a pingpong loop is generated at half this and played forward then back)
Constraints: 1.0 to 8.0.
loop enum "seamless" seamless: the clip is made to end where it began (first = last frame generation) and any seam left is closed by a flow-aligned crossfade; the motion keeps one direction (steam keeps rising). pingpong: forward then backward, a seam by construction; for sways and shimmer that read the same both ways
Allowed values: "seamless", "pingpong".
strength number 1.0 How far it moves: 1 is the motion as generated, lower damps it toward its resting look, higher exaggerates it
Constraints: 0.2 to 1.5.
seed integer 7
model enum (optional) null Video model: ltx (LTX-2.3) or wan (Wan 2.2). Default: the site's video_model, then ltx
Allowed values: "ltx", "wan".
box list of 4 numbers (optional) null x0, y0, x1, y1 around what moves, 0-1 of the still (skips the search by name)
Constraints: exactly 4 items.
points list of list of 2 numbers [] Points ON what moves, 0-1 across and down the still
Constraints: each: exactly 2 items.
negative_points list of list of 2 numbers [] Points on what must NOT move
Constraints: each: exactly 2 items.
pick enum or integer "all" When moves matches several things: all of them, or one by rank or index
Allowed values: "all", "first", "largest", "smallest", "left", "right", "top", "bottom", "center".
grow integer 10 Widen (+) or shrink (-) the moving region by this many pixels of the still (the video is free to move this much beyond it)
Constraints: -60 to 200.
feather integer 28 Softness of the region's edge in pixels of the still: the motion fades into the held-still picture over about this distance
Constraints: 0 to 120.
track boolean true Follow the moving thing through the clip (SAM 2.1 video tracking) and keep the whole path it sweeps, so a flame or a curtain that leaves its first outline is not cut off at the edge of the region

Used in: ImageInput.cinemagraph.

CodeFile

One file on the route through the codebase.

Field Type Default Description
path string required Shown as the file's title, e.g. app/Models/User.php
code string (optional) null The source. For kind: edit, start each line with '+' (added), '-' (removed) or ' ' (unchanged), like a diff
file string (optional) null Read the source from this project file instead of code
kind enum "read" read: flies past as the agent reads it; edit: a stop where the diff applies itself as you scroll; run: a terminal stop whose output prints line by line
Allowed values: "read", "edit", "run".
label string (optional) null Tag over the file (default: Read / Edit / the command for run)
lang string (optional) null Highlighting: php, ts, tsx, js, py, go, rust, sh... (default: from the extension)
weight number 1.0 Share of the scroll this file gets, relative to the others of its kind
todo string (optional) null An item on the agent's todo list, ticked when this file is done

Used in: CodeScene.files.

CodeTerminal

The agent's prompt box the scene opens on; the camera dives through it into the code.

Field Type Default Description
logo string "" Wordmark over the prompt, e.g. 'opencode'; split as dim|bright with '|', e.g. 'open|code'
prompt string required
agent string "Build"
model string ""
provider string ""
hints list of string ["tab switch agent", "ctrl+p commands"]

Used in: CodeScene.terminal.

CutAnchor

Where a shape sits on one side of a match cut: named (found on that side's picture by Florence-2 and SAM 2.1), boxed, or a page element. A bare string is a prompt: shape: "the round logo".

Field Type Default Description
prompt string (optional) null What to find on the picture, as you would say it to a person: "the sun", "the round logo", "the cup"
box list of 4 numbers (optional) null x0, y0, x1, y1 around the shape, 0-1 of the section's picture
Constraints: exactly 4 items.
selector string (optional) null A CSS selector for a page element inside the section (the phone screen: .ss-phone__screen, a logo: .ss-wordmark svg); measured in the browser, so it works on any block

Used in: Transition.shape, Transition.becomes.

Device

A phone showing a simple app screen, drawn in HTML so the text stays sharp at any size.

Field Type Default Description
app string (optional) null App name in the screen's header
title string (optional) null Screen title
label string (optional) null Small label above the options
note string (optional) null Paragraph under the label
options list of DeviceOption []
button string (optional) null Button at the bottom of the screen
image string or ImageInput (optional) null Use a screenshot instead of the drawn screen
video string (optional) null Play a screen recording (a project file or URL; muted, looping) instead of the drawn screen; image is then its poster
time string "9:41"

Used in: HeroBlock.device, ProductBlock.device, ProductBlock.behind.

DeviceOption

Field Type Default Description
title string required
body string (optional) null
selected boolean false Shown as the chosen option

Used in: Device.options.

DioramaCamera

How the camera moves: it orbits the whole diorama, dives to each place, and lifts back out.

Field Type Default Description
orbit enum "auto" Which way it travels round the world between places: the short way, or always clockwise / counter-clockwise (seen from above)
Allowed values: "auto", "cw", "ccw".
pitch number 36.0 Degrees above the horizon in the orbit view
Constraints: 10 to 80.
dive_pitch number 21.0 Degrees above the horizon once it has dived to a place
Constraints: 6 to 60.
fov number 30.0 Lens in degrees: narrow flattens the world into a macro photograph
Constraints: 14 to 60.
dive number 1.0 How close the dive lands (above 1 is closer)
Constraints: 0.4 to 2.0.
hold number 0.5 Share of each step's scroll the camera rests at its place; the rest is travel
Constraints: 0.1 to 0.9.
drift number 1.0 The camera's idle breathing, and how far the pointer can turn it (0: still)
Constraints: 0 to 3.
travel enum "orbit" Between two places: orbit lifts out over the whole world and dives to the next; glide goes straight from one to the next at the same height, following a scroll mover that travels between them, and at a place where that mover stops it looks at the mover and what it carries
Allowed values: "orbit", "glide".
yaw number (optional) null Degrees round the world the wide views look from (0: from the front, 90: from the right). Unset: beside the first and last places

Used in: DioramaScene.camera.

DioramaLook

The miniature look: shallow tilt-shift depth of field, high soft sun, toy saturation.

Field Type Default Description
tilt_shift number 1.0 Depth-of-field strength: 0 is sharp everywhere; 1 reads as a macro lens on a model; above 1 is extreme
Constraints: 0 to 2.5.
saturation number 1.15 Colour boost (toys are a little too colourful)
Constraints: 0.5 to 2.0.
sun enum "golden" Time of day: the sun's height and warmth, the length of the shadows
Allowed values: "morning", "noon", "golden", "dusk".
table string (optional) null Colour of the surface the diorama stands on (default: the theme background)
grain number 0.03 Film grain
Constraints: 0 to 0.2.
vignette number 0.25 Darkening towards the corners
Constraints: 0 to 1.0.

Used in: DioramaScene.look.

DioramaMover

Something that travels a route on the diorama: a vehicle, a cart, a carrier. With drive: scroll its place on the route follows the page: it waits at each stop while that stop's step is on screen and travels between stops as the page scrolls, and the camera follows it there (camera.travel: glide). With drive: time it goes round its route on its own, at speed.

Field Type Default Description
id string required A name for it
kind string "carrier" What it is, a prop of the kit: carrier (a flat, levitating deck), forklift, boat ... (unknown kinds are drawn as a block)
route list of list of 2 numbers [] The way it goes, points [x, z] in world units in order; corners are rounded. Its stops are joined to it in order
Constraints: each: exactly 2 items.
stops list of DioramaStop [] drive: scroll: where it waits and what it carries from there on, in route order
drive enum "scroll" scroll: its place follows the page (see above); time: it loops its route on its own
Allowed values: "scroll", "time".
speed number 1.2 drive: time: world units per second
Constraints: at most 20.
carry string or ImageInput (optional) null What it carries at the start, a picture laid on its deck
carry_size list of 2 numbers [1.0, 0.9] The carried picture's width and depth, world units
Constraints: exactly 2 items.
scale number 1.0 Constraints: at most 5.
color string (optional) null Its main colour, hex
hover number 0.0 How high it floats over the floor (a levitating deck), world units
Constraints: 0 to 1.

Used in: DioramaScene.movers.

DioramaPlace

A place on the diorama: where the camera dives to and where one step's content sits. The place gets a hero prop, a sign with its name, a little set dressing around it and a pin in the orbit view.

Field Type Default Description
name string required The name on the sign and the pin
kind string (optional) null The hero prop. harbour: lighthouse, crane, warehouse, stall, office, ferry, windmill, shop, cafe. town: clocktower, shop, cafe, windmill, stall, office, fountain. desk: laptop, mug, books, plant, lamp, monitor, notebook. factory: tank, chimney, conveyor, robot, warehouse, office, silo. studio: easel, softbox, camera, monitor, speaker, sofa, shelf, plant. Unset: the next one the world suggests
where string or list of 2 numbers (optional) null Where on the world: coordinates [x, z] in world units from the middle, or words: a compass point (north is the back, south the front: 'north-east', 'south'), 'centre', 'edge', or one of the world's own spots (harbour: hill, yard, plaza, pier, bay, village, quay; the others in docs/miniature.md). Unset: the world's own spot for this kind
Constraints: exactly 2 items.
step integer (optional) null Which of the scene's steps (0-based) lives here. Unset: the places take the steps in order, skipping a leading intro step
Constraints: at least 0.
side enum (optional) null Which side of the screen the place sits on once the camera has dived to it (the copy takes the other). Unset: opposite the card column
Allowed values: "left", "right".
sign string (optional) null Text on the little sign at the place (default: the name; an empty text: no sign)
scale number 1.0 Size of the hero prop
Constraints: above 0.
color string (optional) null Main colour of the hero prop, hex
turn number (optional) null Degrees the hero prop is turned (0 faces the viewer, 90 faces right). Unset: the world decides (towards the water, or the viewer)

Used in: DioramaScene.places.

DioramaProp

One extra thing set on the diorama by hand, beside what the world generates.

Field Type Default Description
kind string required A prop of the kit: tree, pine, bush, rock, house, shop, cafe, warehouse, lamp, bench, fence, crate, barrel, flag, container, boat, windmill ... (the full vocabulary is in docs/miniature.md)
at list of 2 numbers required Where, in world units from the middle (x to the right, z towards the viewer)
Constraints: exactly 2 items.
turn number 0.0 Degrees the front is turned (0 faces the viewer)
scale number 1.0
color string (optional) null Main colour (roof, hull, body), hex
size list of 2 numbers (optional) null Width and depth in world units, for props that cover an area (tiles, rug)
Constraints: exactly 2 items.

Used in: DioramaWorld.props.

DioramaStop

A stop on a mover's route: where it waits while a step is on screen, and what it carries from there on.

Field Type Default Description
place string (optional) null The name of a place: the mover stops at that place (its position on the route), while that place's step is on screen
at list of 2 numbers (optional) null Or a point [x, z] in world units; it waits there while step is on screen
Constraints: exactly 2 items.
step integer (optional) null With at: which step (0-based) it waits through
Constraints: at least 0.
carry string or ImageInput (optional) null What it carries from this stop on (a picture laid on its deck); it changes while the mover waits here

Used in: DioramaMover.stops.

DioramaTraffic

Many movers wandering a grid on their own, each its own way: they drive straight along the grid's lines, stop, turn, and never run into each other or into what stands on the grid (the routes are worked out at build time, a few minutes of traffic that the page plays on a loop). Warehouse robots, planar-motor decks, carts in a yard.

Field Type Default Description
area list of 4 numbers required x0, z0, x1, z1: the rectangle they move in, world units
Constraints: exactly 4 items.
cell number 1.0 The grid's spacing, world units: one move is one cell
Constraints: 0.3 to 6.
count integer 12 How many movers
Constraints: 1 to 80.
speed number 1.6 World units per second while moving
Constraints: at most 20.
pause number 0.25 Seconds they rest at a cell before moving on
Constraints: 0 to 5.
kind string "carrier" What each is, a prop of the kit (see DioramaMover.kind)
carry list of string or ImageInput [] Pictures laid on their decks; mover i carries picture i (mod the list), so a few pictures make a varied crowd
carry_size list of 2 numbers [0.7, 0.6] The carried picture's width and depth, world units
Constraints: exactly 2 items.
scale number 1.0 Constraints: at most 5.
colors list of string [] Hex colours for the movers, used in turn
hover number 0.0 How high they float over the floor, world units
Constraints: 0 to 1.
keep_off list of list of 4 numbers [] More rectangles (x0, z0, x1, z1) they never enter; the routes of scroll movers and the props standing in the area are kept off by themselves
Constraints: each: exactly 4 items.
seed integer 7

Used in: DioramaScene.traffic.

DioramaWorld

The world, described once. The engine lays out the ground (water, roads, hills, paving), the scenery and the places' dressing from this and the seed; the same spec always gives the same world.

Field Type Default Description
kind enum "harbour" The kind of world: sets the ground plan, the scenery and the prop vocabulary. plain: an empty floor, for a world made of its places, props and movers
Allowed values: "harbour", "town", "desk", "factory", "studio", "plain".
seed integer 7 Seed for the layout: another seed is another arrangement of the same kind of world
size number (optional) null Width of the diorama in world units (a house is about 2). Unset: 30 for a harbour or town, 22 for a desk or studio, 26 for a factory
Constraints: 16 to 60.
base enum (optional) null The shape of the base it stands on (default: round for harbour and town, square for the rest)
Allowed values: "round", "square".
palette list of string [] Hex colours for roofs, hulls and containers, replacing the world's own (2-8)
density number 1.0 How much scenery fills the world: trees, houses, boats, lamps
Constraints: 0 to 2.0.
props list of DioramaProp [] Extra props set by hand
floor string (optional) null plain: the floor's colour, hex (default: a pale concrete)

Used in: DioramaScene.world.

EditRegion

Where an image edit is allowed to change the picture; everywhere else the result is the source, pixel for pixel.

Name the region (prompt, found on the source image by Florence-2 grounding), or point at it (box, points; 0-1 picture coordinates). SAM 2.1 then cuts a precise mask around it. A bare string is a prompt: region: "the girl's shoes". The editor works on a padded crop around the region (see scope), and the result is composited back through the feathered mask at the source's own resolution.

Field Type Default Description
prompt string (optional) null What the edit may change, as you would say it to a person: "the girl's shoes", "the shoes of the woman and the man"
points list of list of 2 numbers [] Points ON the thing, 0-1 across and down the source image (with or without a prompt or box)
Constraints: each: exactly 2 items.
negative_points list of list of 2 numbers [] Points on what the mask must NOT take
Constraints: each: exactly 2 items.
box list of 4 numbers (optional) null x0, y0, x1, y1 around it, 0-1 of the source (skips the prompt's search)
Constraints: exactly 4 items.
pick enum or integer "all" When the prompt matches several things: all of them, one by rank (largest, left, center ...) or by index (0 is the first the search lists)
Allowed values: "all", "first", "largest", "smallest", "left", "right", "top", "bottom", "center".
within string (optional) null Keep only the matches inside the thing this names, e.g. prompt "hands" within "the girl in the red coat". A prompt shaped "the X's Y" or "the Y of the X" does this by itself
grow integer 0 Widen (+) or shrink (-) the mask by this many pixels of the source image (the edit is free to redraw this much beyond the thing itself)
Constraints: -80 to 200.
feather integer 8 Softness of the mask's edge in pixels of the source image: the edit fades into the untouched picture over about this distance
Constraints: 0 to 100.
invert boolean false Edit everything EXCEPT the region (the region stays the source, pixel for pixel)
scope enum "crop" crop: the editor sees only a padded crop around the region, upscaled to its working size, so a small region gets full detail; image: the editor sees the whole picture (always used with invert)
Allowed values: "crop", "image".
context number 0.6 scope crop: how much of the surroundings the editor sees, as a share of the region's size added on every side
Constraints: 0 to 4.

Used in: ImageEdit.region, JourneyStop.region.

Faces

Face repair for generated video: faces above min_size are found in every frame, restored with GFPGAN v1.4, and blended back softly (and smoothed over time so nothing flickers).

Field Type Default Description
mode "restore" "restore"
strength number 0.7 How much of the restored face is blended in
Constraints: 0 to 1.
min_size integer 96 Faces smaller than this many pixels across are left alone
Constraints: 16 to 2048.
smooth number 0.6 Temporal smoothing of the blend (higher: steadier, slower to follow)
Constraints: 0 to 0.95.

Used in: Beat.faces, FilmScene.faces.

FaqItem

Field Type Default Description
q string required
a string required

Used in: FaqBlock.items.

Feature

Field Type Default Description
tag string (optional) null
title string required
body string (optional) null
meter number (optional) null 0-1 progress bar under the card
image string or ImageInput (optional) null An illustration at the top of the card: a file, URL or image input (generate:, ...). In a named medium (imagery.medium) it is drawn in it like every generated picture, and shown whole

Used in: FeaturesBlock.items.

Finish

The finishing pass over a finished film (engine/finish.py), after it is generated and joined and before it is encoded for the page: a SeedVR2 restore (grain and compression mush out, fine detail redrawn), a deflicker and a light temporal denoise, an optional sharpen, and frame interpolation where the motion is slow. Each step is its own cached stage keyed by the film and its settings. finish: true takes every default.

Field Type Default Description
restore integer 1088 Run SeedVR2 at this height (1088 keeps a 1920x1088 film's size and redraws its detail; 1440 or 2160 enlarge it). null skips it. Slow: about a minute and a half per second of film at 1088
Constraints: 480 to 2160.
batch integer 21 SeedVR2 frames restored together (4n+1). More frames: steadier detail from frame to frame (less shimmer), more VRAM
Constraints: 5 to 49.
deflicker boolean false Even out frame-to-frame brightness flicker (FFmpeg deflicker, over 5 frames). Off by default: on a moving camera it chases real changes of light and measured worse; turn it on for a clip that visibly pulses
denoise number 0.25 Temporal denoise: pixels that only shimmer from frame to frame are averaged with their neighbours in time (FFmpeg atadenoise; edges and real motion are kept by its thresholds). 0 = off, 1 = strong (can smear fine moving texture)
Constraints: 0 to 1.
sharpen number 0.3 A light unsharp mask after the denoise (0 = off; 0.3, the default, gives back the fine detail the denoise softens without halos; higher shows halos)
Constraints: 0 to 1.
interpolate enum "off" Double the frame rate with a frame interpolator (smoother slow scrolling, twice the frames in the page's film). auto: only with a RIFE/FILM checkpoint in ComfyUI and only when the film's motion is slow (slow), where interpolation is clean; on: always, with FFmpeg's minterpolate when there is no checkpoint (it leaves halos along moving edges)
Allowed values: "off", "auto", "on".
slow number 6.0 interpolate auto: the most motion, in pixels a frame at 1920 wide (the film's median), that still counts as slow
Constraints: at most 60.
interpolator string (optional) null A RIFE or FILM checkpoint in ComfyUI's models/frame_interpolation folder (ComfyUI's own FrameInterpolate node). Default: the first one ComfyUI lists

Used in: FilmScene.finish.

FontFile

A font file of the project's own (a brand face that is not on Google Fonts), served from the site itself.

Field Type Default Description
file string required The font file inside the project folder: .woff2 (best), .woff, .ttf or .otf
family string (optional) null The family name it is set in (default: from the file name, fonts/Brand-Sans.woff2 is 'Brand Sans')
weight string (optional) null The weight the file holds, e.g. 400 or 700, or a range such as '100 900' for a variable font (default: every weight)
style enum "normal" normal, or italic for an italic file
Allowed values: "normal", "italic".

Used in: Brand.fonts, Theme.fonts.

FrameMatch

An image designed to match another section's last frame, so a match cut can be built rather than found: the shape that ends that section becomes something else in this picture, in the same place at the same size. edit hands the frame to Qwen-Image-Edit with an instruction made from these fields; hint generates this picture from prompt with the shape's place and size written into it. The section must come before this picture's in the page (it is built first); pair it with transition: {type: match} on that section.

Field Type Default Description
section string required The id of the section whose last frame to match
shape string required What to match in that frame, as you would say it to a person: "the round logo"
becomes string (optional) null What that shape is in this picture: "the sun", "the rim of a coffee cup"
prompt string (optional) null The rest of this picture (the scene around the shape); with how: hint this is the whole prompt
how enum "edit" edit: redraw that frame (Qwen-Image-Edit) keeping the shape's place, size and outline. hint: generate this picture (Z-Image) from prompt with the shape's place and size in it
Allowed values: "edit", "hint".
at enum "last" Match the section's last frame (or its first)
Allowed values: "last", "first".
seed integer 7
steps integer 30 how: edit, the editor's steps
Constraints: 4 to 60.

Used in: ImageInput.match.

Freeze

A frozen moment: the beat is not generated but rendered from one frame, offline, in seconds. The frame is upscaled, given a depth map (Depth Anything V2) and the camera moves through it as a 2.5D parallax move along camera keys, so a crowd can stand still while the camera visits a couple's hands and feet, and the faces stay the faces of the frame. The clip joins the film like any generated beat (trim, crossfade, restore, locked, --only).

Field Type Default Description
from string (optional) null Freeze the last frame of this beat (an earlier beat of the film, after its trim); or give image:
image string or ImageInput (optional) null Freeze this image instead (a file, or any image input; beat_frame: takes a frame of a beat)
pick enum "sharpest" With from: sharpest takes the sharpest of the last pick_window frames (the very last of a moving shot is often motion-blurred, bad for close-ups), last the very last one. Sharpness is measured in the camera's tightest boxes
Allowed values: "sharpest", "last".
pick_window integer 6 How many of the last frames pick: sharpest looks at
Constraints: 1 to 48.
upscale number 1.0 Upscale the frame this many times before moving through it, so crops stay sharp (a 3x crop of a 1920 frame needs 2). 1 = off
Constraints: 1 to 4.
upscale_method enum "auto" seedvr2: SeedVR2 image restoration through ComfyUI (redraws fine detail; the model downloads on first use). lanczos: a local detail-preserving resample, no model. auto: seedvr2 when its weights are installed, else lanczos
Allowed values: "auto", "seedvr2", "lanczos".
camera list of FreezeKey [] Camera keys over the beat. The camera rests on the first box until its t and on the last after its t; none: the whole frame, with the parallax
move FreezeMove (optional) null A named camera move through the frozen frame instead of camera keys (see FreezeMove): move: dolly-zoom, or {move: orbit-left, amount: 0.8, at: [0.5, 0.6]}. The same rigs as a generated beat's named moves, rendered offline through the frame's depth: nothing in the picture moves but the camera
parallax number 0.6 Strength of the 2.5D depth effect (0 = flat Ken Burns; the subject plane stays put while nearer and farther things shift)
Constraints: 0 to 2.
dolly number (optional) null Extra push-in of near things as the camera closes in (default follows parallax)
Constraints: 0 to 3.
ease enum "inOutSine" How the camera travels between boxes. inOutSine/Quad/Cubic/Quart: eased, resting at every key. smoother: eased with no jolt at the stops (it settles into each hold and leaves it gently; best with holds). flow: keeps moving through keys (it rests only at keys with a hold)
Allowed values: "linear", "inOutSine", "inOutQuad", "inOutCubic", "inOutQuart", "smoother", "flow".
depth_model enum "small" Depth Anything V2 size (small is Apache-2.0; base and large are CC-BY-NC)
Allowed values: "small", "base", "large".
blur number 0.0 Motion blur: the shutter, as a fraction of a frame (0 = off, 0.5 = 180 degrees). Sub-frames are averaged
Constraints: 0 to 1.
grain number 0.0 Film grain laid over the render (0.01-0.03 is faint) so it matches generated shots
Constraints: 0 to 0.2.
seed integer 7
detail FreezeDetail (optional) null Deep zoom: a pyramid of re-drawn tiles so a push to a 10-20x close-up stays sharp at every scale (see FreezeDetail). detail: {} for the defaults
layers FreezeLayers (optional) null Experimental. Layered depth: background plate + a plane per subject, so depth jumps have no halos and the camera reveals real background behind people (see FreezeLayers). layers: auto or a list of subjects

Used in: Beat.freeze.

FreezeDetail

Deep zoom: the camera may push from the wide shot to a 10-20x close-up and every scale stays sharp. The frame is not enlarged, it is built into a pyramid of tiles (about ratio times the detail per level, as many levels as the tightest camera box needs): each tile is a crop of its parent, enlarged (SeedVR2), re-drawn at low strength so it gains fine detail in the same style, aligned to its parent, and given the parent's low frequencies exactly, so colours and shapes agree at every level and only fine detail is new. The render takes each pixel from the finest tile that covers it and fades levels in by screen-space pixel density, so detail arrives as the camera does and nothing pops. Every tile is its own cached stage. Needs ComfyUI (SeedVR2, Z-Image Turbo).

Field Type Default Description
levels "auto" or integer "auto" Levels of tiles below the frame: auto stops when the tightest camera box has a tile pixel for every output pixel; or a number (1-8)
ratio number 2.0 The most detail one level adds to the one above (pixels per unit of the frame). auto levels lower it so the levels share the gain evenly; a smaller ratio means more levels and tiles, and no moment where the picture is much softer than the screen
Constraints: 1.3 to 4.0.
strength number 0.35 How much each tile is re-drawn (img2img denoise): 0 keeps the enlargement as it is, 0.3-0.5 invents fine detail (stitching, creases, paper grain) without moving a shape
Constraints: 0 to 0.9.
prompt string "" What the re-draw should add, in the picture's own words, e.g. 'hand-drawn ink, fine cross-hatching, stitched leather'. Added to a generic 'same style, fine detail' line
tile number 1.25 A tile's resolution as a multiple of the beat's (1.25 = 2400 px across for a 1920 beat): more means fewer, sharper tiles and a slower build
Constraints: 1.0 to 2.0.
lock number 2.5 How firmly a tile agrees with its parent: the tile is made to match the parent at every scale coarser than this many parent pixels (colour, tone, where shapes are); finer than that it is its own. Lower holds the parent's soft edges and detail too, so a tile stays as soft as its parent; higher lets the tile move mid-sized shapes
Constraints: 0.2 to 8.0.
method enum "zimage" The re-draw: zimage (Z-Image Turbo img2img: keeps every shape where it is, fast; adds texture and creases, and draws what the prompt names where the picture already has the shape) or qwen (Qwen-Image-Edit asked to add fine detail: it understands the picture and draws laces and stitching, but also moves and reshapes things by several percent, which a tile cannot be made to agree with: ghosting. Experimental)
Allowed values: "zimage", "qwen".
seed integer (optional) null Seed of the re-draw (default: the freeze's seed)

Used in: Freeze.detail.

FreezeKey

One stop of a frozen moment's camera: the framing box the camera has reached at time t of the beat.

Field Type Default Description
t number required When the camera reaches the box, 0-1 of the beat
Constraints: 0 to 1.
box list of 4 numbers required Framing box [x0, y0, x1, y1] in 0-1 of the frozen frame. The aspect comes from beat_res: a box of another shape is widened (never cropped) to it, so everything in the box stays in frame
Constraints: exactly 4 items.
hold number 0.0 The camera rests on the box for this much of the beat after reaching it (the frozen moment still breathes with the parallax)
Constraints: 0 to 1.

Used in: CameraMove.keys, CameraPreset.keys, Freeze.camera.

FreezeLayer

A subject that gets its own plane.

Field Type Default Description
id string (optional) null
prompt string (optional) null The subject as you would say it: 'the woman in the black coat', 'the people'. Every match is cut out (Florence-2 finds it, SAM 2.1 cuts it out)
box list of 4 numbers (optional) null Or a box [x0, y0, x1, y1] around it, 0-1 of the frozen frame (skips the search)
Constraints: exactly 4 items.
points list of list of 2 numbers [] Points ON the subject, 0-1
Constraints: each: exactly 2 items.

Used in: FreezeLayers.subjects.

FreezeLayers

Layered depth: the picture is cut into planes, back to front: a background plate with the subjects painted out (what was really behind them), and a plane per subject (or group of subjects at a similar depth) with its own smooth depth and a soft alpha edge. The camera then reveals true background behind a person instead of smearing the person, and a depth jump no longer leaves a halo or a double edge. The planes are cut from the same picture (and, with detail, the same tiles) at render time, so every level of a deep zoom is layered too.

Field Type Default Description
subjects "auto" or list of FreezeLayer "auto" auto: every person found on the frame (Florence-2 'people'); or the subjects to cut out
planes integer 3 At most this many subject planes: subjects at a similar depth share one
Constraints: 1 to 8.
plate string "" What the empty background should look like where the subjects stood (added to 'remove the people, continue the background in the same style'), e.g. 'the empty foggy street'
grow integer 3 How far (pixels of the frame at beat resolution) the hole in the background plate extends past a subject's edge
Constraints: 0 to 60.
feather number 1.5 Softness of a subject's alpha edge (pixels at beat resolution)
Constraints: 0 to 12.
seed integer (optional) null Seed of the background fill (default: the freeze's seed)

Used in: Freeze.layers.

FreezeMove

A named camera move through a frozen frame (freeze.move): the rig a generated beat's named move flies (engine/camera_moves.py), rendered offline through the frame's depth instead of guiding a video model. Nothing in the picture moves but the camera, so a dolly zoom or an orbit holds every face and every pose of the frame. Moves that open gaps behind near things show the frame's own pixels stretched there (2.5D: nothing behind a shape was ever drawn), so keep amount near 1 on a crowded picture.

Field Type Default Description
move enum required A named camera move (engine/camera_moves.py), flown through the start image's depth and followed by the video model like keyed moves: static (locked-off tripod), dolly-in / dolly-out (the camera travels toward or away from at, near things grow faster than far ones), crash-zoom (a sudden lens zoom into at, then a hold), dolly-zoom (vertigo: the subject keeps its size while the background swells), orbit-left / orbit-right (an arc around the subject, which stays put while the foreground and background slide past each other), crane-up / crane-down (the camera rises or sinks, tilting to keep the subject), fpv (a drone flying forward with a banking roll), whip-pan (a fast pan with motion blur), push-through (a deep push past the foreground into the scene beyond). See docs/scenes.md for which read clearly on LTX-2.3
Allowed values: "static", "dolly-in", "dolly-out", "crash-zoom", "dolly-zoom", "orbit-left", "orbit-right", "crane-up", "crane-down", "fpv", "whip-pan", "push-through".
amount number 1.0 How far the move goes: 1 is the tested recipe, 0.5 half as far, 1.5 further
Constraints: 0.25 to 2.0.
at list of 2 numbers (optional) null The point the move is about, x y in 0-1 of the frame (the subject): where a dolly or a zoom goes, what an orbit or a crane keeps still, what a dolly zoom keeps the same size. Default: the centre
Constraints: exactly 2 items.

Used in: Freeze.move.

GalleryItem

Field Type Default Description
title string required
href string required
kicker string (optional) null
body string (optional) null
image string or ImageInput (optional) null The tile's picture: a file or URL, or an image input (generate:, edit:, cinemagraph: ...)
video string (optional) null

Used in: GalleryBlock.items.

Glow

A soft radial light laid over a gradient.

Field Type Default Description
x number 0.5 Centre, 0-1 across the image
y number 0.5 Centre, 0-1 down the image
color string required Hex colour
radius number 0.4 Softness, as a fraction of the longer side
strength number 0.8 0-1: how far the centre goes to the glow's colour

Used in: Gradient.glows.

Gradient

A backdrop rendered locally with no model at all: a colour sweep, optional glows, stars and film grain. For colour cards, dusk skies and night seas behind type.

Field Type Default Description
colors list of string required Hex colours along the sweep, first to last
Constraints: at least 2 items.
angle number 180 Sweep direction in degrees, as in CSS: 180 is top to bottom, 90 left to right
glows list of Glow []
grain number 0.035 Film grain, 0 to 0.2
stars integer 0 Faint stars scattered over the upper part, for night skies

Used in: ImageInput.gradient.

Hud

Overlay instruments tied to scroll progress.

Field Type Default Description
kind enum "none" Allowed values: "telemetry", "scale", "progress", "legend", "none".
fields list of map [] telemetry: [{label, unit, from, to, curve, decimals, grouping}] values go from from (default 0) to to with progress^curve
events list of map [] telemetry: [{at, label}] lit when progress >= at
clock map (optional) null telemetry: {prefix, start, end, zero} seconds; zero = progress where T=0
scales list of string [] scale: one label per level, e.g. ['100 µm','10 µm']
legend list of map of string to string [] legend: [{label, color}]

Used in: SceneBase.hud.

ImageEdit

Derive an image from another with a local image editor (Qwen-Image-Edit): change one thing, keep the rest.

Field Type Default Description
source string or ImageInput required The image to edit (a file, or another generated image)
instruction string required What to change, e.g. 'close the door completely, keep everything else'
refs list of string or ImageInput [] Up to two more images the instruction can refer to ('put the second image on the laptop screen')
seed integer 7
steps integer 30 Constraints: 4 to 60.
region EditRegion (optional) null Edit only inside this region of the source image (or, with invert, everywhere but inside it): the rest of the result is the source, pixel for pixel, so consecutive versions of a frame differ only where the edit is

Used in: ImageInput.edit.

ImageInput

An image the engine uses as input: a file in the project's inputs/, one generated locally, a gradient, or a still of the site's product.

Field Type Default Description
file string (optional) null Path relative to the project folder (inputs/photo.jpg) or an https URL
generate string (optional) null Prompt for a local text-to-image model (Z-Image Turbo)
gradient Gradient (optional) null Render a gradient backdrop (no model needed) at size
product enum or ProductShot (optional) null A still of site.product at size: a view name (three-quarter, front, side, top, back, hero-low, exploded, detail) or a shot {view, part, yaw, pitch, zoom, explode, background, scene ...}
Allowed values: "front", "three-quarter", "side", "top", "back", "hero-low", "exploded", "detail".
scene string (optional) null With product: render it into a generated scene described by this prompt (see ProductShot.scene)
size list of 2 integers [1920, 1088] Generated size (multiples of 16)
Constraints: exactly 2 items.
seed integer 7
crop list of 4 numbers (optional) null Crop [x0, y0, x1, y1] in 0-1 image coordinates
Constraints: exactly 4 items.
edit ImageEdit (optional) null Make this image by editing another one locally (Qwen-Image-Edit)
beat_frame BeatFrame (optional) null A frame of a beat of a film (its first or last frame, or the frame at a time): chain one beat onto the end of another
match FrameMatch (optional) null Design this image to match another section's last frame, for a match cut (see FrameMatch)
credit string (optional) null Attribution shown in the footer
cinemagraph Cinemagraph (optional) null Make this picture a cinemagraph: only the thing named by moves moves (a video laid over the still through a soft mask), everything else is held perfectly still. Works wherever the page shows the image (hero, product, strip, gallery, a section backdrop)
medium string (optional) null Draw this image in a named medium: risograph, toile, engraving, gouache, watercolour, halftone, ink (a tested recipe: the model's prompt plus a post-process in the theme's inks; see imagery.medium), over the site's own. Works on a file too (the post-process only). none leaves this image out of the site's named medium
calm enum (optional) null Keep this side of the picture calm for a headline: asked of the model, then measured; a busy result is mirrored or regenerated with the next seeds (a file is only checked). Set by itself on a hero in a named medium (its align side)
Allowed values: "left", "right", "center", "top", "bottom".
live list of LiveDetail (optional) null Living details: one small thing alive in the still (see LiveDetail): sweep, glint, drift, rise or flow in a region, drawn by the page (no GPU needed). Up to four; on hero, product, strip and gallery images and parallax photos
Constraints: at most 4 items.

Used in: ArtworkScene.image, Beat.image, Beat.end_image, Device.image, DioramaMover.carry, DioramaStop.carry, DioramaTraffic.carry, Feature.image and 18 more.

InsideLight

One key of an inside flight's light, at a point of the scene's progress. Unset fields follow the scene's own.

Field Type Default Description
at number required Scene progress, 0-1
Constraints: 0 to 1.
exposure number (optional) null Exposure in stops
Constraints: -6 to 4.
ambient number (optional) null Strength of the studio light
Constraints: 0 to 4.
lamp number (optional) null Strength of the lamp that travels with the camera
Constraints: 0 to 10.
rim number (optional) null Strength of the light behind the stop's part
Constraints: 0 to 10.
lamp_color string (optional) null Colour of the camera lamp, hex

Used in: InsideScene.light.

InsideStop

One stop of the camera inside the product: it flies to a named part (or a point), lands there at macro scale with a shallow depth of field, and the stop's copy (the step in the same position) arrives with it. Only part (or point) is needed; everything else has a default that suits any model with named parts.

Field Type Default Description
part string (optional) null Glob on the part, mesh or assembly name, case-insensitive: 'driver*', '*magnet*', 'Housing/*' (see studio product <project> --parts). Several parts are framed together. Use point for a model with no named parts
point list of 3 numbers (optional) null Instead of a part: a point inside the product, x y z in 0-1 of its bounds (x left to right, y front to back, z bottom to top)
Constraints: exactly 3 items.
aim list of 3 numbers [0.5, 0.5, 0.5] Where in the part's own bounds the camera looks, x y z in 0-1 (z 1 = its top surface): look at one end of a long part, or its top
Constraints: exactly 3 items.
label string (optional) null Name for this stop in studio inside and in alt text (default: the part's name)
span number (optional) null How much fills the frame at the stop: the width of the view at the focal plane, in millimetres of the real product (macro: 8-40). Default: the part with a margin, never wider than 40% of the product
Constraints: above 0.
lens number (optional) null Focal length in mm (default: the scene's lens). Longer flattens and blurs more
Constraints: above 4.
fstop number (optional) null Aperture (default: the scene's fstop). 1.8 is a razor thin plane in focus, 8 keeps most of the part sharp
Constraints: above 0.5.
focus string (optional) null Glob on the part the focus is held on (default: the stop's part). Rack focus by naming a part in front of or behind it
yaw number (optional) null Which side the camera comes from, degrees (0 the front, 90 the right side). Default: chosen per stop, the clearest way in, close to the previous stop's side
pitch number (optional) null Camera height above the horizon, degrees (default: chosen, 15-40)
Constraints: -85 to 89.
roll number 0.0 Tilt of the horizon at the stop, degrees (a few degrees reads as handheld/cinematic)
explode number (optional) null How far the parts are pulled apart at this stop (default: the scene's explode); opens a closed assembly so the camera can enter
Constraints: 0 to 1.5.
hold number 0.8 Scroll distance, in screens, the camera rests here while the copy is read
Constraints: above 0.
travel number 1.4 Scroll distance, in screens, of the flight that arrives at this stop
Constraints: above 0.

Used in: InsideScene.stops.

Journey

The whole page as one camera journey through one generated world: each stop is a place in it, the camera travels between them in one unbroken move and the page's content arrives at its stop.

The engine builds it from what it already does best: the first picture is generated from the world and the first place; every later place is arrived at by a keyed camera move on a moving shot (flown through the picture before, painted by the video model), then frozen as a moment with a slow parallax while the page holds. Every join is on the same frame, so there is no cut, and every picture comes out of the one before, so there is no change of style. The runtime maps scroll to the film: a move plays as you scroll through it, a stop holds while its blocks are read, and the camera is at rest whenever the page is. On a phone the wide picture is cropped around focus; with reduced motion (or no JavaScript) the page is the stops as stills with their blocks, in order.

Field Type Default Description
world string required The world, described once: the place, its materials, the light and the hour ('a stone farmhouse on a northern moor at dawn, blue mist, oak and slate, firelight inside'). Added to the prompt of every picture and move, so the stops are one place. Say nothing about people
stops list of JourneyStop required The places, in order
Constraints: at least 2 items.
pace number 1.0 Scales every scroll distance (holds and moves): 0.8 is brisker
Constraints: at most 4.
rail boolean true A rail of the places down the right edge: a mark per stop, the current one named, each a link that scrolls to it
seed integer 11 Seed of the pictures and moves (each stop adds its position)
fade number 0.25 Seconds of cross-dissolve between the move and the hold on the same frame (invisible; it only hides the one-frame seam of two encodes)
Constraints: 0 to 1.
grain number 0.012 Chain: film grain laid over the frozen holds so they match the generated moves on either side (as freeze.grain)
Constraints: 0 to 0.2.
blockout JourneyBlockout (optional) null The generation approach. Unset: a chain of camera moves between stop pictures (the camera flies through the picture the last stop left, so every stop must be visible in the one before: a facade, a street, a landscape). Set: one continuous take through a blockout of the world (real 3D, so doors and rooms work); every stop then needs a pose
restore integer (optional) null Run SeedVR2 over the finished film at this height (e.g. 1080) to clean the video model's softness and redraw fine detail; slow
Constraints: 360 to 2160.

Used in: FilmScene.journey.

JourneyBlockout

The world as rough shapes, as a take's: Blender renders their depth along the camera path, a still of every stop is painted over that depth (Z-Image Turbo + depth ControlNet) and the video model paints the world between the stops along the same depth (LTX-2.3). The camera is a real 3D path, so it can go through a door into a room the first picture never showed; the price is describing the world's layout once, in shapes.

Field Type Default Description
objects list of WorldObject [] Boxes, cylinders, blobs, planes, scatter: only layout, scale and depth matter, the models paint the detail. Leave a gap in a wall for a doorway (two boxes and a lintel)
ground WorldObject (optional) null A plane under everything (default: 400 x 400 at z = 0)
sky string "#b9cde0" Colour of the sky in the blockout
light list of 3 numbers [0.0, -0.4, 0.9] Light direction of the blockout preview
Constraints: exactly 3 items.
lens number 28.0 Focal length in mm
depth_far number 400.0 Depth guide far plane
control_strength number 0.75 How tightly each stop's picture follows the blockout's depth (Z-Image depth ControlNet)
Constraints: 0 to 1.
keyframe_res list of 2 integers [1536, 864] Size of each stop's picture
Constraints: exactly 2 items.
ltx_res list of 2 integers [1024, 576] Size the video model runs at (multiples of 64); the film is scaled to the page. 1024x576 is the size it holds its look at
Constraints: exactly 2 items.
guide_strength number 1.0 How strongly the depth guide steers the video model
Constraints: 0 to 2.
guide_blur number 1.5 Blur of the depth guide in pixels: keeps the camera and the big shapes, drops the blockout's hard edges so a box does not stay a box
Constraints: 0 to 12.
segment number 8.0 Longest stretch the video model paints in one go, in seconds. The film is cut into stretches at the middle of each hold (the camera is at rest there, so the seam cannot show) and a longer one is split evenly
Constraints: 3 to 10.
keyframe_strength number 0.6 How firmly each stop's picture is pinned in the film. Too firm (0.9 was measured) and the model, holding the picture before and the picture after, dissolves between them instead of travelling; about 0.5-0.6 lets the depth guide move the camera and still lands on the picture
Constraints: 0 to 1.
negative string (optional) null What the video model must avoid (default: cuts, flicker, warped shapes, text, watermark, blur)

Used in: Journey.blockout.

JourneyMove

How the camera gets from the stop before to this one: a keyed camera move on a moving shot (camera: of a beat), flown through the picture the last stop left and painted by the video model, so the place it arrives at is the one this stop's place describes, found inside the last picture and not cut to.

Field Type Default Description
into list of 4 numbers (optional) null Chain (no blockout): the part of the previous stop's picture the camera travels into: [x0, y0, x1, y1] in 0-1 of that picture, the doorway, the window, the table. The camera arrives with this box filling the frame. Default: the middle third
Constraints: exactly 4 items.
via list of list of 4 numbers [] Chain: boxes the camera passes on the way (a bend in the path: past the fire and on to the stairs), evenly spaced in time
Constraints: each: exactly 4 items.
path list of JourneyPose [] With a blockout: poses the camera passes on the way (evenly spaced in time), a bend in its path: round the table, through the arch
seconds number 4.0 Length of the move in the film (a chain: at most 10)
Constraints: 1 to 20.
scroll number (optional) null Scroll distance of the move, in screen heights (default: half the seconds of film). The page lands on the stop at the end of it
Constraints: 0.3 to 12.
motion string (optional) null What the move looks like, in words, for the video model: 'the camera glides through the open door into the hall, firelight ahead'
ease enum "inOutSine" How the camera travels (as freeze.ease); the default starts and ends at rest, so the page lands softly at the stop
Allowed values: "linear", "inOutSine", "inOutQuad", "inOutCubic", "inOutQuart", "smoother", "flow".
parallax number 0.5 Depth effect of the guide (as camera.parallax)
Constraints: 0 to 2.
anchor number 0.6 How firmly the pure-camera render of the picture is pinned along the way (as camera.anchor): more keeps the world the picture shows, less lets the model paint more of the place it arrives at
Constraints: 0 to 1.
guide_strength number 1.0 How strongly the depth guide steers the model
Constraints: 0 to 2.
res list of 2 integers (optional) null Size the video model runs at (as camera.res)
Constraints: exactly 2 items.
seed integer (optional) null Seed of the move (default: the stop's). With a blockout it re-rolls the stretch of the take that ends at this stop (and so the stretches after it, which continue from it)

Used in: JourneyStop.move.

JourneyPose

Where the camera is and what it looks at, in the blockout's world units (metres, z up, y forward).

Field Type Default Description
at list of 3 numbers required Camera position
Constraints: exactly 3 items.
look list of 3 numbers required The point the camera looks at
Constraints: exactly 3 items.

Used in: JourneyMove.path, JourneyStop.pose.

JourneyStop

One place on the journey. The camera arrives (move), rests while the page holds (hold), shows its blocks laid out to sit with the picture, and moves on.

Field Type Default Description
id string required Short name; the beats are called <id>-travel and <id>-hold
label string (optional) null Name of the place in the page's places rail (default: the id)
world string (optional) null Replaces journey.world in this stop's prompts: for a place the shared world would mislead, such as the view out of a window in a journey described from inside
place string required The place as a photograph: what the camera sees at rest here, in the world described once at journey.world. The first stop's picture is made from it; later stops arrive at it through move (it steers the video model toward the place) and it names the picture for the reduced-motion page
still string or ImageInput (optional) null Use this picture for the stop instead (a file, or an image input: generate:, edit:, beat_frame ...). For the first stop it replaces the picture made from place; for a later one the hold freezes it instead of the frame the camera arrived at
edit string (optional) null Make the stop's picture by editing the frame the camera arrived at (Qwen-Image-Edit): 'a wooden crate of jars stands on the table'. With region the rest of the frame is that frame, pixel for pixel, so the join stays invisible
region EditRegion (optional) null edit: where it may change the picture
pose JourneyPose (optional) null With a blockout: where the camera rests at this stop
move JourneyMove {} (its own defaults) How the camera gets here (not used by the first stop)
frame list of 4 numbers (optional) null The framing the hold settles on, a box in 0-1 of the stop's picture (default: a slow push-in of breathe). The hold starts and ends on the whole picture, so it joins the moves before and after exactly
Constraints: exactly 4 items.
breathe number 0.05 How far the camera pushes in during the hold when frame is not set, as a share of the picture. The frozen moment keeps its parallax, so it lives
Constraints: 0 to 0.3.
seconds number 3.0 Length of the hold in the film (chain: a frozen moment, no model, rendered offline in seconds; blockout: the camera at rest)
Constraints: 1 to 20.
hold number 1.4 Scroll distance of the hold, in screen heights: how long the page stays at this place while its blocks are read
Constraints: 0.3 to 12.
parallax number 0.6 Depth effect of the hold (as freeze.parallax)
Constraints: 0 to 2.
focus list of 2 numbers (optional) null The point of the picture (0-1 across, 0-1 down) a portrait phone keeps in view when it crops the wide picture (default: the middle)
Constraints: exactly 2 items.
blocks list of one of 10 models, chosen by type: IntroBlock, FeaturesBlock, StatsBlock, TimelineBlock, QuoteBlock, CtaBlock, GalleryBlock, HeroBlock, ProductBlock, FaqBlock [] Content shown at this stop (hero, intro, features, stats, quote, faq, product, cta ...): the same blocks as a section, set as part of the place instead of over it
side enum "auto" Where the blocks sit on the picture. auto: the calmest part of the picture, found from the picture itself (least detail, so nothing important is covered), alternating sides
Allowed values: "auto", "left", "right", "center", "top", "bottom".
form enum "auto" How the blocks are set. type: bare lettering with a soft scrim, as if written in the scene. rail: items in a column divided by hairlines, like a plan beside the place. cards: panels of glass. plaque: one framed plate with a rule inside, like an engraved sign. auto: each block type picks the one that suits it
Allowed values: "auto", "type", "rail", "cards", "plaque".
surface enum "auto" light/dark: the picture under the blocks is light (dark lettering) or dark (light lettering). auto: measured from the picture where the blocks sit
Allowed values: "auto", "light", "dark".
seed integer (optional) null Seed of this stop's picture and move (default: the journey's, plus the stop's position)

Used in: Journey.stops.

Level

Field Type Default Description
preset string required Level generator, see engine/scenes/scene3d.py PRESETS
params map {}

Used in: Scene3DScene.levels.

LightLamps

Lights that switch on (or off) between two times: windows, street lamps, a lit cabin. Name them and the build cuts them out of the lit picture (Florence-2 + SAM 2.1, engine/region.py); the page then turns each one on at its own moment as the light changes, with a glow, instead of fading the whole picture.

Field Type Default Description
prompt string required What turns on, as you would say it to a person: 'the street lamps and the lit windows'. Found on the picture where it is lit
color string (optional) null Glow colour, hex (default: measured from the lit pixels)
glow number 1.0 Strength of the halo around a light as it comes on
Constraints: 0 to 3.
grow integer 2 Widen (+) or shrink (-) each cut-out by this many pixels
Constraints: -20 to 60.

Used in: LightScene.lamps.

LightStructure

Geometry lock. The place must not move between times, only the light. Every relight is measured against the world (how far the editor displaced structure, and how well edges agree); its global move is undone; a relight that is still too far off is redone with another seed, and the best attempt is kept. What drift is left between neighbouring times is measured too and the page glides along it (a flow texture) instead of cross-fading doubled edges.

Field Type Default Description
align enum "affine" affine: undo the editor's global move (a few percent of zoom and a few pixels of shift, which is most of what it does to the place) and bend nothing; flow: also pull local structure onto the world with dense optical flow (edges agree better, lines wobble where the editor redrew things; for small drift); none: measure only. What drift remains is glided over in the page
Allowed values: "affine", "flow", "none".
max_drift number 8.0 How far the place may still be from the world after the global move is undone, mean displacement in pixels at 1024 across; above it the relight is retried with another seed
Constraints: 0 to 40.
retries integer 1 How many more seeds to try when a relight drifts too far
Constraints: 0 to 8.
strength number 0.88 How far the editor may depart from the picture it relights (the denoise strength of the edit): 1 starts from noise and relights fully but redraws and moves things; lower starts from the picture's own layout and holds it (0.75 moves things about 1 px, 0.88 a few) while relighting less. The prompts are written for 0.85-0.9
Constraints: 0.4 to 1.0.
chain boolean false Relight each time from its neighbour nearer the world's time instead of from the world: smaller steps of light hold the layout and make neighbouring times agree better, at the price of a little sharpness per step

Used in: LightScene.structure.

LightSun

A sun (by day) and a moon (by night) that travel over the sky as the scroll goes through the day: a soft glow drawn in the browser over the sky only, behind the buildings. The relit pictures are asked for a sky without a sun disc so the two never double up.

Field Type Default Description
rise list of 2 numbers [0.1, 0.5] Where it comes up, 0-1 across and down the picture
Constraints: exactly 2 items.
noon list of 2 numbers [0.5, 0.06] Where it is highest
Constraints: exactly 2 items.
set list of 2 numbers [0.92, 0.5] Where it goes down
Constraints: exactly 2 items.
size number 1.0 Size of the glow
Constraints: 0.1 to 4.
strength number 1.0 Brightness of the glow
Constraints: 0 to 3.
moon boolean true A cool glow takes its place after dark, crossing the same way
sky string (optional) null What the sky is called for the cut-out (default: 'the sky')

Used in: LightScene.sun.

LightTime

One time of day of a light scene. A bare string is a named preset (dawn, morning, noon, afternoon, golden-hour, sunset, blue-hour, night, overcast, storm; engine/light_presets.py) or, when it is not one, free text describing the light.

Field Type Default Description
id string (optional) null Name to pin steps to (state: {time: <id>}); default: the preset's name, else the first words of the prompt
preset string (optional) null A named time of day: dawn, sunrise, morning, noon, afternoon, golden-hour, sunset, blue-hour, night, overcast, storm. It supplies the light's wording, the clock, the mist and whether lamps are on
prompt string (optional) null Free text describing this light ('low green storm light, the sun breaking through on the left, wet stone'). With a preset it is added to the preset's wording
clock string (optional) null The hour shown beside the picture, e.g. '18:40' (default: the preset's)
haze number (optional) null Mist lying in the distance at this time, 0-1; the page draws it with the depth map and lets it drift (default: the preset's)
Constraints: 0 to 1.
lit boolean (optional) null Lamps and windows are lit at this time (default: the preset's). The build finds what turned on or off between neighbouring times
seed integer (optional) null Seed for this time's relight (default: the scene's); try another when one drifts or looks wrong
strength number (optional) null This time's own denoise strength (default: the scene's structure.strength): a time far from the world's light, such as night, needs more freedom (0.95) than one near it
Constraints: 0.4 to 1.0.
image string or ImageInput (optional) null This time's own picture of the same place, instead of relighting the world (a real photograph, a hand-fixed render). It is aligned to the world like any relight

Used in: LightScene.times.

Field Type Default Description
label string required
href string "#"
icon enum (optional) null An icon on the button: arrow (after the label), play (before it), external (after it; the link opens in a new tab and says so to screen readers) or none. Default: the primary button's arrow, as before
Allowed values: "arrow", "play", "external", "none".
look enum (optional) null solid: filled with the accent; ghost: transparent with a thin outline, for a secondary action. Default: the first button of a row is solid
Allowed values: "solid", "ghost".

Used in: CtaBlock.button, Footer.links, HeroBlock.buttons, IntroBlock.button, Nav.links, Nav.cta, ProductBlock.buttons, Step.button.

LiveDetail

One small thing alive in a still picture: a light sweeping, a cloud drifting, sparks rising, a glint, water moving. Drawn by the page itself (a small WebGL effect over the picture, or inside a parallax photo's own pass), so it needs no GPU at build time and works on a laptop. Paused off screen and in a hidden tab; with reduced motion the picture is simply still. Put it on a hero, product, strip or gallery image, or on a parallax photo:

image: { file: inputs/hero.jpg, live: [{ kind: drift, box: [0.35, 0.25, 0.55, 0.42] }] }

sweep: a soft band of light slides across the region now and then (or, with origin, a beam turns round that point). glint: small four-pointed twinkles on the region's brightest points (found in the picture at build time). drift: the region slides slowly to and fro with soft edges (clouds, mist, a hanging sign). rise: soft specks rise through the region and fade (embers, bubbles, dust in a beam). flow: a gentle wavy shimmer (water).

Field Type Default Description
kind enum required What lives there: sweep, glint, drift, rise or flow
Allowed values: "sweep", "glint", "drift", "rise", "flow".
box list of 4 numbers (optional) null x0, y0, x1, y1 of the region, 0-1 of the picture. For drift give some room around the thing that moves (it slides inside the box and fades out at its edges)
Constraints: exactly 4 items.
prompt string (optional) null Or name the region, as you would to a person ("the clouds"): found at build time by Florence-2 + SAM 2.1 (the same tooling as edit.region; needs ComfyUI). Without them the build uses box if given, and leaves the detail out otherwise
pick enum or integer "all" When prompt matches several things: all of them, or one by rank or index
Allowed values: "all", "first", "largest", "smallest", "left", "right", "top", "bottom", "center".
speed number 1.0 How fast it lives: 1 is calm, 0.5 slower, 2 twice as fast
Constraints: 0.1 to 4.
strength number 0.6 How much: the brightness of a sweep, glint or rise, how far a drift slides, how much a flow ripples
Constraints: 0.05 to 1.
color string (optional) null The light's colour (sweep, glint, rise): a theme token (light, dark, accent, accent2, ink, bg, bg2) or a hex colour. Default: light (the lighter of the theme's text and background) for sweep and glint, accent2 for rise
angle number 0 Direction in degrees, 0 to the right, 90 down: where a sweep slides and a drift goes; the line a flow's ripples run along. A rise always goes up
Constraints: -360 to 360.
origin list of 2 numbers (optional) null sweep: turn a beam round this point (x, y, 0-1 of the region, may lie outside it: a lighthouse lamp) instead of sliding a band
Constraints: exactly 2 items.
count integer 12 glint: how many twinkles; rise: how dense the specks are (about this many on screen)
Constraints: 1 to 24.
softness number 0.25 How soft the region's edge is, as a share of the box
Constraints: 0 to 0.5.

Used in: ImageInput.live.

Field Type Default Description
name string required The company's name: the image's alternative text, or set as a wordmark when there is no image
image string (optional) null The logo: an SVG or a transparent PNG/WebP in the project (or an https URL). Shown as a single-colour silhouette in the theme's text colour; a picture without transparency is shown in greys
href string (optional) null

Used in: LogoRow.items, LogosBlock.items.

LogoRow

A strip of partner or customer logos, in one colour so they sit quietly together.

Field Type Default Description
title string (optional) null A small line above the logos, e.g. 'Trusted by teams at'
items list of Logo required Constraints: at least 1 items.
tint enum "mono" mono: every logo in the theme's text colour (silhouettes; greys for pictures without transparency); original: their own colours
Allowed values: "mono", "original".

Used in: HeroBlock.logos.

Marker

Field Type Default Description
lng number required
lat number required
label string required

Used in: MapScene.markers.

MotionTokens

How the page moves. Each value defaults to what the runtime has always used; scroll.speed still paces it.

Field Type Default Description
ease string (optional) null Easing of transitions (default cubic-bezier(.22, .8, .2, 1))
enter number (optional) null Share of the screen height a block scrolls through while it arrives (default 0.2)
Constraints: at most 1.
follow number (optional) null How quickly smooth scrolling catches up with the wheel (default 0.1; 0.5 is nearly immediate)
Constraints: at most 0.5.

Used in: Theme.motion.

OrbitItem

Field Type Default Description
label string required
status string (optional) null e.g. Live, Developing, Roadmap; the first status used is highlighted

Used in: OrbitBlock.items.

PalettePool

only/avoid take palette names (studio directions --list palettes) or colour words (avoid: [red, green]).

Field Type Default Description
only list of string [] Consider only these (empty: all)
avoid list of string [] Never use these
brand list of string [] Hex colours every direction must carry as its accent: the palettes keep their grounds and take these

Used in: Directions.palettes.

PartMaterial

A material override for the product's parts whose names match. studio product <project> --parts lists the part, mesh and material names. Rules apply in order, so a later rule wins where two match.

Field Type Default Description
match string "*" Glob on the part, mesh or assembly name, case-insensitive: 'Case*', '*knob*', 'Housing/*' (an assembly name matches every part inside it)
material string (optional) null Only the faces using a material whose name matches this glob (as listed by --parts), e.g. 'mat_2' or '*Rubber*'
color string (optional) null Base colour, hex (sRGB)
metallic number (optional) null 0 plastic/paint, 1 bare metal
Constraints: 0 to 1.
roughness number (optional) null 0 mirror, 0.3 satin, 0.6 bead-blasted, 0.9 matte
Constraints: 0 to 1.
emission string (optional) null Glow colour, hex (screens, LEDs)
emission_strength number 1.0 Glow brightness when emission is set
Constraints: at least 0.
transmission number (optional) null See-through amount: 1 glass or clear acrylic
Constraints: 0 to 1.
texture string (optional) null Base-colour image (project file or URL). Meshes without UVs get a box projection
texture_scale number 0.05 Box projection: metres per repeat of the texture
Constraints: above 0.
region list of 6 numbers (optional) null Only faces whose centre lies in this box, x0 y0 z0 x1 y1 z1 in 0-1 of the product's bounds (x left to right seen from the front, y front to back, z bottom to top): paint a screen window or a button on a one-piece body
Constraints: exactly 6 items.
facing enum (optional) null Only faces pointing this way (seen from the front view)
Allowed values: "front", "back", "left", "right", "top", "bottom".

Used in: Product.parts.

Pointer

The visitor's pointer reveals the picture. A lens is a soft circle under the pointer that shows a second layer through the first: the picture's own colour through a black-and-white (or dimmed, blurred, tinted) page, or a second picture of the same view (before and after, the inside of a product through its outside). light is a torch: the picture is dark and a pool of warm light follows the pointer; on a photo with a depth map the light falls off with depth and rakes across the shapes. On a phone the lens follows the finger while it touches, a little above it so the finger does not hide it, and rests at rest otherwise, drifting gently. With reduced motion (and for keyboard users) it stays at rest. Purely visual: the words never depend on it, and without WebGL2 the picture shows as it always did. Works on parallax and film sections. A torch is drawn in 2D from the picture and its depth map, not relit from a 3D render.

Field Type Default Description
mode enum "lens" lens: a circle that shows layer through the picture. light: a torch, a pool of light on a darkened picture
Allowed values: "lens", "light".
layer "colour" or string or ImageInput or list of string or ImageInput "colour" lens: what shows through it. colour: the picture's own colour, with the rest in the base look. Or a second picture of the same view, the same shape as the photo (any image input: a file, generate:, edit:, a product still), or a list, one per photo of a parallax section in step order; a photo without one has no lens. A film's lens shows its colour
base string (optional) null What the picture looks like outside the lens: mono (black and white), dim, blur, a hex colour (a duotone through it), or none (as it is). Default: mono when the lens shows colour (a film's own reveal.base if it has one), none when it shows a second picture
radius number (optional) null Size of the lens or the pool of light: its radius as a share of the picture's shorter side. Default 0.2 for a lens, 0.32 for light
Constraints: 0.04 to 0.6.
softness number 0.35 How soft the edge is: 0 a sharp circle, 1 a wide fade
Constraints: 0 to 1.
strength number (optional) null lens: how fully the layer shows inside it (default 1). light: how dark the rest of the picture is, 0 not at all to 1 nearly black (default 0.85)
Constraints: 0 to 1.
color string "#ffd7a8" light: the colour of the light (a warm torch by default), a hex colour
rest list of 2 numbers [0.62, 0.42] Where the lens or light rests when no pointer is on the picture (phones, keyboard, reduced motion): x, y in 0-1 of the picture
Constraints: exactly 2 items.

Used in: FilmScene.pointer, ParallaxScene.pointer, StagesScene.pointer.

Pool

What a direction may draw on: only these (empty: everything), never these.

Field Type Default Description
only list of string [] Consider only these (empty: all)
avoid list of string [] Never use these

Used in: Directions.styles, Directions.fonts.

ProductLayer

The real thing in a take: rendered from its own 3D model through the take's camera and composited over the generated world, so it never warps. One of model or from_photo, or neither (product: {}) to use the site's product: (its normalised model, materials and credit).

Field Type Default Description
model string (optional) null GLB/glTF, OBJ, FBX, STL or PLY: a project file or an https URL. Omit to use site.product
from_photo string (optional) null A cut-out PNG (transparent background) turned into a 3D model with TRELLIS.2 (needs trellis_python/trellis_script in studio.toml)
credit string (optional) null Attribution shown in the footer
at list of 3 numbers [0, 0, 0] Where the base centre of the product sits in the world
Constraints: exactly 3 items.
height number (optional) null Height of the product in world units (default: site.product's real height in metres, else 1)
rotation list of 3 numbers [0, 0, 0] Euler degrees
Constraints: exactly 3 items.
spin number 0.0 Extra yaw, in degrees, turned evenly over the whole take
hdri string (optional) null Light for the product. Default: the plate itself (an environment built from the generated frames around each moment, so the product takes the scene's light and reflections). Or a Blender studio light: studio, forest, city, courtyard, night, interior, sunrise, sunset
sun_strength number 3.0 A sun lamp along the take's light direction; 0 to turn it off
samples integer 64 Cycles samples per frame (denoised)
shadow boolean true Cast the product's shadow onto the generated ground
shadow_size number (optional) null Side of the square the shadow falls on, in metres (the table or floor patch); default 3x the height
res list of 2 integers (optional) null Render size of the product pass, which is also the final film size (default 1920x1080; 2560x1440 when the take is upscaled)
Constraints: exactly 2 items.
fstop number 2.8 Depth of field: focused where the camera looks, at this f-stop (real scale); none for everything sharp
motion_blur number 0.5 Shutter as a fraction of a frame (0: off)
Constraints: 0 to 1.
grade boolean true Match the product pass to the plate: black level, white balance, saturation, softness, and a light wrap at the edges
grain number (optional) null Film grain on the product (0-255 sigma); default: measured from the plate
Constraints: at least 0.

Used in: Take.product.

ProductShot

A still of the site's product, rendered by Cycles in a studio light and cached.

Field Type Default Description
view enum "three-quarter" front, three-quarter, side, top, back, hero-low (a low camera looking up), exploded (parts pulled apart) or detail (a close macro view of part)
Allowed values: "front", "three-quarter", "side", "top", "back", "hero-low", "exploded", "detail".
part string (optional) null detail: glob on the part/mesh name to frame, e.g. '*port*' (see studio product --parts); also aims any other view at that part
yaw number (optional) null Override the view's turn, degrees (0 front, 90 right side)
pitch number (optional) null Override the view's camera height, degrees above the horizon
zoom number 1.0 1 fits the product in the frame with a margin; 1.3 is closer
Constraints: above 0.
explode number (optional) null How far parts pull apart (exploded view: 1)
Constraints: 0 to 1.5.
lens number (optional) null Focal length in mm (default 50; hero-low 32)
background string "auto" auto (transparent where the page shows it, such as hero and product blocks, else the theme background), transparent, theme, or a hex colour
hdri string "studio" Blender studio light: studio, city, courtyard, forest, interior, night, sunrise, sunset
samples integer 128 Cycles samples (denoised)
Constraints: 4 to 4096.
shadow boolean true A soft contact shadow under the product
exposure number 0.0 Exposure in stops (-0.7 tames a pale metal lid in a bright scene)
Constraints: -4 to 4.
fstop number (optional) null Depth of field, focused on the product (or part); detail views default to f/8, a macro look
Constraints: above 0.
scene string (optional) null Render the product into a generated scene instead of the studio: a prompt for the place it stands ('a walnut desk by a window, morning light'). Z-Image paints the scene to the product's camera (perspective-matched), the product is lit by it, and a light Qwen-Image-Edit pass blends it in (needs ComfyUI)
harmonise number 0.3 scene: strength of the blending pass (0 skips it); the product's own pixels are put back if the pass changes them
Constraints: 0 to 1.
seed integer 7 scene: seed for the generated scene

Used in: ImageInput.product.

Rating

A rating line: stars, the score and where it comes from ('4.9 from 860 reviews').

Field Type Default Description
score number required The score, e.g. 4.9
Constraints: at least 0.
out_of integer 5 The best score; also the number of stars
Constraints: 1 to 10.
text string (optional) null Where the score comes from, e.g. 'from 860 reviews'
href string (optional) null Link the line to the reviews
stars boolean true Draw the stars (filled to the score)

Used in: HeroBlock.rating, SignupBlock.rating.

Reveal

Colour that comes in where the camera looks, driven by scroll. The film is rendered once in full colour; the page shows everything in the base look, and each region's colour is brought in through a tracked mask, in the browser (a WebGL shader draws each frame of the film with its masks from the same frame). Without WebGL the colour film plays as it is; with reduced motion each region jumps to colour as its moment arrives.

Field Type Default Description
base string "mono" What pixels that are not revealed look like: mono (black and white), dim (darker and muted), blur (soft focus in colour), or a hex colour such as "#2a4a6a" (a duotone from black through that colour to white)
regions list of RevealRegion required Constraints: at least 1 items.
keys list of map of string to number [] Scroll progress of the section -> how revealed each region is (0-1), eased between keys: [{at: 0.4, her_hand: 0}, {at: 0.48, her_hand: 1}]. A region keeps its last value. Default: one region after another
cuts list of number [] Times of the film's cuts, in seconds, when they can't be known (a beats film knows its own; other films are searched for them)
feather number 6.0 Softness of every mask's edge, in pixels at film size
Constraints: 0 to 64.
ease enum "smooth" How a region eases between two keys
Allowed values: "smooth", "linear".
tracker enum "large" SAM 2.1 size: large (sharper, ~450 MB) or base_plus
Allowed values: "large", "base_plus".
strength number 1.0 1: revealed pixels show the film's own colour; lower mixes the base look back in
Constraints: 0 to 1.

Used in: FilmScene.reveal.

RevealAt

The frame a region is first found on (before it is tracked through the whole film): a moment in a beat (beat + t, 0 = its first frame, 1 = its last), or in the whole film (t alone, 0-1), or an exact frame / seconds of the joined film. Pick a frame where the thing is plainly in view.

Field Type Default Description
beat string (optional) null beats film: the beat's id
t number 0.5 0-1 through the beat (or through the film without beat)
Constraints: 0 to 1.
frame integer (optional) null An exact frame of the film (overrides beat/t)
Constraints: at least 0.
seconds number (optional) null An exact time in the film, seconds (overrides beat/t)
Constraints: at least 0.

Used in: RevealRegion.at, WorldPlace.anchor.

RevealRegion

One part of the picture that comes into colour. Describe it (prompt: found on the at frame by Florence-2), or point at it (points / box in 0-1 picture coordinates on the at frame); SAM 2.1 then follows it through the whole film, forwards and backwards.

Field Type Default Description
id string required
prompt string (optional) null What to colour, as you would say it to a person: "the woman's hand", "the shoes of the woman and the man". Every match on the at frame is revealed (see pick, within)
points list of list of 2 numbers [] Points ON the thing, 0-1 across and down the at frame (with or without a prompt or box)
Constraints: each: exactly 2 items.
negative_points list of list of 2 numbers [] Points on what the mask must NOT take
Constraints: each: exactly 2 items.
box list of 4 numbers (optional) null x0, y0, x1, y1 around it, 0-1 on the at frame (skips the prompt's search)
Constraints: exactly 4 items.
at RevealAt or list of RevealAt {} (its own defaults) The frame to find it on. A film of several shots tracks a region only inside a shot it is found in (a cut ends it): give one at per shot it must show in
pick enum or integer "all" When the prompt matches several things: all of them, one by rank (largest, left, ...) or by index (0 is the first the search lists)
Allowed values: "all", "first", "largest", "smallest", "left", "right", "top", "bottom".
within string (optional) null Keep only the matches inside the thing this names, e.g. prompt "hand" within "the woman in the long coat". A prompt shaped "the X's Y" or "the Y of the X" does this by itself
grow integer 0 Widen (+) or shrink (-) the finished mask by this many pixels at film size
Constraints: -40 to 80.

Used in: Reveal.regions.

Route

Field Type Default Description
id string required
points list of list of 2 numbers required [lng, lat] waypoints
Constraints: each: exactly 2 items.
color string (optional) null
geodesic boolean false Bend each leg along the great circle (flights)

Used in: MapScene.routes.

ShadeTokens

The shade laid over a scene's picture so its captions stay readable.

Field Type Default Description
strength number (optional) null How strongly the shade fades the picture toward the background: 1 as designed (the default), 0 none
Constraints: 0 to 1.

Used in: Theme.shade.

SignupForm

An inline email field and a button: a plain HTML form that posts to the address you name (a form service, a newsletter's signup URL) or opens an email with mailto:. No server is involved; the browser checks the address.

Field Type Default Description
action string required Where the form goes: an https URL that accepts a form post, or mailto:you@example.com
method enum "post" How the form is sent (a mailto: form always posts)
Allowed values: "post", "get".
name string "email" The field name the service expects
Constraints: matches ^[A-Za-z][\w.\-\[\]]{0,63}$.
label string "Email address" The field's label, read by screen readers (and shown when the placeholder is empty)
placeholder string "you@example.com" Faint example text in the empty field
button string "Sign up" The button's words
note string (optional) null Small print under the field, e.g. 'No spam. Leave any time.'
hidden map of string to string {} Extra hidden fields the service needs (a list id, a redirect URL)

Used in: HeroBlock.signup.

SpaceTokens

Page spacing. Each value defaults to what the stylesheet has always used.

Field Type Default Description
gutter string (optional) null Margin at the page's sides (default clamp(20px, 4vw, 64px))
max string (optional) null Widest the content runs (default 1600px)
caption string (optional) null Width of the captions over a scene (default min(680px, 82vw))

Used in: Theme.space.

SplatKey

Field Type Default Description
t number required Scene progress 0-1
at list of 3 numbers required Camera position, in the scan's own coordinates
Constraints: exactly 3 items.
look list of 3 numbers required Point the camera looks at
Constraints: exactly 3 items.

Used in: SplatScene.keys.

Stage

One state of the subject: a picture of exactly the same view as the others (same framing, same size).

Field Type Default Description
id string (optional) null Name to pin steps to (state: {stage: <id>}); default s0, s1 ...
image string or ImageInput required The picture of this state; every stage is the same view
reveal StageReveal {} (its own defaults) How this stage arrives over the one before (fade, wipe or map; ignored on the first)

Used in: StagesScene.stages.

StageFrame

How the pictures sit in the stage: cropped to fill it (cover) or whole (contain).

Field Type Default Description
fit enum "cover" cover: fill the stage, cropping what does not fit; contain: show the whole picture, the stage's background around it
Allowed values: "cover", "contain".
position list of 2 numbers [0.5, 0.5] contain: where the picture sits in the stage, 0-1 across and down ([1, 0.5] is against the right edge); cover: the point of the picture kept in view
Constraints: exactly 2 items.
zoom number 1.0 Scale on top of the fit (1.1 is a tenth larger)
Constraints: 0.5 to 3.0.

Used in: StagesScene.fit, StagesScene.phone.

StageFront

A band of light that travels with a reveal's front: a scanning head, a band of heat, a sweep of light. It is drawn where the front is, so it moves exactly with the scroll.

Field Type Default Description
color string "accent" Its colour: a theme role (accent, accent2, ink, bg, bg2, light, dark) or a hex colour
width number 0.02 How wide the band is, as a share of the front's travel
Constraints: 0.002 to 0.3.
strength number 0.8 How bright the band is
Constraints: 0 to 2.
where enum "change" change: the band shows only where the picture changes between the two stages (each part lights up as it lands); all: across the whole picture (a band of heat, a scan line)
Allowed values: "change", "all".

Used in: StageReveal.front.

StageReveal

How a stage arrives over the one before. A bare string is the kind (fade, wipe, map).

Field Type Default Description
kind enum "fade" fade: the whole picture at once; wipe: a straight front crosses the picture along angle; map: each pixel arrives when the scroll reaches its grey in map (black first, white last), so parts can land one by one in any order
Allowed values: "fade", "wipe", "map".
angle number 0.0 wipe: the direction the front travels, in degrees (0 left to right, 90 top to bottom, 180 right to left)
map string or ImageInput (optional) null map: a greyscale picture of the same view: when each pixel arrives (black first). Flat greys make whole parts arrive together
softness number 0.06 How soft the front is, as a share of its travel (0 a hard edge)
Constraints: 0.0 to 1.0.
front StageFront (optional) null A band of light that travels with the front (see StageFront)

Used in: Stage.reveal.

Stat

Field Type Default Description
value string "" Shown as-is; a plain number counts up. Leave empty when data fills it
unit string (optional) null
label string required
data StatData (optional) null Read the value from a chart's data at build time, so headline numbers can never drift from the source

Used in: HeroBlock.stats, ProductBlock.stats, StatsBlock.items.

StatData

Field Type Default Description
section string required id of a chart section on this page
series string required
at enum or number "last" Allowed values: "max", "min", "first", "last".
decimals integer 0
scale number 1.0 Multiply the value (e.g. 0.001 to show thousands)

Used in: Stat.data.

Step

One beat of copy that scrolls past the scene: a caption, or any block (block:).

Field Type Default Description
kicker string (optional) null
title string "" Headline; <em>…</em> marks the accent words. Every caption step has one
body string (optional) null
fact string (optional) null Small print under the body (mono)
at list of 2 numbers or enum or AtBox or AtGrid (optional) null Where the step's words sit. A named spot: left, right, center, top, bottom, top-left, top-right, bottom-left, bottom-right (auto, the default, lets the layout decide). Or a box on the stage, {x, y, w, h, align} in 0-1 (x and y are its top-left corner). Or a slot on the theme's 12-column grid, {grid: "9 / span 4", row: top \| middle \| bottom}. Overlay scenes take all three; cards take all three for the card; split takes a spot (the copy stays in its column). Two numbers, [from, to], are the older way to write show
Allowed values: "auto", "left", "right", "center", "top", "bottom", "top-left", "top-right", "bottom-left", "bottom-right".
length number 1.2 split/cards layouts: scroll distance of this step, in screen heights
intro boolean false Render as the section's opening headline (h1)
hint string (optional) null Small 'scroll to begin' line under an intro step
place enum or WorldPlace (optional) null overlay layout: where this caption sits on the shot (default: left, centred vertically); a corner here is the same as at: <corner>. Or an object, {kind: behind \| surface \| sky, ...}: the title is set inside the scene instead of over it (type in the world; see WorldPlace). place: sky is shorthand
Allowed values: "left", "right", "center", "top-left", "top-right", "bottom-left", "bottom-right".
surface enum (optional) null This caption's colours, when the shot under it is lighter or darker than the rest of the scene (dark words on a bright sky: light), with a soft glow behind them
Allowed values: "light", "dark".
button Link (optional) null A button under the caption, e.g. the call to action on a film's last shot
badge string or Badge (optional) null A small pill above the headline: words, or {text, href, tag, icon} for a link with a 'New' tag or a dot
image string or ImageInput (optional) null parallax: this step's photo (a step without one is another caption over the photo before it)
state map {} Scene-specific state for this step. chart: {show, focus, x, y, reveal, marks}; map: {center, zoom, pitch, bearing, route, marker}
show list of 2 numbers (optional) null When the step is on screen: from and to, 0-1 of the scene's progress (0.3-0.46 is the stretch from 30% to 46% of the way through). Overlay scenes; in split and cards a step shows while it scrolls past, for its length. Scenes that time their own copy (inside, light, code with state.file, film beats with state.beat, diorama) fill it in for steps that leave it out
Constraints: exactly 2 items.
enter enum (optional) null How the step arrives: fade, rise (the words rise into place), wipe (revealed from the left), type-on (word by word), scale (grows in) or none. Default: the layout's own, words rising over a stage and cards brightening as they reach the middle of the screen. With reduced motion only the fade is kept
Allowed values: "fade", "rise", "wipe", "type-on", "scale", "none".
exit enum (optional) null How the step leaves: fade, rise (the words rise away), wipe (cleared to the right), type-on (gone at once), scale or none. Default: the layout's own
Allowed values: "fade", "rise", "wipe", "type-on", "scale", "none".
block enum "caption" What the step shows: caption (the default: kicker, title, body, fact, hint, button) or a block, with that block's own fields beside block: (features, stats, timeline, quote, cta, gallery, product, faq). A block step is placed with at and timed with show like any other step; a style that draws the block its own way draws it that way here too
Allowed values: "caption", "features", "stats", "timeline", "quote", "cta", "gallery", "product", "faq".

Used in: SceneBase.steps.

StripItem

Field Type Default Description
image string or ImageInput required
caption string (optional) null

Used in: StripBlock.items.

Subject

The one subject a story film is about (a person, a product, an animal), kept the same from shot to shot. Every generated beat without its own image starts on a picture made from this reference by the local image editor (Qwen-Image-Edit): the beat's prompt as the new scene, the subject kept as it is in the reference. Within a shot the video model starts on that picture, so the subject keeps its identity across the film.

Field Type Default Description
image string or ImageInput required The reference: a file (inputs/hero.png) or an image input (generate:, a product still ...). A clear, well-lit picture of the subject alone works best
name string "the subject" What the subject is, as you would say it to a person: 'the woman in the red coat', 'the white ceramic cup'. The editor is told to keep exactly that
keep string "face, hair, clothes, shape and colours" What must not change from the reference
steps integer 30 Image editor steps per start picture
Constraints: 4 to 60.

Used in: FilmScene.subject.

Take

One continuous camera move through a generated world, with a real product locked to the same camera.

The world is a rough blockout (shapes + camera keys) rendered by Blender into a depth guide; LTX-2.3 paints the world along that guide in chained segments; the product is rendered by Cycles through the identical camera and composited over every frame; the result is encoded for scrubbing.

Field Type Default Description
duration number required Seconds
fps integer 24
sky string "#8fb4d8"
light list of 3 numbers [0.4, -0.3, 0.85] Light direction for the preview and the product's sun
Constraints: exactly 3 items.
ground WorldObject (optional) null A plane under everything (defaults to a 400 x 400 plane at z = 0)
objects list of WorldObject []
camera list of CameraKey required Constraints: at least 2 items.
lens number 32.0 Focal length in mm
product ProductLayer (optional) null
product_in_guide boolean false Put the product's shape in the depth guide. Off by default: the video model then paints its own version of the product, which shows around the edges of the real one. Leave the product out of the prompts too and describe the empty spot ('an empty table').
preview_res list of 2 integers [1280, 720] Blockout render size; same aspect as product.res
Constraints: exactly 2 items.
depth_far number 400.0 Depth guide far plane
keyframes map (optional) null Z-Image stills pinned at times, as in shot.keyframes
ltx map required LTX-2.3 settings, as in shot.ltx: res, segments [{id, range, prompt}], seed, guide_strength ... Render at res [1920, 1088] (multiples of 32) for a detailed world; [1024, 576] is a quick draft
upscale map (optional) null Optional upscale stage, as in shot.upscale
restore integer (optional) null Run SeedVR2 over the generated world at this height (e.g. 1080) to clean the video model's softness and redraw fine detail, before the product is composited (the real product is never restored); slow
Constraints: 360 to 2160.
video_model enum (optional) null Video model: ltx (LTX-2.3, the default) or wan (Wan 2.2 A14B: renders at ~1280x720 and 16 fps, retimed to 24; clean, physical motion and first/last-frame control, but no finer detail than LTX after restore, and slower). Unset = the site's video_model, then studio.toml's, then ltx. With wan the world is painted by Wan 2.2 Fun Control along the same depth guide, from the first keyframe, in the segments and prompts of ltx:
Allowed values: "ltx", "wan".
wan Wan (optional) null Wan settings for this take (over the site's wan:)
locked boolean false Keep the take's renders (world, product pass, composite) as they are, even when its settings change: build and storyboard log it and move on

Used in: FilmScene.take.

TimelineItem

Field Type Default Description
when string required
title string required
body string (optional) null

Used in: TimelineBlock.items.

TrailerShot

One shot of the launch trailer, cut from something the site already rendered. Give one source: section (with step or range), beat, product or card.

Field Type Default Description
section string (optional) null id of a section. A film plays its own footage (take, beats or video); any other section is recorded scrolling through the built site (at phone size for 9:16)
step integer (optional) null film: the footage under this step (its index in the section's steps), captioned with its headline
beat string (optional) null id of a beat of a beats film (the section is found for you)
range list of 2 numbers (optional) null Part of the source: seconds of a film, or 0-1 scroll progress of a recorded section
Constraints: exactly 2 items.
product string (optional) null A still of site.product from this view (front, three-quarter, side, top, back, hero-low, exploded) with a slow push-in. Needs the product feature; skipped with a note when it is missing
card string (optional) null A type card on the theme background with this headline (<em>…</em> marks accent words)
caption string (optional) null Headline over the shot (<em>…</em> marks accent words). Default: the matching step or section headline; '' for none
kicker string (optional) null Small label above the caption
callouts list of string [] Short feature lines ('24 h cold') set big, one after another on the beat, over this shot
beats integer (optional) null Length on the trailer's beat grid (default: long enough to read the caption, at least a bar)
Constraints: 1 to 64.
speed number 1.0 Playback speed of the footage
Constraints: 0.25 to 4.0.
hold boolean false Freeze the first frame of range instead of playing it
zoom list of 2 numbers (optional) null Push-in: scale at the start and the end of the shot (1 = the whole frame). Default: a slow push on the product reveal and on stills
Constraints: exactly 2 items.
focus list of 2 numbers (optional) null Point (0-1 x, y of the source) that the 9:16 crop and the push-in keep in frame. Default: the product in a take, else the most salient area
Constraints: exactly 2 items.

Used in: Trailer.shots.

Transition

How a section hands over to the next, in the language of film. Without it sections simply follow one another (today's behaviour). The cut takes its own stretch of scroll (length): both pictures are held on screen while the scroll drives the cut, then the page carries on. Reduced motion, and pages without scripts, get a plain cut.

cut: an instant cut at a scroll position with a held beat either side. dissolve: a held cross-dissolve. wipe: the next picture is revealed along a line (direction, angle, soft). iris: it opens from a point as a circle (origin, or closing for the iris that closes on this one). whip: a fast directional blur-pan into the next (direction, blur). match: the end of this section and the start of the next share a shape; the frames scale and move until the two shapes coincide and the picture swaps on the shape (shape, becomes). carry: an element travels from its place here to its place there (carry).

Field Type Default Description
type enum required cut, dissolve, wipe, iris, whip, match or carry
Allowed values: "cut", "dissolve", "wipe", "iris", "whip", "match", "carry".
length number (optional) null Scroll distance the cut takes, in screen heights (defaults: cut 0.8, dissolve 1.2, wipe 1.3, iris 1.4, whip 1.1, match 1.5, carry 1.5)
Constraints: 0.1 to 4.
hold number 0.15 The share of the stretch held still at each end, so each picture is on screen a moment before and after the cut
Constraints: 0 to 0.4.
at number 0.5 cut and match: where in the cut (between the two holds) the picture swaps, 0-1
Constraints: 0.1 to 0.9.
direction enum (optional) null wipe and whip: the way things travel (left: the next picture arrives from the right). Default left
Allowed values: "left", "right", "up", "down".
angle number (optional) null wipe: the edge's direction in degrees (0 right, 90 down); overrides direction
soft number 0.0 wipe and iris: how soft the edge is (0 hard)
Constraints: 0 to 1.
origin list of 2 numbers (optional) null iris: where it opens from, 0-1 across and down the screen (default the middle; with a match, the shape)
Constraints: exactly 2 items.
closing boolean false iris: close on this section (the next shows behind it) instead of opening the next
blur number 1.0 whip: blur strength, 1 is natural
Constraints: 0 to 3.
shape CutAnchor (optional) null match: the shape on this section's last picture. Leave out both shape and becomes to let the engine look for the best-matching pair of shapes (contours)
becomes CutAnchor (optional) null match: the shape on the next section's first picture (default: the same prompt as shape)
zoom number 3.0 match: the most each side may be scaled to bring the shapes to the same size (more than this and they only nearly coincide)
Constraints: 1 to 8.
blend number 0.0 match: a quick cross-dissolve over the swap, as a share of the stretch (0: a hard swap on the shape)
Constraints: 0 to 0.3.
carry Carry (optional) null carry: the element that travels (the section's heading to the next one's by default)

Used in: SceneBase.transition, BlockBase.transition.

TypeTokens

Type sizes. Each value defaults to what the stylesheet has always used.

Field Type Default Description
scale number (optional) null Multiplies every headline size, on phones too (default 1: 1.15 is a seventh larger)
Constraints: at most 4.
body string (optional) null Size of running text (default 17px)

Used in: Theme.type.

WorldObject

One rough shape in a take's world. Only layout, scale and depth matter: the video model paints the detail.

Field Type Default Description
kind enum required Allowed values: "box", "cylinder", "cone", "blob", "plane", "scatter".
name string (optional) null
at list of 3 numbers [0, 0, 0] Centre (x, y, z); z is up
Constraints: exactly 3 items.
size list of 3 numbers [1, 1, 1] box/plane: full width, depth, height; blob: radii
Constraints: exactly 3 items.
radius number 1.0 cylinder/cone radius
depth number 1.0 cylinder/cone height
rotation list of 3 numbers [0, 0, 0] Euler degrees
Constraints: exactly 3 items.
color string "#9a9a9a"
soft boolean false blob: visible in the preview but left out of the depth guide (clouds, haze)
count integer 40 scatter: how many boxes
seed integer 1 scatter: random seed
area list of 4 numbers [-50, -50, 50, 50] scatter: x0, y0, x1, y1
Constraints: exactly 4 items.
height list of 2 numbers [2, 10] scatter: min and max box height
Constraints: exactly 2 items.
footprint list of 2 numbers [3, 6] scatter: min and max box width/depth
Constraints: exactly 2 items.
shape enum "box" scatter: box (buildings, rocks) or cone (pines)
Allowed values: "box", "cone".
clear list of 3 numbers (optional) null scatter: keep (x, y, radius) empty
Constraints: exactly 3 items.

Used in: JourneyBlockout.objects, JourneyBlockout.ground, Take.ground, Take.objects.

WorldPlace

A headline that lives inside the scene. The camera moves and the type goes with the world: it is occluded by what is nearer, it sits on a surface in perspective, it hangs in the haze. The step's title is the text (its <em> words take the theme's accent as everywhere); kicker, body and the button stay an ordinary caption beside it. Works on a film or a sequence with layout: overlay and an at window on the step (a sequence: the product's own alpha is the silhouette, so type set behind it is cut exactly), and on a parallax section's step with a photo. Without WebGL, with reduced motion, and where the headline would be cropped off a narrow screen (a phone held upright), the title falls back to a clean overlay caption.

Field Type Default Description
kind enum required behind: set at a depth in the scene, so what is nearer (a pine, a railing, a building, a person) passes in front of it as the camera moves; surface: painted on a wall, a sign or a floor, tracked to it in perspective, with the surface's light and texture showing through; sky: large type in the haze at far depth, with fog in front
Allowed values: "behind", "surface", "sky".
at number or string (optional) null behind: what the type sits just behind, as a prompt ("the spruce", "the railing"; found on the anchor frame by Florence-2 + SAM 2.1, so it needs ComfyUI the first time) or a depth, 0 far to 1 near, in the shot's own range (default: behind the nearest third of what is in its box). surface: what it is painted on, as a prompt ("the wooden deck", "the white wall"; required unless quad is given). sky: a depth (default 0.07, just in front of the farthest thing)
x number (optional) null Centre across, 0-1 of the frame (behind, sky) or of the surface (surface). Default 0.5
y number (optional) null Centre down, 0-1 of the frame or of the surface. Default 0.5 (sky: 0.3)
size number (optional) null Width of the type, as a fraction of the frame (behind, sky) or of the surface (surface). Default 0.5 behind, 0.72 sky, 0.8 surface
Constraints: at most 1.5.
lines integer (optional) null Break the title into this many lines (default: the layout that fills the width best)
Constraints: 1 to 5.
align enum "center" Alignment of a title of several lines
Allowed values: "left", "center", "right".
caps boolean false Set the title in capitals
track number (optional) null Letter-spacing in em (default: 0 behind, 0.05 on a surface, 0.1 in the sky)
Constraints: -0.1 to 0.6.
weight integer (optional) null Font weight (default: the theme's display weight)
Constraints: 100 to 900.
color string "auto" auto (light or dark ink, whichever reads on the footage under it), ink, paper, accent, or a hex colour
anchor RevealAt (optional) null The frame the thing is found on and the type is laid out on (default: the middle of the step's at window). Pick a frame where it is plainly in view
gap number 0.05 behind (named thing): how far behind it the type sits, in depth units
Constraints: 0 to 0.5.
follow number (optional) null How much of the camera's motion the type follows (behind, sky): 1 moves with the layer it sits in, 0 stays on the screen. Default: what its depth says
Constraints: 0 to 1.5.
haze number (optional) null How much of the scene's air is mixed into the type (behind: 0.12, sky: 0.5): colour and contrast of distance
Constraints: 0 to 1.
fog number 0.55 sky: fog in front of the type, thicker low in the picture and where something far passes in front of it
Constraints: 0 to 1.
blur number (optional) null Softness of the type in pixels of a 1920-wide frame (behind, sky: default matches how sharp the footage is at that depth)
Constraints: 0 to 30.
wear number 0.35 surface: how much of the paint has worn off (the surface's own texture breaks the letters up)
Constraints: 0 to 1.
relief number 0.8 surface: how much of the surface's grain and light shows through the paint
Constraints: 0 to 1.
quad list of list of 2 numbers (optional) null surface: the four corners of the surface on the anchor frame, 0-1, clockwise from the top left, instead of finding it by prompt (the type is then tracked from these corners)
Constraints: exactly 4 items; each: exactly 2 items.
angle number 0.0 surface: turn the type on the surface, degrees
Constraints: -180 to 180.
slant number 1.0 surface: how much of the slant the depth map gives the surface is used (1: as estimated, 0: the type lies flat to the screen). The estimate is a guess from relative depth; lower it when the letters look over-foreshortened
Constraints: 0 to 1.5.
track_model enum (optional) null How the footage is followed: a surface is tracked as a plane seen in perspective (homography); behind and sky as a layer that shifts, turns and zooms (similarity)
Allowed values: "homography", "similarity".

Used in: Step.place.