video-editor
Video editor
One skill owns the film from product discovery to final MP4. A request such as “make a product launch video” is enough to start: inspect the product and choose the story. The bundled Remotion scaffold and local sound editor are packaged assets to copy or run as needed; their source does not need to be loaded into model context. They share the edit.json cut map. Keep working projects, renders, music, and mix recipes outside this skill. The scaffold is a placeholder, not product evidence.
- Preflight: run scripts/preflight.mjs. Fix blockers; apply the printed workarounds (a local Chrome for Remotion, self-hosted fonts) before scaffolding.
- Discover and choose: Inspect the product's docs, source, live UI, and available assets. Read story. Default to a launch film. Inventory every capability and mark each hero, montage, or omit; with no further brief, cover the default beats in story.md (hook, first contact, core loop, 3-4 heroes, a breadth montage, the differentiator, a call to action) in 20-30 s. Choose a focused demo when the user asks for a demo or names one feature without asking for a launch; an explicit launch request wins. A whole website can be the subject of either mode.
- Classify and stage: Read fidelity and staging. Mark each visible element as primary product UI or accessory context. Reuse or record the real primary UI and its actual motion by default; for interactive UI, record the running product with
capture/record.mjs, one take per surface. Do not invent a replacement component or animation because the source is difficult to render. The user must explicitly request abstraction before primary UI can be redesigned. If the product misbehaves on camera, film a truthful path and report the bug. - Direct: Read scenes. Plan one composition per shot and set cuts in
src/edit.json. Every cut must change the picture: a different surface, a visibly different state, or a declared two-tierpunch; a reframe of the same surface is a camera move inside one shot, never a cut. Declaresurfaceon each product scene, and build camera shots withfootageScene()so the zoom on screen is checked against the tiers. Keep it snappy: short approaches, 12-20 frame result holds, 30-60 frame clips. Transitions come out of the product (a theme flood, a gesture-direction wipe) as handoffs, two or three per film. Show breadth with a beat-cut montage (montage.mjs), and once the music exists snap every cut to it (beats.mjs). Read text when the film has on-screen words. - Render and review: Read render. Run scripts/scaffold.mjs from the installed skill to create a standalone project from assets/launch and assets/capture.
node qc.mjschecks framing and aligns the frames either side of every cut to catch same-picture cuts. Inspect the in/out stills of every cut side by side and the silent assembledout/film.mp4. Compare featured UI states and motion against the running product or source captures, then watch at playback speed to check whether an unfamiliar viewer can name the features and see their results. Technical QC cannot answer either question. Revise weak or inaccurate scenes before sound work. A changed cut or picture requires a fresh sound review. - Sound and export: Read soundtrack methodology. In the packaged editor, run
npm ci. Without a supplied song, generate the bed withnode bed.mjs --film <s> --drop <first reveal s>. Choose the sounds with sound design (the product's own sounds first; one sound per role; design missing ones withsfx.mjs, whooshes as long as their motion), write a cue sheet with aroleper cue from the recorder's press frames and the picture's results, then either runnode render-mix.mjs(headless: recipe, per-cue level report, -14 LUFS master) or open the visual editor withnpm start -- --video /absolute/film.mp4 --edit /absolute/edit.json --cues /absolute/cues.json. Fix any cue the level report flags as buried, then runnode listen.mjson the final file and look at its annotated spectrogram. Watch the encoded MP4 through the last frame. Counted cues or a passing export do not establish creative quality. - Log the dogfood: add what worked and what did not to the dogfood log, and fold any repeatable fix back into this skill.
The visual editor adjusts music and sound cues; picture cuts live in the Remotion project. edit.json uses { "cuts": [{ "scene": "name", "in": 0, "out": 60 }] } at 30 fps, and the bundled sound editor reads it directly. A cue sheet uses scene-local frame numbers; see the soundtrack methodology. Keep the film and song with the saved JSON recipe because it references their timing. Node 22.12+, FFmpeg, and FFprobe are required for the full workflow.