studio has 32 commands, read from the typer app in engine/cli.py. studio <command> --help prints the same text in the terminal.
Most commands take a project: a folder holding a site.yaml, given as a path or by name (a name is looked up in the projects folder, then in examples/).
Read a live landing page and write a new project that tells it as a scroll site: its hero picture as the opening scene, its sections as blocks, its calls to action with …
Storyboard the site before the full render: <project>/storyboard/ (the page with stills standing in for films, storyboard.html + sheet.jpg with a card per shot and the …
Art directions for the site, pitched like a studio: one brief in, several complete directions out (concept, palette, type, style, imagery, motion), each a board of …
Set the theme's colours from a logo (contrast-checked) and use it as the nav logo, or (--from) write a brand's colours, fonts, radius and logo into theme.from, where …
Polish report for a built film (beats, a take or a video): scores it second by second and beat by beat for pops (jumps, flicker, judder and crossfades that do not line …
The film grammar between a built site's sections (transition:): each cut, how long it is, the shapes a match cut found; with --strip, a frame strip around each one to …
The product as the set: print the route (which parts each stop found, how the camera comes in, where the copy sits on the scroll) and render quick stills of stops or a …
Miniature worlds: lay a diorama section out and say what was decided: the map with the places numbered (diorama/<id>-map.jpg), which step lives at which place, where …
Build the site's cinemagraphs (an image input with cinemagraph:: a still where only one thing moves) and report on each: the loop's seam, how much of the picture …
Check the in-world type of a built film (steps with place: {kind: behind \| surface \| sky}): draws each title's box through the per-frame matrices the page will use on …
Light as the scroll (type: light): build the section, then write what it made to look at, in <project>/light/<section>/: sheet.jpg (every time of day with its drift …
The one-take page (journey: on a film): its approach, every move and hold with the film seconds and scroll they get, and, once built, where each stop's blocks sit on …
Read a live landing page and write a new project that tells it as a scroll site: its hero picture as the
opening scene, its sections as blocks, its calls to action with their links, its brand in theme.from.
Argument
Type
Default
Description
url
text
required
Option
Type
Default
Description
--name
text
Project name (default: from the site's address)
--style
text
Wear one of the styles (engine/styles/) over the brand
--no-gpu
flag
off
Open with a laptop scene (photo parallax) even when a GPU is here
Storyboard the site before the full render: <project>/storyboard/ (the page with stills standing in for films,
storyboard.html + sheet.jpg with a card per shot and the render estimate, animatic.mp4). With --edit: the same
shots as an editing workspace on a local server.
Argument
Type
Default
Description
name
text
required
Option
Type
Default
Description
--level
text
"stills"
sketch (no ComfyUI: blockouts, cached stills, cards), stills (the real first frames) or animatic (stills in motion + animatic.mp4)
--only
text
Redo only these shots (beat, section or block ids); the rest keep their last storyboard frames
--motion
flag
off
animatic: a tiny LTX-2.3 preview per shot (512x288, 2 s) to check motion
--open
flag
off
Open storyboard.html when done
--edit
flag
off
Serve the storyboard as an editing workspace instead: change any shot's text, seed, motion or length (written into site.yaml), regenerate one image at a time, keep every variant, lock and approve shots
--port
integer
--edit: port (default: the first free one of 8971-8979)
--browser / --no-browser
flag
true
--edit: open the browser
--notes
flag
off
Print the open notes written in the editor, each with its shot's current values and image paths (for an agent without MCP), and stop
Art directions for the site, pitched like a studio: one brief in, several complete directions out (concept, palette,
type, style, imagery, motion), each a board of storyboard stills, side by side on one page. Pick one and it is written
into site.yaml. Outputs in <project>/directions/: board.html, board.png (contact sheet), directions.json.
Argument
Type
Default
Description
name
text
required
Option
Type
Default
Description
--n / --count
integer
How many directions (default: the spec's directions.count, 6)
--seed
integer
Another seed, another set of directions (default: the spec's, 1)
--brief
text
What to pitch, in your words (default: the spec's directions.brief)
--pick
text
Write this direction (its letter, or its name) into site.yaml: theme, style, fonts, imagery, pace; copy is never touched. The old file is kept
--undo
flag
off
Put site.yaml back as it was before the last pick
--reroll
text
Another idea in place of this direction (its letter)
--stills
flag
off
Draw the stills of the saved directions again (ComfyUI was down)
--images / --no-images
flag
true
--no-images: placeholder cards instead of Z-Image stills
--sheet / --no-sheet
flag
true
Make board.png (headless Chrome)
--serve
flag
off
Serve the boards in the browser, with a Pick button on each
--port
integer
--serve: port (default: the first free one of 8981-8989)
Set the theme's colours from a logo (contrast-checked) and use it as the nav logo, or (--from) write a brand's
colours, fonts, radius and logo into theme.from, where they can be edited.
Argument
Type
Default
Description
name
text
required
Option
Type
Default
Description
--logo
text
Logo file inside the project (png, svg rendered as png, jpg)
--mode
text
"light"
light or dark
--dry-run / --no-dry-run
flag
off
--from
text
Read a brand from a web page URL, a saved .html page, a logo image or a brand.yaml, and write its tokens into site.yaml as theme.from
Record a scroll-through to MP4 (for README, social posts, Reddit).
Argument
Type
Default
Description
name
text
required
Option
Type
Default
Description
--section
text
--seconds
number
12.0
--out
path
--gif / --no-gif
flag
off
--width
integer
1920
--height
integer
1080
--out-width
integer
--poster-at
number
0.5
Where in the recording (0-1) to take the poster JPG
--pointer
text
Move the mouse while recording, for pictures that follow it (pointer: lenses and lights): 'wander' for a slow tour of the frame, or waypoints 'x,y x,y ...' in 0-1 of the viewport
--cursor / --no-cursor
flag
true
With --pointer: draw a small ring where the pointer is (headless frames have no cursor)
Polish report for a built film (beats, a take or a video): scores it second by second and beat by beat for pops
(jumps, flicker, judder and crossfades that do not line up), softness (looks upscaled), halos (rims and double edges),
style drift (the look moving away from the section's start) and morphs (shapes rebuilding instead of moving). Writes
<project>/.build/inspect/<section>.json and .html (the worst moments with pictures and a line saying what is wrong);
the storyboard editor shows each beat's worst problem. CPU only; unchanged films are answered from the saved report.
With --page it checks the built page instead (see the guide, "Check a page before you ship it"): the report is
<project>/.build/inspect/page/report.json with a contact sheet per screen size, and the exit code is 1 when a check
fails, so a showcase page can be gated on it.
Argument
Type
Default
Description
name
text
required
Option
Type
Default
Description
--section
text
Film section to inspect (default: every film section that has a built film)
--video
path
Inspect any video file as one shot instead (a screen recording, a clip)
--json
flag
off
Print the report as JSON and nothing else
--force
flag
off
Measure again even if the film has not changed
--embed
flag
off
Also measure style drift with a local CLIP embedding (OpenCLIP ViT-H/14 from the Hugging Face cache, CPU, slow; nothing is downloaded)
--open
flag
off
Open the HTML report when done
--page
flag
off
Check the built page instead of its films: screenshots at desktop and phone size (headless Chromium, reduced motion), text over pictures, type, pictures and layout, per section; exits 1 when anything fails. --section limits it to one section
The film grammar between a built site's sections (transition:): each cut, how long it is, the shapes a match
cut found; with --strip, a frame strip around each one to look at.
Argument
Type
Default
Description
name
text
required
Option
Type
Default
Description
--strip
flag
off
Frame strips around each cut of the built site (<project>/.build/cuts/cut_<n>.jpg)
--only
text
Comma-separated cut numbers (default: all)
--mobile
flag
off
Strips at a phone's size (390x844)
--reduced-motion
flag
off
Strips with prefers-reduced-motion on (the cuts fall back to plain cuts)
--frames
integer
9
Frames in each strip
--clip
flag
off
With --strip: also a short video of each cut (cut_<n>.mp4)
Assemble built projects into one static folder: out/<project>/... ready for GitHub Pages or any host.
Cross-links between projects written as ../<project>/dist/ (how the showcase gallery links locally) are
rewritten to ../<project>/. A .nojekyll file keeps GitHub Pages from dropping folders that start with _.
Argument
Type
Default
Description
names
text
required
Option
Type
Default
Description
--out
path
required
Folder to deploy (e.g. a GitHub Pages repo)
--home
text
Project whose page becomes the folder's index.html
The product as the set: print the route (which parts each stop found, how the camera comes in, where the copy
sits on the scroll) and render quick stills of stops or a strip along the route, with a contact sheet.
Argument
Type
Default
Description
name
text
required
Option
Type
Default
Description
--section
text
The type: inside section (when the site has several)
--still
text
Render stills: stop numbers (1,3), all for every stop, wide for the opening shot
--strip
integer
0
Render this many frames spaced evenly along the whole route
--samples
integer
24
Cycles samples for the stills
--scale
number
0.5
Still size as a fraction of the scene's frame size
--out
path
Contact sheet of the stills (default: <project>/inside_<section>.jpg)
Miniature worlds: lay a diorama section out and say what was decided: the map with the places numbered
(diorama/<id>-map.jpg), which step lives at which place, where the camera dives from, how far it orbits. Takes a
couple of seconds and needs no GPU; with --strip it also photographs the built site along the whole scroll.
Argument
Type
Default
Description
name
text
required
Option
Type
Default
Description
--section
text
The diorama section (default: the first)
--strip
flag
off
Also take a frame strip of the built site: every place at rest, and the lift, orbit and dive between places (dioramas/<id>-strip.jpg)
--full
flag
off
Lay the ground out at full resolution (default: draft)
Build the site's cinemagraphs (an image input with cinemagraph:: a still where only one thing moves) and report on each:
the loop's seam, how much of the picture moves, what the page holds still, bytes. Files are in <project>/.build/_cinemagraph/.
studio build makes them too, as part of the page.
Argument
Type
Default
Description
name
text
required
Option
Type
Default
Description
--only
text
Only the cinemagraphs whose moves or spec path contains this text
--force / --no-force
flag
off
Ignore the cache
--list
flag
off
List the cinemagraphs in the spec and their cache state, build nothing
--check
flag
off
Instead of building, measure the BUILT page (dist/) in Chrome: is everything but the moving part truly still, does the loop hitch, does reduced motion show the still
Check the in-world type of a built film (steps with place: {kind: behind | surface | sky}): draws each title's box
through the per-frame matrices the page will use on the film's own frames (with the depth map beside them for behind and
sky type), measures how steady the track is and how much of the time the type is on screen, and says what to change.
Writes .build/<section>/world/sheet.jpg and report.json: read the sheet.
Argument
Type
Default
Description
name
text
required
Option
Type
Default
Description
--section
text
The film section (default: every film with in-world type)
Light as the scroll (type: light): build the section, then write what it made to look at, in
<project>/light/<section>/: sheet.jpg (every time of day with its drift from the world, raw and aligned), strip_*.jpg (the page
across each transition, the same scroll positions a viewer passes through) and light.json (drift, edge agreement and
how far apart neighbouring times are). The drift is how far the editor moved the place, in pixels at 1024 across.
Argument
Type
Default
Description
name
text
required
Option
Type
Default
Description
--section
text
The light section (default: every one)
--build / --no-build
flag
true
Build the section first (cached stages are skipped)
The one-take page (journey: on a film): its approach, every move and hold with the film seconds and scroll they get,
and, once built, where each stop's blocks sit on its picture and the contrast they reach.
Argument
Type
Default
Description
name
text
required
Option
Type
Default
Description
--section
text
The film section, when there is more than one journey