motion-launch-videos: A Claude Code plugin for kinetic-typography launch videos
motion-launch-videos is a free, open-source Claude Code plugin that turns a short brief, or just a product URL, into a looping kinetic-typography launch video. The whole film is one self-contained HTML file, rendered on your machine to an MP4 with real motion blur and a seamless loop.
What the film says
- STOP GUESSING. / WHAT WORKS ON YOUR X ACCOUNT
- READS YOUR OWN POSTS. / ARCHIVE OR READ-ONLY IMPORT
- HOOKS. FORMATS. TOPICS. TIMES.
- PATTERNS THAT HOLD UP. / AT LEAST 5 POSTS / 500 RANDOM DRAWS
- CRUX / CRUXPOST.COM / REQUEST EARLY ACCESS
/plugin marketplace add Kimeur/motion-launch-videos
/plugin install motion-launch-videos@motion-launch-videosThen ask for a film in plain words, from inside your project: “Make a 12 second launch bumper for https://example.com”
What does motion-launch-videos make?
A short, loud, looping film of type for a launch or a brand sting: a hook, what the product does, a proof, then the call to action. It runs 6 to 20 seconds, with at most four words of display type per beat and a single call to action.
- Deliverables
- An H.264 MP4 with BT.709 colour tags and no audio track, a preview GIF, a poster PNG, and the single HTML file the film lives in. That file previews in Chrome: Space pauses, the arrow keys step one frame.
- Formats
- Square 1080 × 1080 by default, vertical 1080 × 1920 (9:16) or wide 1920 × 1080 (16:9).
- Defaults
- 12 seconds, 60 fps, a 120 BPM beat grid, muted, and the brand colours read from the product's site.
- Copy
- 3 to 5 beats in the product's own words. Every fact is logged in
BRIEF.mdwith the URL it came from. - Not for
- Screen recordings, narrated explainers, talking heads or long product demos.
How does it turn a brief into a video?
Claude works through six steps, and nothing is rendered in full until the review stills pass.
Brief
It reads the product's live site, asks at most one round of questions (message, format, duration, palette) or uses the defaults, and writes
BRIEF.mdwith every fact and its source.Copy
Hook, what it does, proof, call to action: at most four words a beat, lifted from the product's own words. No prices or numbers the site does not show.
Design spec
DESIGN.mdputs every beat on an 8 px baseline grid and a tempo grid, with palette roles, contrast ratios, type roles, springs and transitions.Build
It copies the engine template, fills in its
FILMconfig, fetches the fonts, builds one self-contained HTML file and settles the baselines from the measured cap heights.Critique
Automated checks, review stills and a contact sheet. It fixes what fails and looks again.
Render and verify
A pixel-exact loop check, then the MP4, the GIF and the poster, then ffprobe facts, colour tags and decoded frames compared with the canvas.
The techniques inside the engine
One file, one clock
The film is a canvas page whose
seek(t)draws any moment fromtalone: no timers, noDate, noMath.random, no state between frames. The fonts are embedded, so the page loads nothing over the network.Closed-form springs
Every move is a sum of damped springs evaluated in closed form, one per target change, and snapped to exactly 1 once settled. Any frame can be drawn on its own.
Kinetic type, one glyph at a time
Kerning is recovered from
measureTextpair widths, lines are fitted so their ink spans the measure exactly, and each glyph enters on its own springs, staggered on the tempo grid.Designed accents
Misregistration on landing frames only, a mask wipe through the outgoing line's own letterforms, and camera punch-ins and smash-pans on the beat.
Real motion blur
Each frame averages 1 to 64 subframes on a 270° shutter, about one per 5 px of movement, and never blurs across a hard cut.
A pixel-exact loop
Frame 0 is the lockup at rest and the film ends by rebuilding it.
loopcheckcompares the canvas pixels at the seam and requires every difference to be 0.Critique before the render
Checks for glyph coverage, words per beat, live area, collisions, letter gaps, contrast, palette, the loop tail and blank frames, plus stills Claude reads before the full render.
Checked output
H.264 with BT.709 tags in the stream, faststart, the exact frame count, and decoded frames compared with the canvas pixels.
What do you need to run it?
- Node 20 or newer. The scripts need one package,
playwright-core, installed next to them or in your project. Nothing is installed globally. - ffmpeg and ffprobe with libx264 (
brew install ffmpegorapt install ffmpeg). - A Chromium:
CHROME_PATH, one already in the Playwright cache, a system Google Chrome, or the one playwright-core installs. Firefox and WebKit are not supported. - Network access once per film, to fetch the fonts from the npm registry.
render.mjs doctor checks all of this and prints the exact command for anything missing.
Tested on macOS (Apple silicon) only, so far
The scripts also look for Chromium where Linux and Windows keep it, but those platforms have not been tested yet. If you run it there, a report on GitHub helps.
What does it run, fetch and send?
Everything runs on your machine, inside the project you are working in.
- It reads the public web pages of the product you point it at, to take the copy from the product's own words.
- It fetches three open-source fonts (Archivo Black, Syne and IBM Plex Mono, under the SIL Open Font License) from the npm registry and embeds them in the HTML file.
- It installs one npm package,
playwright-core, next to its scripts to drive a local headless Chromium. If no Chromium is found, it can download Playwright's build, andrender.mjs doctorprints that command first. - It runs your local ffmpeg and ffprobe to encode and verify the MP4.
- It reads only local paths from the environment (
CHROME_PATH,PLAYWRIGHT_BROWSERS_PATH,FFMPEG_PATH,FFPROBE_PATH,PATH). No credentials, no API keys. - It sends nothing anywhere else: no analytics, no accounts. It asks you before any commit, push or upload.
Questions people ask
Is motion-launch-videos free?
Yes. The plugin is open source under the MIT licence, and the fonts it fetches are under the SIL Open Font License. It runs inside Claude Code, so you need Claude Code itself.
Does it need an API key?
No. It reads no credentials, needs no API keys and has no account to create. Apart from reading the product's site, it only downloads one npm package, the fonts and, if you have none, a Chromium.
What formats does it render?
An H.264 MP4 without sound, a preview GIF and a poster PNG, all from one HTML file you can open in Chrome. Square 1080 × 1080 is the default; 1080 × 1920 and 1920 × 1080 work too. Beat plans are ready for 8, 10, 12 and 15 seconds, and any other length from 6 to 20 seconds works if it is a multiple of half a second (a whole number of beats at 120 BPM).
How long does a render take?
On an Apple-silicon Mac, the 8-second template demo (480 frames) renders in about 60 seconds, and its review stills take about 5. Fast moves cost the most, up to 64 subframes a frame, and a 1920 × 1080 film takes about 1.8 times as long per frame as a square one.
Can I use my brand colours and fonts?
Yes. By default it reads the brand colours from your site's CSS custom properties and theme-color tags, or you give it a palette. The critique then fails any colour outside the palette and any display type under 3:1 contrast (4.5:1 for small print). Any Fontsource face can replace one of the three default fonts; check its licence.
What if my product has no website?
Then your brief is the only source, and the film says nothing your brief does not. It will not fetch a domain just because it shares your product's name, and a fictional product gets a line on screen that says so.
Source, docs and the demo
GitHub repository
Source, README and the install instructions
SKILL.md
The workflow, ground rules and pass criteria Claude follows
The Crux example
Brief with sources, design spec, the HTML film, MP4, GIF and poster
MIT licence
Covers the code and docs; the fonts keep their SIL OFL licence
Crux
The product the demo was made for: X analytics for people who post
Made by Marouane Gazouzi, Senior Data Engineer in Paris, building in public. More about me →