Communitygithub.com

evgenspm/launchfilm

QA a rendered launch film before anyone ships it. Use for "QA the video", "check the render", "is it ready to post", "review the film", "why does it look cheap", "check the captions/safe zones/loudness", after every render and before package. Reads the CLI's automatic report (`npx launchfilm qa <slug>`), contact sheets and stills at key timestamps, then checks text-at-time readability, contrast, platform safe zones, loudness (−14 LUFS, −1.5 dBTP), ffprobe encode specs, black and frozen frames, cuts on the beat, and the 12 amateur tells as blocking checks. Writes qa/<slug>/QA.md where every line cites a file or a measured number; a check that was not run says NOT CHECKED, never PASS. Use scene-build to fix picture problems it finds, sound to fix the mix, launch-film for the whole pipeline, reference-study for reference videos.

What is launchfilm?

launchfilm is a Claude Code agent skill that qA a rendered launch film before anyone ships it. Use for "QA the video", "check the render", "is it ready to post", "review the film", "why does it look cheap", "check the captions/safe zones/loudness", after every render and before package. Reads the CLI's automatic report (`npx launchfilm qa <slug>`), contact sheets and stills at key timestamps, then checks text-at-time readability, contrast, platform safe zones, loudness (−14 LUFS, −1.5 dBTP), ffprobe encode specs, black and frozen frames, cuts on the beat, and the 12 amateur tells as blocking checks. Writes qa/<slug>/QA.md where every line cites a file or a measured number; a check that was not run says NOT CHECKED, never PASS. Use scene-build to fix picture problems it finds, sound to fix the mix, launch-film for the whole pipeline, reference-study for reference videos.

Works with~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/evgenspm/launchfilm/tree/HEAD/skills/film-qa

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

film-qa

You check frames and numbers, not intentions. A PASS needs evidence: a file path you opened or a number you measured. Anything else is NOT CHECKED: <reason>. Never write PASS for something you did not look at or measure.

Paths (relative to launch-video/, or studio/ in the launchfilm repo): film source films/<slug>/ (film.json, STORYBOARD.md, BRIEF.md), renders out/<slug>/, QA qa/<slug>/ (the CLI writes report.md; you write QA.md next to it). Exact CLI flags: npx launchfilm <cmd> --help. Commands with tested syntax: references/commands.md.

Procedure

  1. Automatic pass. npx launchfilm qa <slug> → read qa/<slug>/report.md first (sheets, ffprobe, loudness, automatic checks). Copy its measured numbers into QA.md as evidence; don't re-measure what it measured.
  2. Sheets. Open every contact sheet the report lists (or npx launchfilm sheet <slug>). Read every cell. List the files you opened in QA.md (T12 evidence).
  3. Stills. npx launchfilm still <slug> <t> --preset <id> for each preset the film ships, at: every shot boundary
    • 6 fr, every text onset + hold/2, frame 0, the last frame, and every interval the freeze or black-frame scan flags. Plus one still at --scale 0.25 (480×270 for 16:9) on the hero text frame: the X timeline preview. Read each PNG.
  4. Measure what the report did not: loudness, true peak, black frames, frozen intervals, cut times vs beats, contrast behind text, safe zones, caption line lengths. Commands in references/commands.md.
  5. Blocking checks T1–T12 below, then delivery checks D1–D16. Each gets PASS / FAIL / NOT CHECKED + evidence + rule.
  6. Write qa/<slug>/QA.md from references/qa-template.md.
  7. Fix loop. Any FAIL: hand the finding to scene-build or sound with frame numbers, re-render only the affected range (npx remotion render … --frames=<a>-<b> or the CLI equivalent), re-check those items. Max 2 loops; then report the remaining FAILs to the user with stills attached. Never downgrade a FAIL to PASS without new evidence.

Blocking checks: the 12 tells (craft/00)

IdPass conditionEvidence
T1 staticno frozen interval ≥ 0.6 s except the end-card settle (≤ 3 s); every flagged interval verified by stills at its start and end showing drift or motionfreezedetect output + 2 stills per interval
T2 default easinggrep G1 (scene-build) empty in films/<slug>; no CSS transitionsgrep output
T3 all at onceevery group of ≥ 3 siblings enters staggered (partial states visible in a sheet cell or stagger ≥ 1 fr in code); group entrance ≤ 24 frsheet cell refs or code lines
T4 one speedfilm > 20 s has ≥ 1 rhythm break (silence, smash cut to black, palette flip, hold ≥ 2× median shot); launch mode: every cut within ±2 fr of a beatfilm.json boundaries vs beats.json; detected cuts
T5 soundevery film.json visual event has an sfx or is covered by VO/music; music ducks under VO; true silence where plannedevent count with/without sound; loudness of a VO window vs a music-only window
T6 text as labelhero text ≥ 8 % of frame height when text is the message (statements 10 %); every text holds ≥ 0.2 × (words + 1) s; ≤ 3 lines; captions ≤ 2 linesper-item table
T7 flat looklaunch mode: grain + vignette present; one named treatment per section; product mode: hairlines, soft shadows; no banding in the darkest gradient of the mp4 stillgrep + still from the mp4
T8 web layoutone focal point per still; no paragraph > 3 lines; no bullets; UI chrome only where the chrome is the pointstills
T9 generic stockevery footage clip in films/<slug>/footage/SOURCES.md with source + license; stock clips graded and cut ≤ 1.5 sSOURCES.md + stills
T10 decorative transitionstransitions ⊂ vocabulary; non-cut transitions ≤ 1 per 5 s; blur-dissolve ≤ 12 frfilm.json
T11 template before storySTORYBOARD.md has approved:; frame 0 not black and differs from the still at 0.5 s; category of product clear by 1.5 s (x, li) / 1 s (reel); payoff after the problem; ≥ 2 s calm on brand surface at the endstills 0, 0.5, 1.5 s, last 2 s
T12 never lookedthis QA: every sheet and still listed as openedfile list in QA.md
Any FAIL in T1–T12 blocks render-for-delivery and package.

Delivery checks (per preset; numbering = craft/08#delivery-checks)

Values from harness.config.json presets, else craft/10#presets. Use these ids exactly; craft/08 and QA.md share them.

IdPass condition
D1video h264, profile High (Remotion's ffprobe prints 100), pix_fmt yuv420p, container mp4
D2width × height exactly the preset's
D3constant fps = composition fps (r_frame_rate = avg_frame_rate)
D4duration = film.json ±1 fr, and inside the preset's length range (x-16x9 ≤ 140 s, reel-9x16 ≤ 90 s)
D5audio aac LC (Remotion's ffprobe prints 1), 48000 Hz, 2 channels, ~192 kbps; hero-loop: no audio stream
D6integrated loudness −14 ±1 LUFS; true peak ≤ −1.5 dBTP; VO −16…−14 LUFS where measurable
D7moov before mdat (faststart)
D8poster = frame 0 of that preset exists, same size, not black (YAVG > 20), shows the hook
D9SRT next to the render for every preset with VO; same phrases as the captions; HH:MM:SS,mmm; ≤ 2 lines; ≥ 0.8 s each; times ±2 fr
D10nothing important (captions, text, logo, the UI being used) outside the preset's safe zone (overlay still)
D11captions burned on every preset with VO (hero-loop: none, ph-16x9 per its config); ≤ 2 lines; ≤ 42 chars/line (16:9), ≤ 32 (4:5, 1:1, 9:16); never over the changing element; contrast ≥ 4.5:1 for captions and text over footage, ≥ 3:1 accent on bg; readable on the 480 px (16:9) and 360 px (4:5, 9:16) wide stills
D12freeze and black lists match the designed holds and black beats only (listed in film.json or STORYBOARD)
D13BT.709 tags or untagged HD; the darkest gradient shows no new banding in the mp4 still vs the PNG
D14file size under the cap: x ≤ 512 MB, README hero ≤ 10 MB
D15out/<slug>/credits.txt lists every CC BY asset with its credit line; films/<slug>/footage/SOURCES.md complete
D16hero-loop only: frame N equals frame 0; a 3× looped file shows no jump at the seams

Text-at-time readability

For every text item in film.json (statements, captions, labels, UI copy the VO points at): words, in/out frames, hold = (out − in) / fps, required = 0.2 × (words + 1) s. Also check at the 480×270 still that the hero line is still readable (letters distinguishable). One row per item in QA.md.

Rules for the report

  • Every PASS cites evidence: qa/<slug>/stills/x-16x9-12.30.png, I = −14.2 LUFS, grep G1: 0 lines.
  • Measured numbers keep units and the tool that produced them (system ffmpeg 8.1 ebur128 or remotion ffmpeg loudnorm). Remotion's bundled ffmpeg lacks ebur128, signalstats, freezedetect, tile, drawbox and rawvideo output: use a system ffmpeg for those and say so; if none exists, those items are NOT CHECKED.
  • A FAIL names the frame range, the rule (craft/NN#anchor or T#/D#) and the proposed fix.
  • The summary block says READY only when T1–T12 and D1–D16 are all PASS (D16 only for hero-loop) (NOT CHECKED counts as not ready, with reason).

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

evgenspm/launchfilm

Brand intake for a launch film, product video or promo: capture the product's real colors, fonts, logo, radius and theme from the user's repo (Tailwind config, CSS variables, shadcn tokens, next/font, logo SVG), then the live website, then screenshots, and write films/<slug>/brand.json with a source for every value. Use when starting a new film, when the brand, logo or colors changed, or when the user says "use my brand / my colors / my logo". Hard stop if capture fails: never invent a logo or colors. Not for picking a look or grade (scene-build, craft/06) or for writing copy (story).

evgenspm/launchfilm

Launch video, launch film, product video, product launch, promo, teaser, trailer, demo video, Product Hunt video, X / LinkedIn launch clip, reel, hero loop, motion graphics, "make a video for my product", Remotion film. Router and gated pipeline for making a pro product-launch film with the launchfilm studio in ./launch-video: brief, brand intake, story and storyboard (user approves), sound, scene build, frame QA, render per platform preset, package, post copy, one-time credit note. Use this first for any request to make, remake or revise a launch or product film; it calls the sibling skills (brand-intake, story, sound, scene-build, recipes, film-qa, launch-post). Do not use it to study a reference video (use reference-study), to browse recipes only (use recipes), or for generic Remotion questions unrelated to a launch film.

evgenspm/launchfilm

Write the launch post that goes with the film: X / Twitter post, LinkedIn post, Product Hunt tagline, description and maker comment, written in the founder's own voice, concrete, no AI slop ("excited to announce", em dashes, buzzwords). Triggers: write the tweet, launch post, LinkedIn post, Product Hunt copy, PH tagline, maker comment, caption for the video, announcement copy. Use after the film is rendered (or when the user asks for post copy for an existing film); starts from `npx launchfilm post <slug>` and the film's BRIEF.md and STORYBOARD.md, writes out/<slug>/POST.md. Never posts anything. Not for the film's own on-screen script or VO (story).

evgenspm/launchfilm

Find launchfilm recipes (published launch films studied frame by frame and written down as text, some with ready Remotion code) and build the user's film from 1 to 3 of them. Use for "use a template", "start from a recipe", "make a 30s launch film from recipe <id>", "something like this style", "show me options", "which recipe fits a 30 s vertical launch", "remix recipe X with our brand", or when a storyboard needs a proven hook, feature beat, logo reveal or end card. Searches recipes/CATALOG.md or recipes/index.json, scores and picks 1 to 3, shows each with its source link, reads the recipe.md beat sheet, then scaffolds with `npx launchfilm new <slug> --recipe <id>`: ready code when Recipe.tsx exists, else TODO scenes built from the beat sheet with studio presets, keeping the recipe's timings, springs and sounds re-timed to the user's length and beat grid. Use reference-study to make a new recipe, story for the storyboard, scene-build for scenes, launch-film for the whole pipeline.

Related Skills