MOTIONSTASH

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 1,105 props across 148 components are declared in Zod schemas, which means every value an agent supplies either validates or fails loudly.

The catalog an agent reads

The whole registry is three static files. None of them require a login, a token or a rate-limit budget, and an agent reads them the way a person browses the gallery.

Getting a component out, for humans

Nothing here is distributed as a package to depend on. You take 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.

Copy the component's source from its page. It is one TypeScript file, and it needs the four spine files it imports: types, contract, timing and tokens. Every component page carries a copy button for its source, and registry.json carries the same source for all of them at once, which is the form an agent should read.

The 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.

Frame budgets at 30fps
BudgetEnterHoldExitTotal
beat12f36f12f2.0s
statement15f60f15f3.0s
scene18f114f18f5.0s
feature20f200f20f8.0s
Spring presets
SpringDampingStiffnessMass
settle181800.9
snap223000.7
glide26901.4
pop112400.8

Six easing curves exist and no more: enter, exit, travel, accent, snap, crash 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.