Render launch film
Reusable agent skills published through skills.sh
npx -y skills add MohtashamMurshid/skills --skill render-launch-filmAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 16 days oldThe repository was created 16 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Build a launch video or motion-design sequence as a deterministic, seekable web page, then render it frame by frame into an MP4 with headless Chrome and ffmpeg. Use when asked for a launch film, product announcement video, release teaser, animated sequence, motion graphics, kinetic typography, sizzle reel, or an explainer video generated from a repository, docs, or spec — including requests to reproduce a motion-design sequence seen in a reference video or link.
SKILL.md
7.3 KB, ~1.7k tokens by cl100k_base, as published. Nobody here has run it
Render Launch Film
Produce a finished MP4, not a storyboard. The film is a web page whose every frame is a pure function of time; a renderer then asks headless Chrome for one screenshot per frame and hands the frames to ffmpeg.
This approach is chosen because it is the only way to author motion in an environment without a video editor and still deliver a real video file: the page is directly inspectable, the timeline is seekable, and any frame can be re-examined as a still.
Requirements
- Node 22+ (for the bundled renderer),
ffmpegon PATH, and Chrome or Chromium (CHROME_PATHif it is installed somewhere unusual). - If Chrome or ffmpeg is unavailable, still build the page and deliver it as a self-playing sequence, and say plainly that the MP4 could not be encoded.
The contract
These five rules make the film renderable. Breaking any one of them produces frames that differ between runs.
- A single
render(t)writes every animated value from scratch, every frame. - No CSS transitions and no CSS animations anywhere inside the stage.
- No frame reads state left by the previous frame.
- The page exposes
window.__ready,window.__duration, andwindow.__seek(t). - The first frame waits for
document.fonts.ready, so text metrics never shift mid-render.
assets/starter/engine.js already satisfies all five. Copy the starter rather than rebuilding the runtime.
Workflow
Track progress explicitly:
- [ ] 1. Harvest facts
- [ ] 2. Steal the brand
- [ ] 3. Write the shot list
- [ ] 4. Scaffold from the starter
- [ ] 5. Author shots
- [ ] 6. Review as stills
- [ ] 7. Render and verify
- [ ] 8. Hand off
1. Harvest facts
Read the repository, spec, or docs before designing anything. Collect real numbers, real command names, real file names, real API signatures. A launch film is persuasive because the details are true, and invented details are the fastest way to lose a technical audience.
If the product does not yet do what the film shows, put a small honest marker on the title card — target design, preview, coming in v1 — and tell the user which element to delete once it ships.
2. Steal the brand
Pull the palette, type scale, gradient recipes, and logo geometry out of the product's own stylesheet, icon files, or screenshots. Reuse its exact hex values and font families. A launch film that looks like the product is worth more than a beautiful film that looks like a template.
Rebuild the logo as inline SVG so its parts can be animated individually.
3. Write the shot list
Draft the whole film as a table of start, end, and one sentence per shot before writing code. Aim for 6–9 shots and 40–60 seconds. Give every shot exactly one job, and one number, name, or line the viewer should remember.
A structure that works for software: cold open → title claim → the command or gesture → what you get → proof in code → how it runs → what it becomes → endcard.
See references/shot-recipes.md for eight shot patterns with working code.
4. Scaffold from the starter
Copy assets/starter/ into the target directory and replace the tokens in sequence.css with the brand values. The starter is a runnable three-shot film: engine.js is boilerplate to keep, sequence.js is the film to replace.
5. Author shots
Register each shot on an absolute timeline, overlapping neighbours by the fade length so the engine crossfades them:
shot("terminal", 12.4, 20.2, (root, q) => {
const card = q("card");
return (t) => { // t is local to the shot
const enter = outQuint(p(t, 0, 1.1));
O(card, enter);
T(card, 0, mix(26, 0, enter));
};
});
Read references/timeline-contract.md for the helper vocabulary, geometry measurement, and the mistakes that silently break determinism.
Read references/motion-language.md for easing choices, stagger steps, hold times, and composition rules.
6. Review as stills
Never assume the layout works. Rendering one still per shot is fast and is the only reliable way to judge composition:
node scripts/render.mjs --dir ./film --stills 3,9,16,24,33,40,46,52 --sheet
Inspect film/stills/sheet.png and fix what it exposes: elements colliding, dead space in half the frame, text too small at 1080p, a curve crossing type, uppercase transforms mangling a file path. Then re-render the stills. Expect three or four rounds.
Also sample the transition instants — the frames where two shots overlap — and the first and last second of the film.
7. Render and verify
node scripts/render.mjs --dir ./film --fps 30 --keep-frames --out film/launch.mp4
Then confirm the encode, not just the capture, by pulling frames back out of the MP4 and tiling them:
ffprobe -v error -show_entries format=duration -show_entries stream=width,height,nb_frames \
-of default=noprint_wrappers=1 film/launch.mp4
Capture runs at roughly 4 frames per second at 1080p, so budget about 7 minutes for 54 seconds at 30 fps and double that at 60 fps. Deliver 30 fps unless the film has fast linear moves. Details and failure modes are in references/rendering.md.
8. Hand off
Report the output path, resolution, frame rate, duration, and file size. Keep the MP4 and the frame and still directories out of version control — they are regenerated output, and an encoded film is megabytes that would land in history on every copy edit.
State clearly that the page is the source and the MP4 is a build artifact, so edits go into sequence.js and the film is re-rendered.
Failure modes
| Symptom | Cause |
|---|---|
| Capture stalls with idle CPU | Frames were piped into the encoder and the pipe broke. Capture to disk, encode after. |
| Frames differ between runs | A CSS transition or animation survives inside the stage, or a value carries over between frames. |
| Text jumps in the first second | The first frame rendered before webfonts loaded. |
| Measured geometry is wrong | Positions were measured before layout settled, or viewport rects were used without dividing out the preview scale. |
| Contact sheet is out of order | Files were globbed instead of passed in timeline order. |
| An element never appears | Its window falls outside the shot's own start–end range. |
Resources
- references/timeline-contract.md — runtime contract, helpers, determinism traps
- references/shot-recipes.md — eight shot patterns with code
- references/motion-language.md — timing, easing, type, composition
- references/rendering.md — renderer flags, performance, encoding
scripts/render.mjs— capture, stills, contact sheets, encodingassets/starter/— runnable three-shot film to copy
What ships with it: 9 files
54.7 KB alongside SKILL.md, 3 of them executable
assets/
- starter/engine.jsruns7.0 KB
- starter/index.html2.8 KB
- starter/sequence.css6.7 KB
- starter/sequence.jsruns3.5 KB
references/
- motion-language.md4.4 KB
- rendering.md4.7 KB
- shot-recipes.md6.3 KB
- timeline-contract.md5.7 KB
scripts/
- render.mjsruns13.6 KB