Commands
/umd:go is all you need day to day. The other commands drive one specific step.
| Command | For |
|---|---|
/umd:go [what you want to make] | The command to remember. Runs the next step and chains until the next decision. /umd:go audit, /umd:go deliver… forces a step |
/umd:kickoff [what you want to make] | Set up or update the project: brief, profile, format, route, engine, licence policy, tools |
/umd:storyboard [notes] | Write the beats and validate the look on stills before animating |
/umd:build [beats or notes] | Build the piece, with drafts reviewed over up to 3 rounds |
/umd:render · /umd:render draft | Final render, done twice to prove determinism, then analysed · quick draft |
/umd:audit | Incremental audit: only what a change can affect is re-checked. It runs in full on the first audit, after a plugin update, or when the last full audit is older than 30 days |
/umd:audit quick | Automatic checks only, no agent: the cheapest |
/umd:audit full | Re-check everything from scratch |
/umd:audit story | One group: story, motion, sound or delivery |
/umd:audit TXT · /umd:audit TXT-01 SAF-01 · /umd:audit blockers | One domain, specific checks, or blockers only |
/umd:fix · /umd:fix blockers · /umd:fix AUD-01 | Fix by priority (blockers then majors), blockers only, or one issue |
/umd:deliver [name] | Deliver the audited render, then the platform versions you ask for |
/umd:tokens [days] | Token use per command, and the one change that would save the most |
/umd:doctor · /umd:doctor fix | Check or install the tools |
/umd:handoff | Write .motion/handoff.md to resume in another session |
All these commands rely on a zero-dependency CLI that you can also run yourself: node <plugin>/scripts/umd.mjs (with no argument it prints its help). It includes:
- rendering:
capture,still,render; - analysis:
analyze(cuts, motion, dead air, flashes, loudness, contact sheet),frames(--cuts: 12 frames around each cut),compare,vmaf,webperf,lint,licenses; - sound:
mix(ducking, loudness,--backtimeto land the music's ending on the end card),hits(a track's final hits),sync(each sound against its picture),normalize,loudness,captions,burn; - resources:
styles(1 323 styles, prompts and blocks;styles matchpicks from the brief),moves(120 named techniques),commons(free images from Wikimedia Commons),sounds(free effects and music),sfx(effects made on the spot),characters(free characters, rigs, motion and 2D kits),lipsync(mouth shapes from a voice); - tracking:
next,status,tokens,estimate(render time from one test frame),adopt(runs a video rendered by your own pipeline through analysis, audit and delivery).
What it creates in your project
BRIEF.md the brief (written by /umd:kickoff)
.motion/
project.json profile, route, engine, format, render, licence policy, thresholds
storyboard.md the beats, events, sound cues and the dated "Stills validated" line
motion-tokens.json durations and curves (DTCG format)
assets.lock.json every asset with its source and licence
styles/ the chosen style's prompt, with its credit line
LEDGER.md every critique round: what was found, changed and measured
stills/ the key stills
renders/<id>/ video, render.json, analysis.json, sheet.jpg, determinism.json, logs
renders/latest.json the latest render
AUDIT.md the latest audit report
audits/<date>.json every audit, to track the score over time
audits/<date>/ evidence.json, plan.json, parts/ (auditor results)
token-savings.json tokens saved by compact output
handoff.md the handoff between sessions
assets/commons/ images downloaded by umd commons
deliverables/ deliverables, with their manifest and credits.txtCommit BRIEF.md and .motion/, except the renders, to keep the score history. LEDGER.md and the audit report show the care taken: you can attach them to a client delivery. /umd:kickoff adds the renders, audit logs and token counter to your .gitignore.
The umd CLI
Every command relies on node <plugin>/scripts/umd.mjs, with no dependency. You can run it yourself; it is also what the agents use.
Setup
next The next step for this project (what /umd:go runs), from local files only
doctor [--fix] [--blender] [--rhubarb] Check FFmpeg, Playwright, Chromium and the route's tools (--blender: Blender and the GPU Cycles sees); --fix installs what it safely can
detect Guess engine, route and profile from the current folder
init [--force] Create .motion/ (project.json, storyboard, tokens, assets lock) and BRIEF.md from templates
rules [domain|group...] Build rules of the domains that apply to this project (compact)
Make
styles match [words] [--project p] [--limit 6] Rank the library against BRIEF.md and project.json: looks and blocks, with reasons
styles <words> [--project promo|presentation|explainer|social|logo|film|web|3d] [--mood m] [--medium m] [--format 9:16]
[--tier 2] [--kind style|prompt|block|component] [--source lemo|oscar|mg|opus|hf] Search 1323 styles, prompts and blocks (no tokens)
styles get <id> Copy that style prompt (or block card) into .motion/styles/
moves <words> [--family transitions|camera|type|...] 120 named motion techniques (match cut, whip pan, split-flap…)
commons <words> [--allow-sa] [--limit 12] Wikimedia Commons media under PD, CC0 or CC BY (BY-SA on request)
commons get "File:Name.jpg" [--dir assets/commons] [--width 1920] Download it and record it in assets.lock.json
still <html|url> --at 0,1.5 [--out dir] [--width W --height H] [--hero "#tv"] [--hero-min 170] [--seek-check]
Key stills on virtual time; measures the hero's width (an element, or window.umdHero(t) for canvas/WebGL) and
checks that each frame drawn cold equals the same frame drawn in sequence
capture <html|url> --out f.mp4 [--fps 30] [--duration s] [--width 1920 --height 1080] [--from s]
[--draft] [--transparent] [--format mp4|webm|mov|gif|png] [--audio f] [--seed n] [--subframes 16 --shutter 0.5]
Deterministic HTML → video; --subframes averages that many sub-frames per frame over the shutter (motion blur)
adopt <video> [--draft] Make a video rendered by your own pipeline the latest render (analysis, audit, deliver apply)
render [--draft] [--twice] [--no-analyze] [--engine eevee|cycles] Render the project (project.json "render"), then analyze; --engine reaches a
Blender command as UMD_ENGINE (default: render.engine)
mix --voice v.wav --music m.wav [--sfx a.wav@1.2 ...] --out mix.wav [--duck 9] [--lufs -14] [--length s] (length defaults to duration_s)
[--backtime | --hit s --card s | --music-start s] Back-time the music: its own ending lands on the end card, one continuous piece
hits <music> Strong attacks near the end of a track (candidates for its final hit)
sounds <words> [--music] [--max 8] [--cc0] Free sound effects (Freesound, Wikimedia) or music (Jamendo) via Openverse: CC0, CC BY, public domain only
sounds get <id> [--dir assets/audio] Download as 48 kHz WAV, record author, licence and credit line in assets.lock.json
characters [words] [--dims 3d|2d] [--style anime|film|low-poly|flat…] [--age child|senior…] [--face visemes|full] [--kind pack|avatars|generator|rig|motion|kit2d|code|tool] [--route blender|threejs|html]
Free characters, rigs, animation clips and 2D kits for commercial work (catalogue + live lists: Mesh2Motion, KayKit, Open Source Avatars)
characters get <id> | info <id> | add <file> --id <entry> [--licence --author --url] Download (or record a manual download) with its licence in assets.lock.json
lipsync <voice.wav> [--text script.txt] [--fps 30] Mouth shapes A–H, X per frame (Rhubarb, MIT) for character.py and the 2D puppet
sfx [<kind>] [--dur s] [--seed n] [--gain dB] Synthesise an effect (whoosh, swipe, riser, impact, subdrop, click, tick, pop, chime, shimmer, glitch, roomtone)
normalize <in> <out> [--lufs -14] [--tp -1] loudness <file>
captions <words.json> --out subs.ass|srt|vtt [--style karaoke|pop|line] [--max-chars 32] [--width --height --font --color --highlight]
burn <video> <subs.ass> --out f.mp4 Burn captions in (libass)
Check
analyze <video> [--out dir] [--loop] Probe, cuts, freezes, dead air, black, flashes, loudness, contact sheet; --loop checks the seam
frames <video> --at 1,2.5 | --every 2 | --cuts | --sheet [--out dir] [--width 960] (--cuts: 12 frames around each cut)
sync <video> [--timing timing.json | --cues storyboard.md] [--tolerance-ms 45] Do the sound hits land on their visual events?
(.motion/timing.json, the master clock, when it exists; else the storyboard's "## Sound cues")
compare <a> <b> Frame-hash equality + SSIM vmaf <encode> <master>
lint [dir] licenses webperf <url> captions-check <subs> <words.json>
evidence [--date D] All automatic checks for the audit + statuses of auto criteria
plan [scope...] [--incremental] Criteria left for the auditors assemble [--date D] status
Deliver and account
deliver [--name n] Copy the audited render to deliverables/ (refused while a blocker is open)
tokens [--days 30] [--session id] [--json] Token use per /umd:* command, from the session transcripts
run <label> "<command>" Run a command, keep the log on disk, print a compact summary
estimate --frames N [--parallel P] -- <command rendering one frame> Time one frame, multiply: render time before committing
version Plugin version
a path to show: relative inside the project, absolute outside it (never ......AppData…)
everything after a lone "--" is a command line for umd estimate, never parsed as options
boolean flags never take a value, so `umd capture --draft page.html` keeps page.html as the input
"music" is a switch only for `umd sounds --music`; `umd mix --music file.wav` takes a file
Compact output for large results: full JSON on disk, summary on stdout.
the per-second motion timeline stays in analysis.json; stdout gets its shape
---------- audit pipeline ----------
A film rendered outside umd (the project's own scripts, Blender, After Effects…) becomes the project's latest render,
so analyze, the audit and deliver judge it like any other. It never replaces the checks: it lets them run.