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.
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).
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.
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.
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 onlyAllowed 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 momentAllowed 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.
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¶
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 tConstraints: 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 moveConstraints: 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 ~1280x720Constraints: 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 offConstraints: 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 moveConstraints: 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 ~1280x720Constraints: 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 repaintsConstraints: 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 offConstraints: 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.3Allowed 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.
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.
Used in: ImageInput.cinemagraph.
CodeFile¶
One file on the route through the codebase.
Used in: CodeScene.files.
CodeTerminal¶
The agent's prompt box the scene opens on; the camera dives through it into the code.
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".
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.
Used in: DioramaScene.camera.
DioramaLook¶
The miniature look: shallow tilt-shift depth of field, high soft sun, toy saturation.
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.
Used in: DioramaScene.places.
DioramaProp¶
One extra thing set on the diorama by hand, beside what the world generates.
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 screenConstraints: exactly 2 items. |
step |
integer (optional) | null |
With at: which step (0-based) it waits throughConstraints: 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.
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).
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.
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.
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.
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 boxesAllowed values: "sharpest", "last". |
pick_window |
integer | 6 |
How many of the last frames pick: sharpest looks atConstraints: 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).
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.
Used in: CameraMove.keys, CameraPreset.keys, Freeze.camera.
FreezeLayer¶
A subject that gets its own plane.
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.
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.
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.
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.
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.
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 thirdConstraints: 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 stopAllowed 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 atConstraints: 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 exactlyConstraints: 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 livesConstraints: 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.
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.
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.
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 itConstraints: 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.
Link¶
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).
Used in: ImageInput.live.
Logo¶
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.
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]).
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.
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 pictureAllowed 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).
Used in: Take.product.
ProductShot¶
A still of the site's product, rendered by Cycles in a studio light and cached.
Used in: ImageInput.product.
Rating¶
A rating line: stars, the score and where it comes from ('4.9 from 860 reviews').
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.
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¶
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.
Used in: HeroBlock.signup.
SpaceTokens¶
Page spacing. Each value defaults to what the stylesheet has always used.
Used in: Theme.space.
SplatKey¶
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).
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.
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 orderAllowed 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¶
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 showAllowed 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 shorthandAllowed 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 outConstraints: 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 tooAllowed 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.
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.
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.
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.