Product Launch Motion
A production discipline for making launch films that look like a motion designer made
them — not a slideshow with a voiceover on top.
The output is a rendered MP4. The medium is HTML, CSS and GSAP, rendered frame-by-frame
by a deterministic seek-based renderer (HyperFrames by default). Everything here is
transferable to any renderer that can seek a timeline; the laws are renderer-neutral,
the plumbing examples are HyperFrames.
This skill exists because green tooling is not the same as good film. A composition
can lint clean, render without error, and still be a slideshow. The value below is the
craft that separates the two, plus the traps that cost real hours to find — each one
recorded with the measurement that proves it, not the vibe that suggested it.
It is a discipline, not a template. The laws below are fixed; the look is not, and
deciding it is your job as director. Two films built from this skill should be
unmistakably different from each other — different palette, ground, camera personality,
type, texture, sound and structure — because they are arguing different claims for
different audiences. Before you build anything, write three genuinely different visual
directions and kill two: references/11-creative-direction.md. Reaching for the reference
film's look because it is documented here is the one failure mode that makes everything
else worthless.
When to use this
Use it for: a product launch or feature-announcement film (20–90s), a landing-page hero
video, a demo reel, a conference sizzle, an investor-update film, or a rescue pass on a
video that "looks basic".
Do not use it for: talking-head editing, screen-recording with captions slapped on, or
anything where the deliverable is a live web page rather than a video file.
The ten laws
Break one and the film reads amateur, however good the individual frames are. Note what
they do not cover: none of them tells you what the film should look like.
1 · Truth first. Every number, logo, face, screenshot and testimonial on screen is
real and sourced. Before animating anything, write down the approved figures — the exact
list of numerals allowed to appear — and refuse every other number. Invented metrics and
stock faces are the fastest way to make a real product look fake. → references/02-story-and-truth.md
2 · Word-locked sync. Every reveal is cued to the measured start time of the word it
illustrates. Not to a beat grid, not to an estimate — to a word-level transcript of the
actual voiceover file. A frame at t=0 shows only what the voice is saying at t=0.
→ references/03-word-locked-sync.md
3 · Determinism. No Math.random, no Date.now, no CSS transitions, no
repeat/yoyo. Any scattered or noisy value is derived from an index or the playhead.
A seek to time T must reproduce byte-identical output, or your render is a lottery.
→ references/01-renderer-contract.md
4 · One camera, two nodes. A whole-shot rotation and a mid-shot scale must live on
different elements. On the same element they fight over one transform matrix and the
move judders. Outer node = dolly (scale), inner node = 3D turn (rotation + perspective).
→ references/05-camera-3d-cursor.md
5 · The cursor is a stage prop. A life-size pointer (~32px at 1920) disappears into
any saturated control. Draw it at ~44×54 with a heavy stroke and a deep shadow, put it
inside the node the camera moves, and put the zoom origin exactly on the control it
clicks — that point becomes a fixed point of the transform and the aim survives the push
with no compensating maths. → references/05-camera-3d-cursor.md
6 · Sound is arithmetic, not taste. A cue's volume cannot rescue a quiet source file.
If the asset sits 20 dB under the narration bed, raising its volume moves the mix by
tenths of a dB — measured, not guessed. Level the asset, then verify the cue landed in
the delivered file. → references/07-sound-and-master.md
7 · Nothing ends moving. Every shot resolves. Motion is cued to meaning; a shot still
drifting when it cuts reads as a screensaver, and a shot where everything drifts
independently reads as one too. Scope: this governs resolution, not stillness. A
single-take film whose camera never stops satisfies it by decelerating to rest before the
end; a shot that holds a deliberate slow move while its content is settled satisfies it
too. What it forbids is a shot cutting while the thing it was saying is still arriving.
→ references/04-motion-grammar.md
8 · Ration the accent. Two grounds (one for the argument, one for the product), one
accent colour or gradient, and a written budget for where it may appear — typically:
one emphasis word per headline, stat numerals, the active step, state flips, the CTA.
A third hue is almost always a mistake. → references/06-look-and-grade.md
9 · Green gates are necessary, not sufficient. Lint, layout and contrast passes catch
none of the things that make a film bad. After every render, extract frames from the
delivered file at the beats you changed, look at them, and write down what is wrong
before anyone else does. → references/08-qa-and-direction.md
10 · No house style. The look is derived from this product's claim, brand, audience
and category — never inherited from the last film or from the examples in this repo. Write
three different directions, pick one, and give the film a signature move that no other film
has. A film that could be a competitor's film with the logo swapped has no direction.
→ references/11-creative-direction.md
Red flags
These are the thoughts that precede every skipped step. Each one is a signal to stop and
do the thing you are about to talk yourself out of.
| The thought |
What it actually means |
| "I'll estimate the timings and fix them later" |
You will not. Every cue will be wrong, and re-deriving them all costs more than doing it once now |
| "Three directions is overkill for this one" |
You have one idea and no basis for believing it is good. Two of the three are meant to die |
| "The brand is purple, so this palette is fine" |
Check whether you derived it or inherited it from the examples here |
| "It sounds fine to me" |
You are listening on the machine that rendered it, at a volume you chose, knowing what to listen for. Measure it |
| "The change is in the source, so it's in the film" |
Two documented bugs in this repo's history were exactly that. Sample the delivered file |
| "The gates passed" |
Gates catch broken, not bad. They have never once caught a boring film |
| "It's a small tweak, no need to re-verify" |
Small tweaks are how a −14 LUFS master became a clipped one |
| "I'll just overwrite the last render" |
Then you cannot prove the fix worked, and the version the director preferred is gone |
| "They said make it 3D, so I'll add rotation" |
Take the note as a symptom, not a spec. "Make it 3D" meant a camera rig, a cursor rebuild and a coordinate refactor |
| "I'll add the camera move at the end" |
A camera changes what every coordinate means. Retrofitting a rig means redoing every position in the shot |
| "It's close enough to on-the-word" |
200ms off reads as lag to a viewer who cannot name why |
Violating the letter of a law is violating the law. "Mostly deterministic" is
non-deterministic; "roughly on the word" is off the word.
The pipeline
Fourteen steps. Do not skip 1, 2, 5 or 13 — they are the ones people skip, and they are
the ones that decide whether the film is any good.
Steps 1–3 are a loop, not a sequence: the direction depends on which real assets exist,
and the truth pass often kills a direction outright (you cannot shoot a raking-light
product film for a product that has not been manufactured). Cycle them until they agree,
then go forward.
| # |
Step |
Output |
Reference |
| 1 |
Intake — the product, the audience, the ONE claim, the angle (usually the product's own headline) |
BRIEF.md |
assets/BRIEF.md |
| 2 |
Direction — three genuinely different visual directions, judged and cut to one, plus a signature move |
direction block |
references/11-creative-direction.md |
| 3 |
Truth pass — collect real assets, real screens, real customers, and fix the approved-figures list |
assets/, figures list |
references/02-story-and-truth.md |
| 4 |
Script — 40–60s written for the ear; one clause per beat; the claim lands in the first 10s |
SCRIPT.md |
references/02-story-and-truth.md |
| 5 |
Voiceover — render or record the VO before building anything; frame durations come from real VO length |
assets/voice/*.wav |
references/03-word-locked-sync.md |
| 6 |
Word timings — transcribe with word-level timestamps into a cue table |
audio_meta.json |
scripts/word-timings.mjs |
| 7 |
Storyboard — frames, durations, the register map from your direction, and a shot per beat |
STORYBOARD.md |
references/09-shot-catalog.md |
| 8 |
Build frames — one HTML file per frame; camera rig and cursor from the skeleton; every tween cued to a word |
compositions/frames/*.html |
references/04-motion-grammar.md |
| 9 |
Assemble — index, transitions, audio, grade — in that order, every time |
index.html |
references/01-renderer-contract.md |
| 10 |
Gates — lint/runtime/layout/motion with the grade on; contrast with the grade off |
0 errors |
references/08-qa-and-direction.md |
| 11 |
Render + master — two-pass loudnorm, limiter, re-encode |
renders/*.mp4 |
scripts/master.sh |
| 12 |
Verify in the delivered file — frames at the changed beats, cue levels measured |
evidence |
scripts/verify-cue.sh |
| 13 |
Direct — watch it, list the defects yourself, fix, re-render as a NEW file |
v2, v3, … |
references/08-qa-and-direction.md |
| 14 |
Ship the set — vertical cut, captions, poster, loop, stills, licences |
deliverables/ |
references/12-deliverables.md |
Build order (step 9) is not negotiable
The index is generated, so anything hand-added to it is destroyed on re-assemble and must
be re-injected. Every wiring script here is idempotent (it replaces its own marked block),
so the safe move is always to re-run the whole chain:
node scripts/assemble.mjs # film.json + measured VO → index.html
node scripts/transitions.mjs # the crossings between frames
node scripts/wire-audio.mjs # music bed + word-locked SFX cues
node scripts/wire-grade.mjs # grain + vignette + specular sweeps
assemble.mjs reads film.json (assets/film.example.json is a filled-in one) and
measures every frame from its voiceover with ffprobe, so you never type a duration.
It applies the arithmetic each downstream cue depends on: hold = VO + pad — the breath
after the last word, because a shot that cuts on the last syllable reads as rushed — and
duration = hold + the outgoing transition. The next frame starts at hold, not at
duration; the difference is the overlap the transition lives in.
Reference map
Load only what the current step needs.
| File |
What's in it |
references/11-creative-direction.md |
Read this first. What is fixed and what is free, the direction dials, deriving a look from the product, diverging to three directions, the signature move, five worked directions, and the anti-sameness checks |
references/01-renderer-contract.md |
How HTML becomes video: timed tracks, the seekable timeline, determinism rules, build order, and what to do on Remotion instead |
references/02-story-and-truth.md |
Angle, arc, the register map, the approved-figures discipline, honesty rules, and how to source real assets for any product |
references/03-word-locked-sync.md |
Getting word timings, writing the cue table, pacing, holds, and why VO comes first |
references/04-motion-grammar.md |
Easing, entrances, staggers, anticipation, speed ramps, kinetic type, and the two failure modes (slideshow / screensaver) |
references/05-camera-3d-cursor.md |
The two-node camera rig, turntable, dolly, zoom-to-detail, rack focus, z-parallax, and the full fake-cursor spec |
references/06-look-and-grade.md |
Palette rationing, glass borders without backdrop-filter, film grain, vignette, specular sweeps, and the blend-mode trap |
references/07-sound-and-master.md |
SFX design, sub-bass, silence before the hero beat, the volume-arithmetic law, asset levelling, and the mastering chain |
references/08-qa-and-direction.md |
The gates, snapshot review, verifying the delivered file, and the director loop that turns a v1 into a v7 |
references/09-shot-catalog.md |
14 shot constructions to adapt — prompt/composer, results list, workspace, pipeline tracker, stat count-up, testimonial, comparison, hardware hero, terminal, map, chart, end card. Never a running order to copy |
references/10-traps.md |
Every trap we hit, each with the measurement that proves it. Read this before debugging anything |
references/12-deliverables.md |
The set that actually ships: vertical re-layouts, platform safe areas, captions from your existing word timings, poster frame, loops, naming and handoff |
Scripts
All are dependency-light Node/bash, all idempotent, all safe to re-run.
| Script |
Does |
scripts/assemble.mjs |
Writes index.html from film.json, measuring every frame's length from its voiceover instead of letting you guess it |
scripts/transitions.mjs |
Injects the between-frame crossings — dissolve, zoom-through, push, cut — at the instant each frame's narration ends |
scripts/wire-audio.mjs |
Mounts a music bed + a cue table of SFX into the assembled index, resolving frame-relative cue times against real frame starts |
scripts/wire-grade.mjs |
Injects the film grade: playhead-seeded grain, vignette, and specular sweeps at times you pass (--sweeps 7.9:0.9,…; no sweeps unless you ask). Each treatment is independently switchable; --off removes the whole block for the contrast gate |
scripts/level-sfx.mjs |
Fixes the quiet-source problem: cuts from the first transient, applies a fixed --gain through a limiter, and prints before/after measurements. It reports; it deliberately does not declare a cue "audible" |
scripts/word-timings.mjs |
Turns a word-level transcript into the cue table the frames read |
scripts/master.sh |
Two-pass loudnorm → true-peak limiter → -crf 19 -tune film re-encode → verification readout |
scripts/verify-cue.sh |
Measures a time window in the delivered MP4, so you can prove a cue is audible instead of assuming it |
Templates
| Template |
Use |
assets/BRIEF.md |
Intake: product, audience, claim, angle, constraints, approved figures |
assets/STORYBOARD.md |
Frame-by-frame plan with durations, register, shot type and VO line |
assets/film.example.json |
The assemble manifest: frames, voiceover, pads and transitions — the reference film's real one |
assets/cues.example.json |
The SFX cue table format, annotated |
assets/frame-skeleton.html |
A working frame: camera rig, glass borders, cursor with the full click stack, and a word-cued timeline. Copy this, don't retype it |
Definition of done
A launch film is finished when all of these are true. Anything less, say so plainly
rather than shipping quietly.
Worked example
examples/CASE-STUDY.md walks the real film this skill was extracted from: a 44.2s
B2B SaaS launch film, 11 frames, seven rounds of notes from "this is very basic" to
delivered — with the specific note, the specific fix, and the measurement for each pass.
Read it when you want to see the loop in step 12 actually running.
1---2name: product-launch-motion3description: Use when making, directing or rescuing a product launch video, promo, teaser, demo reel, sizzle, feature-announcement film or animated product explainer built from code — and when an existing one looks basic, reads as a slideshow, has reveals that miss the voiceover, an invisible cursor, an inaudible sound effect, a clipped or too-quiet mix, or every video coming out looking the same. Covers SaaS, apps, hardware, e-commerce, dev tools, services. Keywords include motion design, storyboard, voiceover sync, kinetic typography, GSAP, HyperFrames, Remotion, film grain, LUFS, ffmpeg.4---56# Product Launch Motion78A production discipline for making launch films that look like a motion designer made9them — not a slideshow with a voiceover on top.1011The output is a rendered MP4. The medium is HTML, CSS and GSAP, rendered frame-by-frame12by a deterministic seek-based renderer (HyperFrames by default). Everything here is13transferable to any renderer that can seek a timeline; the laws are renderer-neutral,14the plumbing examples are HyperFrames.1516**This skill exists because green tooling is not the same as good film.** A composition17can lint clean, render without error, and still be a slideshow. The value below is the18craft that separates the two, plus the traps that cost real hours to find — each one19recorded with the measurement that proves it, not the vibe that suggested it.2021**It is a discipline, not a template.** The laws below are fixed; the *look* is not, and22deciding it is your job as director. Two films built from this skill should be23unmistakably different from each other — different palette, ground, camera personality,24type, texture, sound and structure — because they are arguing different claims for25different audiences. Before you build anything, write three genuinely different visual26directions and kill two: `references/11-creative-direction.md`. Reaching for the reference27film's look because it is documented here is the one failure mode that makes everything28else worthless.2930## When to use this3132Use it for: a product launch or feature-announcement film (20–90s), a landing-page hero33video, a demo reel, a conference sizzle, an investor-update film, or a rescue pass on a34video that "looks basic".3536Do not use it for: talking-head editing, screen-recording with captions slapped on, or37anything where the deliverable is a live web page rather than a video file.3839## The ten laws4041Break one and the film reads amateur, however good the individual frames are. Note what42they do **not** cover: none of them tells you what the film should look like.4344**1 · Truth first.** Every number, logo, face, screenshot and testimonial on screen is45real and sourced. Before animating anything, write down the approved figures — the exact46list of numerals allowed to appear — and refuse every other number. Invented metrics and47stock faces are the fastest way to make a real product look fake. → `references/02-story-and-truth.md`4849**2 · Word-locked sync.** Every reveal is cued to the measured start time of the word it50illustrates. Not to a beat grid, not to an estimate — to a word-level transcript of the51actual voiceover file. A frame at t=0 shows only what the voice is saying at t=0.52→ `references/03-word-locked-sync.md`5354**3 · Determinism.** No `Math.random`, no `Date.now`, no CSS transitions, no55`repeat`/`yoyo`. Any scattered or noisy value is derived from an index or the playhead.56A seek to time T must reproduce byte-identical output, or your render is a lottery.57→ `references/01-renderer-contract.md`5859**4 · One camera, two nodes.** A whole-shot rotation and a mid-shot scale must live on60*different* elements. On the same element they fight over one transform matrix and the61move judders. Outer node = dolly (scale), inner node = 3D turn (rotation + perspective).62→ `references/05-camera-3d-cursor.md`6364**5 · The cursor is a stage prop.** A life-size pointer (~32px at 1920) disappears into65any saturated control. Draw it at ~44×54 with a heavy stroke and a deep shadow, put it66*inside* the node the camera moves, and put the zoom origin exactly on the control it67clicks — that point becomes a fixed point of the transform and the aim survives the push68with no compensating maths. → `references/05-camera-3d-cursor.md`6970**6 · Sound is arithmetic, not taste.** A cue's volume cannot rescue a quiet source file.71If the asset sits 20 dB under the narration bed, raising its volume moves the mix by72tenths of a dB — measured, not guessed. Level the *asset*, then verify the cue landed in73the delivered file. → `references/07-sound-and-master.md`7475**7 · Nothing ends moving.** Every shot resolves. Motion is cued to meaning; a shot still76drifting when it cuts reads as a screensaver, and a shot where everything drifts77independently reads as one too. *Scope:* this governs **resolution, not stillness**. A78single-take film whose camera never stops satisfies it by decelerating to rest before the79end; a shot that holds a deliberate slow move while its content is settled satisfies it80too. What it forbids is a shot cutting while the thing it was saying is still arriving.81→ `references/04-motion-grammar.md`8283**8 · Ration the accent.** Two grounds (one for the argument, one for the product), one84accent colour or gradient, and a written budget for where it may appear — typically:85one emphasis word per headline, stat numerals, the active step, state flips, the CTA.86A third hue is almost always a mistake. → `references/06-look-and-grade.md`8788**9 · Green gates are necessary, not sufficient.** Lint, layout and contrast passes catch89none of the things that make a film bad. After every render, extract frames from the90**delivered file** at the beats you changed, look at them, and write down what is wrong91before anyone else does. → `references/08-qa-and-direction.md`9293**10 · No house style.** The look is derived from *this* product's claim, brand, audience94and category — never inherited from the last film or from the examples in this repo. Write95three different directions, pick one, and give the film a signature move that no other film96has. A film that could be a competitor's film with the logo swapped has no direction.97→ `references/11-creative-direction.md`9899## Red flags100101These are the thoughts that precede every skipped step. Each one is a signal to stop and102do the thing you are about to talk yourself out of.103104| The thought | What it actually means |105|---|---|106| "I'll estimate the timings and fix them later" | You will not. Every cue will be wrong, and re-deriving them all costs more than doing it once now |107| "Three directions is overkill for this one" | You have one idea and no basis for believing it is good. Two of the three are meant to die |108| "The brand is purple, so this palette is fine" | Check whether you derived it or inherited it from the examples here |109| "It sounds fine to me" | You are listening on the machine that rendered it, at a volume you chose, knowing what to listen for. Measure it |110| "The change is in the source, so it's in the film" | Two documented bugs in this repo's history were exactly that. Sample the delivered file |111| "The gates passed" | Gates catch broken, not bad. They have never once caught a boring film |112| "It's a small tweak, no need to re-verify" | Small tweaks are how a −14 LUFS master became a clipped one |113| "I'll just overwrite the last render" | Then you cannot prove the fix worked, and the version the director preferred is gone |114| "They said make it 3D, so I'll add rotation" | Take the note as a symptom, not a spec. "Make it 3D" meant a camera rig, a cursor rebuild and a coordinate refactor |115| "I'll add the camera move at the end" | A camera changes what every coordinate means. Retrofitting a rig means redoing every position in the shot |116| "It's close enough to on-the-word" | 200ms off reads as lag to a viewer who cannot name why |117118Violating the letter of a law is violating the law. "Mostly deterministic" is119non-deterministic; "roughly on the word" is off the word.120121## The pipeline122123Fourteen steps. Do not skip 1, 2, 5 or 13 — they are the ones people skip, and they are124the ones that decide whether the film is any good.125126Steps 1–3 are a **loop, not a sequence**: the direction depends on which real assets exist,127and the truth pass often kills a direction outright (you cannot shoot a raking-light128product film for a product that has not been manufactured). Cycle them until they agree,129then go forward.130131| # | Step | Output | Reference |132|---|---|---|---|133| 1 | **Intake** — the product, the audience, the ONE claim, the angle (usually the product's own headline) | `BRIEF.md` | `assets/BRIEF.md` |134| 2 | **Direction** — three genuinely different visual directions, judged and cut to one, plus a signature move | direction block | `references/11-creative-direction.md` |135| 3 | **Truth pass** — collect real assets, real screens, real customers, and fix the approved-figures list | `assets/`, figures list | `references/02-story-and-truth.md` |136| 4 | **Script** — 40–60s written for the ear; one clause per beat; the claim lands in the first 10s | `SCRIPT.md` | `references/02-story-and-truth.md` |137| 5 | **Voiceover** — render or record the VO *before* building anything; frame durations come from real VO length | `assets/voice/*.wav` | `references/03-word-locked-sync.md` |138| 6 | **Word timings** — transcribe with word-level timestamps into a cue table | `audio_meta.json` | `scripts/word-timings.mjs` |139| 7 | **Storyboard** — frames, durations, the register map from your direction, and a shot per beat | `STORYBOARD.md` | `references/09-shot-catalog.md` |140| 8 | **Build frames** — one HTML file per frame; camera rig and cursor from the skeleton; every tween cued to a word | `compositions/frames/*.html` | `references/04-motion-grammar.md` |141| 9 | **Assemble** — index, transitions, audio, grade — in that order, every time | `index.html` | `references/01-renderer-contract.md` |142| 10 | **Gates** — lint/runtime/layout/motion with the grade on; contrast with the grade off | 0 errors | `references/08-qa-and-direction.md` |143| 11 | **Render + master** — two-pass loudnorm, limiter, re-encode | `renders/*.mp4` | `scripts/master.sh` |144| 12 | **Verify in the delivered file** — frames at the changed beats, cue levels measured | evidence | `scripts/verify-cue.sh` |145| 13 | **Direct** — watch it, list the defects yourself, fix, re-render as a NEW file | v2, v3, … | `references/08-qa-and-direction.md` |146| 14 | **Ship the set** — vertical cut, captions, poster, loop, stills, licences | `deliverables/` | `references/12-deliverables.md` |147148### Build order (step 9) is not negotiable149150The index is generated, so anything hand-added to it is destroyed on re-assemble and must151be re-injected. Every wiring script here is idempotent (it replaces its own marked block),152so the safe move is always to re-run the whole chain:153154```bash155node scripts/assemble.mjs # film.json + measured VO → index.html156node scripts/transitions.mjs # the crossings between frames157node scripts/wire-audio.mjs # music bed + word-locked SFX cues158node scripts/wire-grade.mjs # grain + vignette + specular sweeps159```160161`assemble.mjs` reads `film.json` (`assets/film.example.json` is a filled-in one) and162**measures** every frame from its voiceover with `ffprobe`, so you never type a duration.163It applies the arithmetic each downstream cue depends on: `hold = VO + pad` — the breath164after the last word, because a shot that cuts on the last syllable reads as rushed — and165`duration = hold + the outgoing transition`. The next frame starts at `hold`, **not** at166`duration`; the difference is the overlap the transition lives in.167168## Reference map169170Load only what the current step needs.171172| File | What's in it |173|---|---|174| `references/11-creative-direction.md` | **Read this first.** What is fixed and what is free, the direction dials, deriving a look from the product, diverging to three directions, the signature move, five worked directions, and the anti-sameness checks |175| `references/01-renderer-contract.md` | How HTML becomes video: timed tracks, the seekable timeline, determinism rules, build order, and what to do on Remotion instead |176| `references/02-story-and-truth.md` | Angle, arc, the register map, the approved-figures discipline, honesty rules, and how to source real assets for *any* product |177| `references/03-word-locked-sync.md` | Getting word timings, writing the cue table, pacing, holds, and why VO comes first |178| `references/04-motion-grammar.md` | Easing, entrances, staggers, anticipation, speed ramps, kinetic type, and the two failure modes (slideshow / screensaver) |179| `references/05-camera-3d-cursor.md` | The two-node camera rig, turntable, dolly, zoom-to-detail, rack focus, z-parallax, and the full fake-cursor spec |180| `references/06-look-and-grade.md` | Palette rationing, glass borders without `backdrop-filter`, film grain, vignette, specular sweeps, and the blend-mode trap |181| `references/07-sound-and-master.md` | SFX design, sub-bass, silence before the hero beat, the volume-arithmetic law, asset levelling, and the mastering chain |182| `references/08-qa-and-direction.md` | The gates, snapshot review, verifying the delivered file, and the director loop that turns a v1 into a v7 |183| `references/09-shot-catalog.md` | 14 shot *constructions* to adapt — prompt/composer, results list, workspace, pipeline tracker, stat count-up, testimonial, comparison, hardware hero, terminal, map, chart, end card. Never a running order to copy |184| `references/10-traps.md` | Every trap we hit, each with the measurement that proves it. Read this before debugging anything |185| `references/12-deliverables.md` | The set that actually ships: vertical re-layouts, platform safe areas, captions from your existing word timings, poster frame, loops, naming and handoff |186187## Scripts188189All are dependency-light Node/bash, all idempotent, all safe to re-run.190191| Script | Does |192|---|---|193| `scripts/assemble.mjs` | Writes `index.html` from `film.json`, measuring every frame's length from its voiceover instead of letting you guess it |194| `scripts/transitions.mjs` | Injects the between-frame crossings — dissolve, zoom-through, push, cut — at the instant each frame's narration ends |195| `scripts/wire-audio.mjs` | Mounts a music bed + a cue table of SFX into the assembled index, resolving frame-relative cue times against real frame starts |196| `scripts/wire-grade.mjs` | Injects the film grade: playhead-seeded grain, vignette, and specular sweeps at times you pass (`--sweeps 7.9:0.9,…`; no sweeps unless you ask). Each treatment is independently switchable; `--off` removes the whole block for the contrast gate |197| `scripts/level-sfx.mjs` | Fixes the quiet-source problem: cuts from the first transient, applies a fixed `--gain` through a limiter, and prints before/after measurements. It reports; it deliberately does not declare a cue "audible" |198| `scripts/word-timings.mjs` | Turns a word-level transcript into the cue table the frames read |199| `scripts/master.sh` | Two-pass loudnorm → true-peak limiter → `-crf 19 -tune film` re-encode → verification readout |200| `scripts/verify-cue.sh` | Measures a time window in the *delivered* MP4, so you can prove a cue is audible instead of assuming it |201202## Templates203204| Template | Use |205|---|---|206| `assets/BRIEF.md` | Intake: product, audience, claim, angle, constraints, approved figures |207| `assets/STORYBOARD.md` | Frame-by-frame plan with durations, register, shot type and VO line |208| `assets/film.example.json` | The assemble manifest: frames, voiceover, pads and transitions — the reference film's real one |209| `assets/cues.example.json` | The SFX cue table format, annotated |210| `assets/frame-skeleton.html` | A working frame: camera rig, glass borders, cursor with the full click stack, and a word-cued timeline. Copy this, don't retype it |211212## Definition of done213214A launch film is finished when all of these are true. Anything less, say so plainly215rather than shipping quietly.216217- [ ] Three directions were written and two were killed; the chosen one is recorded218- [ ] The film has a signature move you can name in one sentence219- [ ] It does not look like the examples in this repo, or like the last film you made220- [ ] Every on-screen number is on the approved-figures list221- [ ] Every reveal sits on its word (spot-check five at random against the transcript)222- [ ] Gates: 0 errors with the grade on; contrast passes with the grade off223- [ ] No frame is still moving when it cuts224- [ ] The delivered MP4 has been sampled at every changed beat and looked at225- [ ] Loudness measured on the delivered file: −14 LUFS ±0.5, true peak ≤ −1 dBTP226- [ ] Every SFX cue you added is measurably present in the delivered file227- [ ] Renders are versioned (`video-v3.mp4`), never overwritten228- [ ] The deliverable set exists, not just the master — vertical cut, captions, poster229- [ ] Third-party licences (music, SFX, fonts, photography) recorded with the handoff230- [ ] You have written down what you would fix next231232## Worked example233234`examples/CASE-STUDY.md` walks the real film this skill was extracted from: a 44.2s235B2B SaaS launch film, 11 frames, seven rounds of notes from "this is very basic" to236delivered — with the specific note, the specific fix, and the measurement for each pass.237Read it when you want to see the loop in step 12 actually running.