Motion Video with Audio (launch-film style)
Turns a brief into a finished, mastered MP4: launch-film visuals (warm paper, big serif headlines, one terracotta accent, chat demo typing itself, bars revealing the winner, quiet logo outro) plus a complete soundtrack:
- Voice-over — one optional
voline per scene, synthesized with edge-tts. Scenes size themselves to the narration. - Music — an original ambient score synthesized to the exact timeline (pad, sub, piano arpeggios, soft pulse, riser, and a resolving hit on the logo frame). Royalty-free because it's generated from code. Or use the user's own track.
- SFX — whooshes on cuts, ticks on words/bars, typing while the reply types, a chime on the winning bar, counter ticks, impact + shimmer on the logo. Placed inside the scene components, so they stay in sync automatically.
- Mix — music ducks under narration; final files are normalized to −14 LUFS / −1.5 dBTP (social/YouTube target).
All content lives in one file, src/storyboard.ts.
Workflow
-
Understand the brief. Get: brand/product name, the one message to remember, 2–5 supporting points, real numbers (if any), target length, platform, narration language and voice gender. If the user gave enough, don't interrogate; state your assumptions. Never present invented benchmark numbers as real — use visibly labelled placeholders (
footnote) or skip the benchmark. -
Scaffold.
bash <skill-dir>/scripts/new_project.sh <target-dir>Needs Node 18+, ffmpeg, and
edge-ttson PATH (pipx install edge-tts) with internet for narration. Check withwhich edge-tts ffmpegfirst; if edge-tts is missing and can't be installed, build withoutvoand tell the user. -
Write the storyboard. Read
references/style-guide.md(visual pacing, copywriting, recipes) andreferences/audio.md(narration writing, voices, music/SFX/mix settings). Scene types (fields insrc/types.ts):type use for headlinekinetic type: opener, section titles, closing line. *word*= accent italicchatUI demo: prompt → thinking dots → typed reply (with typing sound) benchmarkhorizontal bars, one highlight: truebar (chime when it lands)bigNumbera big stat counting up (counter ticks + impact) features2–4 numbered capability cards (pop per card) logooutro: drawn mark or logoSrc, name, tagline, CTA (music hit lands here)Each scene: optional
vo, optionaldurationInFrames(30 fps; omit it on narrated scenes to auto-fit), optionaltone: 'light' | 'dark'. Leave thelogoscene withoutvo— let the music hit breathe. -
Build audio — this also fixes the final timeline:
cd <target-dir> && npm run audioRead the printed timeline: per-scene start, length, narration length, and "(stretched to fit vo)" warnings. If a scene got stretched a lot, shorten its
voinstead — long narration makes slow, sleepy scenes. -
Visual QA (stills are fast, renders aren't):
npx tsc --noEmit bash <skill-dir>/scripts/contact_sheet.sh <target-dir> Main-16x9 /path/sheet-wide.png bash <skill-dir>/scripts/contact_sheet.sh <target-dir> Main-9x16 /path/sheet-tall.pngRead the PNGs; fix overflow, crowding, more than one accent per scene.
-
Audio QA without ears — after rendering, check loudness and look at the mix:
ffmpeg -i out/video-16x9.mp4 -af ebur128=peak=true -f null - 2>&1 | grep -E "I:|Peak:" ffmpeg -y -i out/video-16x9.mp4 -filter_complex "showwavespic=s=1800x300" -frames:v 1 /path/wave.pngExpect I ≈ −14 LUFS, peak ≤ −1 dBFS, narration bursts clearly standing above the music bed, and the biggest swell at the logo.
-
Render (runs
audio→ both formats → mastering):npm run render # → out/video-16x9.mp4, out/video-9x16.mp4~30 s video ≈ 1–2 min. Report paths, duration, voice used, and mention
npm run studiofor live preview with sound.
Customizing
- Brand colors/fonts:
src/theme.tstokens only. - Logo: file in
public/,logoSrc: 'logo.svg'. - Own music: file in
public/,audio.music: 'track.mp3'(only tracks the user has rights to). Own recorded narration: seereferences/audio.md. - New scene types / formats / codecs:
references/extending.md.
Brand and honesty guardrails
Emulate the style, not the brand: don't reproduce Anthropic's (or anyone's) logo or present the video as an official release of a company the user doesn't represent. Synthetic voices must not imitate a real, identifiable person. Benchmarks: real user data or visibly marked illustrative.