This template produces 33.8 s at 30 fps, 1920×1080, in 11 scenes. It is built for viewers who have never heard of the product: it shows the pain first, then the product catching exactly that pain, then how to get it. The whole film is driven by a JSON brief. Example: examples/prismor/brief.json (Prismor, an AI-agent runtime security tool). Storyboard: references/storyboard.md.
Workflow
-
Understand the product. Read its README or site. Pull out:
- the 4–9 concrete dangerous or painful actions it prevents (as real-looking terminal lines)
- the verdicts it produces
- 8 features, each one word or phrase plus a line of detail
- the install commands
- the tagline, the brand colours and the logo motif
Use the product's real vocabulary: its rule names, CLI verbs, version.
-
Script. Write the problem lines (
rogue_lines) so they escalate, and make the last one the scariest. Makeinterceptreplay the same actions with a verdict each, ending on one ALLOWED so it doesn't read as "blocks everything". -
Brief. Copy the example brief and replace
copy,theme,verdicts,holo(brand light palette) and theassetsprompts. Validate withpython3 scripts/launch.py check --brief brief.json. -
Images. Put the brand's real logo at
assets/logo.png(square PNG with alpha); never generate or reinterpret it. Thenpython3 scripts/launch.py assets --brief brief.jsongeneratesthreat(medium) andholo(low) with gpt-image-2. -
Check and review.
checksamples the whole cut and fails on any text overflow. It also warns when copy had to shrink below 80%; shorten that copy. Then look atstill --brief … 3 7.5 10.5 14 20 25 29 33orsheet. -
Render:
render --brief … [--audio track.mp3]. It takes about 4 min on 2 cores. Cuts land on a 0.55 s beat in the features scene, so a ~110 BPM track fits.
Image slots
| Slot | Scene | Framing |
|---|---|---|
threat |
rogue terminal background (shown at 42% brightness) | dark, ominous, one red light source; the subject on the right third (the terminal covers the left) |
logo |
reveal, end card, dashboard | the brand's real mark, supplied by the user or the brand site; square PNG with alpha |
holo |
brand light: split reveal, feature beats, CTA text fill, logo glow | full-frame abstract texture in the brand palette, no objects |
Brief keys (copy)
hook[2]: typed cold-open lines.names[n] +names_end: machine-gun list (integrations, platforms).rogue_title,rogue_lines[{text, kind}]. kind ∈agent|inject(red highlight) |cmd($ …) |leak|dim|ok.rogue_captions[[line1, line2] × 3]: line 2 is shown in the danger colour.meet,brand,product_sub.intercept_title,intercept_caption,intercept[{cmd, verdict, rule, out?}].outis an extra output line coloured by its verdict. Verdict colours come from top-levelverdicts.features[8 × {word, sub}]: word ≤ 16 chars.dashboard{app, title, nav[6], cards[4 × [label, value]], chart_title, dist_title, table_title, rows[4 × [call, agent, rule, verdict]]} anddashboard_caption.install_title,install[{text, kind}],install_agents[names, typed as one line],install_caption.tagline,cta,links,license.
Timing: "scenes": {"names": 0} drops a scene; "speed": 1.2 shortens everything.
Design rules
- Never use pills, chips or badges. Verdicts, statuses and CTAs are typeset text (colour, weight, leader lines, rules).
- Every string has a width budget. Long terminal lines word-wrap inside their window, and
checkmust pass before rendering. - Use the brand's real logo only, and no literal visual puns on the brand name.
Guardrails
- Only use a brand the user owns or has asked for. Keep claims factual: every feature and number shown should come from the product's own docs.
- Fake secrets in terminal lines must be obviously fake. Never paste a real key into a brief.
- Change motion in
scripts/launch.py, never inscripts/framesmith/, which is vendored from the repo'score/.