Skills / Motion Video

Motion Video

Brief or "go all out" → shot list → code → a scored, frame-accurate video. Your agent becomes a motion designer and director that checks its own frames.

templates/showreel: one square through seven techniques, cut on a 124 BPM grid, with a synthesized score. Turn the sound on.

Examples

Each example is a real run of the skill on a fixture in examples/. Nothing here is mocked up.

Example 1

"Go all out": a 15-second showreel with its own score

YouMake a dynamic 15-second motion graphics video that shows what an incredible motion designer you are, like it's your showreel for a résumé. Go all out.

Creative-freedom mode. The concept is one vermilion square carried through seven techniques: squash and stretch with onion skins, a rippling type grid, a 3D cube turning on the beat, a liquid morph, particles assembling into a word, a graph editor whose curve then drives the move, and a match cut where the ball becomes the title's full stop. Cuts land on a 124 BPM grid; ink floods mark the two big beats, and the synthesized score puts a whoosh, hit, riser or drop on every cut.

The rendered showreel. Sound on: the score and every cue are synthesized from the composition.
Twelve evenly spaced frames from the showreel
The filmstrip the agent reviews before rendering the final video.
Result
15.0s, 1920×1080, 60fps, 900 frames, with a 25-cue synthesized score at -14 LUFS
Command
node scripts/render.mjs examples/showreel/index.html --trc srgb
Input
showreel/index.html
◆ Check passed: no layout or timing issues found.
◆ Filmstrip (12 frames) → examples/output/showreel/filmstrip.png
◆ Score synthesized (driving, 124 BPM, 25 cues, -14.0 dBFS RMS)
◆ Done in 17.6s (capture 15.0s, 60.0 shots/s) → examples/output/showreel/showreel.mp4 (3.87 MB, 900 frames, 15s)

Example 2

A launch film for a real Mac app, cut on its own keystroke

YouMake a 15-second launch video for Copse, our macOS clipboard manager, for the website and X. Use the real app: real screenshots, icon, name, tagline and brand look. 16:9, with sound.

Brief mode with a real product. The agent read the repo for the tagline, price, brand tokens and fonts, then built the film from the app's own dark-mode panel snapshots. The tagline is split by the keystroke: real clip rows float around "Everything you copy.", ⌘ ⇧ V lands on three beats and the rows snap into the real panel. The camera pushes onto search, the actions menu and paste, and the icon's three trees grow into the Copse icon for the lockup. The score drops on the V press and puts a cue on every key and cut.

Every UI frame is a real Copse screenshot; the score and cues are synthesized from the composition.
Twelve frames from the Copse launch film
Hook over real clip rows, the panel, search, the actions menu, the trees and the lockup.
Result
15s, 1920×1080, 60fps, 3.1 MB, with a 28-cue synthesized score at -14 LUFS
Command
node scripts/render.mjs examples/copse-launch/index.html --trc srgb --crf 24 --motion-blur 4 -o examples/output/copse-launch/copse-launch.mp4
Input
copse-launch/index.html copse-launch/storyboard.md
◆ Check passed: no layout or timing issues found.
◆ Rendering 900 frames × 4 motion-blur samples (1920×1080 @ 60fps, 6 workers)…
◆ Score synthesized (driving, 120 BPM, 28 cues, -14.0 LUFS)
◆ Encoding MP4 with ffmpeg…
◆ Done in 404.7s (capture 399.0s, 9.0 shots/s) → examples/output/copse-launch/copse-launch.mp4 (3.14 MB, 900 frames, 15s)

Example 3

A 12-second vertical ad for a real Mac app

YouMake a 12-second vertical (9:16) ad for Tidzy for Reels/TikTok/Shorts. Hook in the first second, show the real app finding a file instantly and freeing up space, end on the name and site. Use the real screenshots and brand. Add sound.

Brief mode with real brand inputs: the README's copy, the website's colors and Geist type, and crops of the app's own screenshots. The poster frame is already the hook: "Can't find that screenshot?" over a wall of identical filenames. The word flies into Tidzy's search bar in a match cut, and the real result is found by the text inside it. The real Clean Up cards fold into "Moved to Trash · Undo", and the green check floods the frame and shrinks into the app icon. Text stays inside the 9:16 safe zones.

The rendered 9:16 ad, with sound. Every UI element is the real app.
Eight frames of the Tidzy vertical ad
Frame 0 is the poster and already shows the hook; captions stay clear of the platform UI zones.
Result
12s, 1080×1920, 60fps, 2.7 MB, with a 36-cue score at -14 LUFS
Command
node scripts/render.mjs examples/tidzy-vertical/index.html --trc srgb --crf 23 -o examples/output/tidzy-vertical/tidzy-vertical.mp4
Input
tidzy-vertical/index.html tidzy-vertical/storyboard.md
◆ Check passed: no layout or timing issues found.
◆ Rendering 720 frames (1080×1920 @ 60fps, 6 workers)…
◆ Score synthesized (driving, 120 BPM, 36 cues, -14.0 LUFS)
◆ Encoding MP4 with ffmpeg…
◆ Done in 131.0s (capture 126.6s, 5.7 shots/s) → examples/output/tidzy-vertical/tidzy-vertical.mp4 (2.69 MB, 720 frames, 12s)

Example 4

A 15-second explainer for a real Chrome extension

YouMake a 15-second explainer for CodeRelay, our Chrome extension, for the Chrome Web Store listing and X. Show the core idea: open review comments on a pull request turn into one AI-ready prompt you paste into your coding agent. Use the real product: screenshots, icon, name, tagline. 16:9, with sound.

Brief mode, read from the product repo: the site's hero line and its amber/blue/cyan color meanings, the store screenshots, icon, fonts and README tagline. Reviewer comments collapse into the CodeRelay icon, the real side panel opens out of it, and the camera pushes onto a real comment, its diff and the generated Markdown. A click on Copy prompt brings up the app's own toast, and the prompt drops into a coding agent. The score holds the drums back until the panel lands.

Problem, transformation, result in 15 seconds. Every UI frame is a real store screenshot.
Twelve frames from the CodeRelay explainer
The hook, the relay into the real panel, the camera moves onto the comment, diff and prompt, the paste and the end card.
Result
15s, 1920×1080, 60fps, 3.2 MB, with a 16-cue score at -14 LUFS
Command
node scripts/render.mjs examples/coderelay-explainer/index.html --trc srgb --crf 20
Input
coderelay-explainer/index.html coderelay-explainer/storyboard.md
◆ Check passed: no layout or timing issues found.
◆ Rendering 900 frames (1920×1080 @ 60fps, 6 workers)…
◆ Score synthesized (driving, 120 BPM, 16 cues, -14.0 LUFS)
◆ Encoding MP4 with ffmpeg…
◆ Done in 83.4s (capture 79.2s, 11.4 shots/s) → examples/output/coderelay-explainer/coderelay-explainer.mp4 (3.23 MB, 900 frames, 15s)

About this skill

Motion Video makes real MP4s, with synced sound, from one line:

  • open creative briefs such as the viral "make a dynamic 15-second motion graphics video that shows what an incredible motion designer you are… go all out"
  • concrete jobs: launch videos, logo stings, kinetic type, data stories, app showcases and vertical social clips

Each video is plain HTML, CSS and canvas on a tiny deterministic timeline. Playwright captures every frame and ffmpeg encodes them, and a built-in synthesizer scores the picture: music on the beat grid, plus whooshes, hits and risers placed on every cut.

Tested on Claude Opus 5.5. The skill pins model: claude-opus-5-5 with effort: xhigh. Other models are untested, and the instructions are tuned to how Opus 5.5 plans, critiques and iterates.

Two modes

Mode Triggered by Behaviour
Creative freedom "go all out", "showreel", "impress me", "show what you can do" No questions, no approval gate. It picks a concept with a single visual thread, an art direction, a BPM and 5–7 shots that each show a different technique. It builds them with match cuts and floods, scores the result, and reviews it against a reel rubric
Brief A product, feature, logo, stat or message Asks up to 3 questions, gets your 👍 on a storyboard, then follows your brand

The creative mode is built to avoid the reel everyone gets from that prompt (dark background, neon accent, "MOTION / PRINCIPLES", particles spelling a name, a grain-and-timecode HUD). See references/showreel.md.

Why it's different

Aspect Motion Video Prompting an agent to "make a video"
Plans first A beat-grid shot list with a concept, palette and sound cues Jumps straight to code
Sound Synthesized score and sound effects synced to every cut, mixed to -14 LUFS Silent, or a separate tool
Sees its output Reads filmstrips and stills at every cut, then fixes what it finds Can't watch video, so ships blind
Lints itself --check flags off-frame, overlapping or tiny text, unloaded fonts, cut-off animations and empty poster frames Not available
Craft built in Concept seeds, a technique palette with code, editing rules, a reel rubric, timing tables and safe zones Generic tweens
Zero lock-in One HTML file plus a small MIT runtime: no framework, no license fees Not applicable

Example prompts

  • "Make a dynamic 15-second motion graphics video that shows what an incredible motion designer you are, like it's your showreel for a résumé. Go all out."
  • "Make a 12-second launch video for our v2 release. Use the colors from our Tailwind config."
  • "Create a 4-second logo sting from public/logo.svg at 60fps."
  • "Turn these three stats into an animated data story for LinkedIn (4:5)."
  • "Make a vertical Reel with 3 CSS tips, safe zones respected."
  • "Render a transparent lower-third with my name for a YouTube video."

Templates

Template Size Length
showreel 16:9, 60fps, scored 15s
kinetic-type 16:9 10s
product-launch 16:9 13s
logo-sting 16:9, 60fps 4s
data-story 16:9 10s
app-showcase 16:9, 60fps 10s
social-vertical 9:16 12s

Examples

Four real runs, each with its composition and rendered output in examples/. Three are briefs for shipping products, built from each product's own screenshots, copy and brand:

Example Mode Output
Showreel, "go all out" Creative freedom 15s, 60fps, synthesized 25-cue score
Copse launch film Brief, real Mac app 15s 16:9, cut on the app's own ⌘⇧V keystroke
Tidzy vertical ad Brief, real Mac app 12s 9:16 with safe zones and a match-cut hook
CodeRelay explainer Brief, real Chrome extension 15s 16:9 problem → product → result

Runtime highlights

  • Tweens with grid and center staggers, springs, and named premium easing curves.
  • Motion.beats({ bpm }) for cutting on the beat, and Motion.score() / Motion.cue() for sound.
  • Motion.canvas(), Motion.noise() and Motion.textPoints() for particles and generative art.
  • Motion.morph() between any SVG shapes, plus Motion.draw(), split(), counter() and type().
  • Seekable CSS animations and video elements, and a live preview player with a scrubber.

Requirements

  • Node 18+
  • ffmpeg (brew install ffmpeg on macOS, apt install ffmpeg on Ubuntu)
  • Playwright and Chromium, which scripts/setup.sh installs on first use

Use the renderer directly

bash scripts/setup.sh
node scripts/new.mjs showreel my-reel
open my-reel/index.html                                 # live preview with scrubber
node scripts/render.mjs my-reel/index.html --filmstrip 20
node scripts/render.mjs my-reel/index.html --trc srgb   # → my-reel/index.mp4 with the synthesized score

See references/runtime-api.md for the full API.

License

MIT