Using Motionstash from a coding agent
The premise of this registry is that a language model should not be writing easing curves. Generated animation code is the part of a video pipeline most likely to be subtly wrong and least likely to be caught by a test — an off-by-four-frames entrance reads as cheap, and it typechecks. So the model’s job here is narrower: pick a component, fill a typed parameter set, order the shots. All 533 props across 76 components are declared in Zod schemas, which means every value an agent supplies either validates or fails loudly.
The MCP server
A stdio Model Context Protocol server ships with the repository. It needs no key and talks to nothing over the network — the catalog is a local JSON file and the renderer is local Remotion.
{
"mcpServers": {
"motionstash": {
"command": "node",
"args": ["scripts/mcp-server.mjs"]
}
}
}Five tools
- list_motion_items
- Search and filter the catalog by category, aspect ratio, tag or free text. Returns ids, summaries and frame budgets — not source.
- get_motion_item
- Read one component in full: every prop with its type, default, allowed values and description, plus its declared budget and its source file.
- render_motion_item
- Render one component to MP4 with a given props object. Validation happens against the component's own schema, so a bad value fails before the renderer starts.
- render_shot_list
- Render an ordered sequence of components as one video. Consecutive scenes are overlapped by the timing grammar rather than butt-joined.
- get_timing_grammar
- Read the budgets, springs and easing curves so a generated shot list uses the same vocabulary the components were authored against.
The CLI, for humans
Nothing here is distributed as a package to depend on. One command copies the component you want plus the four spine files it imports, and the copy is then yours to edit — the same model shadcn/ui popularised, for video.
npx motionstash add kinetic-headlineThe timing grammar
Components in this registry compose in time, not in space, and the grammar is what makes that safe. Everything runs at a canonical 30fps and declares its duration as three numbers — enter, hold, exit — taken from four budgets. Because every component multiplies its own presence by the same stage function, two clips placed back to back cross-dissolve instead of cutting.
| Budget | Enter | Hold | Exit | Total |
|---|---|---|---|---|
| beat | 12f | 36f | 12f | 2.0s |
| statement | 15f | 60f | 15f | 3.0s |
| scene | 18f | 114f | 18f | 5.0s |
| feature | 20f | 200f | 20f | 8.0s |
| Spring | Damping | Stiffness | Mass |
|---|---|---|---|
| settle | 18 | 180 | 0.9 |
| snap | 22 | 300 | 0.7 |
| glide | 26 | 90 | 1.4 |
| pop | 11 | 240 | 0.8 |
Four easing curves exist and no more — enter, exit, travel, accent — because a library where every component picks its own bezier is a library that never looks like one system.
What the authoring contract forbids
Every component is checked against these in CI, not by review. They are also the rules to follow if you are generating a new component rather than using one.
- One file per component, self-contained, no shared edits.
- Inline styles only — no CSS, no Tailwind, no className. A copied file must work with nothing but Remotion installed.
- Brand tokens instead of literal colour, so one component serves six palettes.
- Presence animated through the shared stage, never hand-rolled against raw frame numbers.
- Deterministic: no Math.random, no Date.now, no state-driven animation. Every frame is a pure function of the frame number.
- No external assets — every logo, avatar and screenshot is drawn in code, so a render is reproducible on a cold machine.
- Sizes derived from the composition, so the same file renders at 16:9, 9:16, 1:1 and 4:5.
- Every prop carries a description in its schema, because that description is the agent-facing documentation.
Read the catalog without an agent
The whole registry is three static files. None of them require a login, a token or a rate-limit budget.
- /registry.json — every component with its props, budget and source.
- /llms.txt — the catalog as plain text, sized to drop into a context window.
- /llms-full.txt — the same, expanded with every prop of every component.