motion-skills
v0.1.5
Published
The engine behind Motion Skills: your coding agent writes the film, scores it, and you point at the frame to change it.
Maintainers
Readme
motion-skills
Your coding agent makes the film. You point at the frame to change it.
The engine behind Motion Skills. A skill teaches your agent (Claude Code, Codex,
Cursor, Gemini CLI) how to direct a kind of film; this engine is what it builds with. A film is one
index.html: HTML, CSS and GSAP, every frame a function of time. No video model, no credits, no upload.
It renders in the Chrome you already have.
npx motion-skills doctor # Node 22+, FFmpeg, Chrome
npx motion-skills new my-film # a project that follows the film contract
npx motion-skills studio my-film # live preview: press C, click the frame, write the changeWhat it does
- Point at the frame.
mo studioopens a live preview. Press C, click anything, write what you want. The agent gets the time, the scene and the element under your cursor, changes only that, and the preview reloads where you were. Every version is kept;mo undogoes back. - Music written for the film. The agent writes the score in ABC notation;
mo soundfits it to the scenes and plays it on sampled piano, strings and drums (or synths), with an effect on every landing. - Fast renders in your own Chrome. Several browsers at once; MP4, MOV with alpha, WebM, GIF, or a share page.
- Checked before you see it.
mo checkfinds cut-off, covered and low-contrast text;mo auditchecks every line on screen againstsources.md;mo qafinds single-frame pops, blank and quiet stretches in the render, and for a narrated film measures the pace (words a minute, gaps, breaths, the last hold). - Real material.
mo harvestcollects every image a product page uses;mo shoottakes a sharp 2× picture. - References measured, not guessed.
mo study ref.mp4turns a film someone likes into what an agent can read: shots and cuts, the frames around each cut, moves and their ease, palette and tone, tempo and cuts on the beat, contact sheets;--compareputs your render beside it.
Commands
| Command | What it does |
|---|---|
| mo new · mo templates | start a project |
| mo studio | live preview, direct edits, frame comments |
| mo inbox --wait · mo look · mo done | the agent's side of a comment |
| mo sound · mo voice · mo samples | score and effects, narration, the instrument pack |
| mo check · mo audit · mo still · mo qa | before and after rendering |
| mo review | a kit for a reviewer who did not make the film |
| mo render · mo fork · mo export html | export, a new frame size, a share page |
| mo export jianying · mo export capcut · mo export pptx | the film as a 剪映 or CapCut draft, or a slide deck |
| mo cut · mo replay | a talking-head take cut clean; a Claude Code or Codex session as a film |
| mo series · mo house | one film, many episodes; the house style every skill reads first |
| mo harvest · mo shoot · mo music · mo sfx · mo study | material, music and effects, a reference film measured |
| mo learn · mo undo · mo doctor | experience, undo, environment |
Requirements
Node 22+, FFmpeg, and Google Chrome (or Chromium / Edge). Optional: mo samples build downloads the instrument
pack once (about 60 MB); narration with Kokoro voices needs Python 3.12 and uv.
Privacy
Nothing leaves your machine except, for projects a Motion Skills skill started, one anonymous signal when a render
or the setup check finishes: the skill's name, the step, whether it worked (if not, one word for what broke: disk,
chrome, ffmpeg, page…), the engine version and a random number the engine keeps in the project's .mo/run, so a film
retried five times is not counted as five films. Never a file, a path or any of the film. MOTION_SKILLS_TELEMETRY=0
turns it off.
After a render of a film the free trial skill (motion-director) made, mo render prints one tip, once per
project: where the full film of that kind is made (the full-film skill its handoff.md recommends). It is printed from what is
on disk, with no network call, and never for any other skill. MOTION_SKILLS_TIPS=0 turns it off.
MIT. GSAP and the bundled fonts keep their own licenses (next to the files and in LICENSES/).
Changelog
0.1.5
mo voice --voice say:…works again, and so does the fallback to a macOS voice when Kokoro is not set up: the script's[say …]respellings had taken the name of thesaysynthesizer, so both stopped with "say is not a function" (since 0.1.1).
0.1.4
- The site renamed its "directors" to full-film skills named for the film they make (Launch Video, Data Video, …) and
Starter Director to Free Trial.
mo whoami,mo installand the paid-skill message say "skill"; the tip after a Free Trial render reads "Made with the free trial. …" and names the full-film skill fromhandoff.md, whose line is now- Full film: <name> (<slug>)(Director:,Skill:andLook:lines from older projects still read); the house-style template says "every skill".
0.1.3
mo shoot:--sizeapplies from the first load with no steps too (a phone page at--size 390x844was laid out ~500 px wide and cut at the right);--user-agent "<ua>";--selector "<css>"takes just that element's box; an SVG is drawn at its own viewBox size (or--sizeexactly) with no margin, on a transparent ground (--background).mo new <dir> --skill <path|slug> [--example name]starts from the skill's example film (examples/<name>/index.htmland the files it uses, notout/,.mo/orstills/) when the skill is installed and has one; otherwise the blank starter, with a note saying why.- True peak: the master is limited with 4x-oversampled peak detection to −1.5 dBTP (the peaks between samples, from
hats and noise, went over −1 dBTP before);
mo soundprints it;mo qameasures the delivered sound's true peak and warns over −1 dBTP. mo check: CSS that does not parse is an error (a/*never closed or not closed before the next comment, a stray*/or}, a{never closed, and rules Chrome dropped compared with the rules written); a layer that paints nothing (opacity near 0 with its parents, a clear background, no image or text of its own) no longer "covers" text; an apostrophe in a single-quoteddata-composition-variablesis reported first, alone, as "variables JSON invalid (apostrophe? write ')", without the unknown-variable and page errors that followed from it.mo audit: a number counts as illustrative only when its source cell marks it so: "illustrative", "invented", "made up", or "sample" written as a label ("sample", "sample: …", "sample content / data / values / figures / text / input / copy"). A source that only mentions a sample ("a sample of 1,200 adults", "sample size", "sampled") is a source. Rows written for 0.1.2 with those marks read the same.mo swatchreads the two-line palette: the— from: …source on the line afterPalette:.mo fonts add "<family>" [--weights 400,600] [--italic] [--subsets …]: a family that is not bundled is downloaded (woff2 from Fontsource on jsDelivr, the licence from google/fonts) intoassets/fontswith aLICENSES.mdrow and an@font-face; offline it fails with a clear message and leaves the film as it was.mo render: a browser that stops answering ("Runtime.evaluate timed out", often with<video>) is started again once and redoes the frames it owed; a second stall fails with a message suggesting--workers 1.mo helpstates the--blurlimit: 240 subframes a second (8 at 30 fps, 10 at 24, 4 at 60).- After a render of a Free Trial film, the one-time tip above.
