Projects · Tools · Motion design

Cavalry panels.

A set of script panels for Cavalry, the procedural motion app I animate in. Each one closes a gap I kept hitting in real work. I designed them, wrote the standards they follow, and directed an AI coding agent to build and test them.

Role

Creative director, designer, product owner

Timeline

June–September 2026

Built with

Claude Code and Cavalry’s JavaScript API

Panels

Eight, across layout, timing, data, text and presets

Tests

155 automated tests on Align-Distribute and Marker Notes

Status

Working in Cavalry 2.7; three packaged for release

Cavalry with the Orbit launch teaser built by the Storyboard Builder: the app card scene on stage, with its scene groups and keyframes below.

Why it started

Cavalry is brilliant at systems. The small conveniences were missing.

Cavalry builds motion procedurally, and it’s the fastest way I know to make work that scales. But the everyday tools an animator reaches for a hundred times a session had gaps, and every gap cost a little time on every job.

Time markers existed only as ticks on the ruler, with nowhere to read the notes on them. Aligning to the composition hid behind an Option-click, and there was no way to set an exact gap. Every chart meant building a rig by hand, and the text animations and components I reuse had no library to live in.

Each panel started as one of those moments: a gap met in production rather than an item on a feature list.

The panels

Eight tools that feel like they shipped with the app.

The TAP text animation preset browser beside the CVC Library component browser.
The TAP text animation preset browser beside the CVC Library component browser.

Libraries for what I reuse

TAP saves text animations as presets, with their keyframes, stagger and easing, and a preview rendered by Cavalry itself. CVC Library does the same for any selection, saving it as a self-contained component with its assets and a thumbnail, ready to import into any comp.

Cavalry’s script API can’t read easing directly, so TAP maps it through a calibration table built from Cavalry’s own exports. Both are packaged with licences for release.

From storyboard to a built comp

Storyboard frames and shot notes are drawn in Figma. An agent extracts them and writes a motion plan that holds every creative default, and the Storyboard Builder panel executes it: one group per scene, a camera inside each, and each layer animated.

The builder only does what the plan says. When a font from the storyboard isn’t installed, it substitutes one and lists a warning, so nothing changes quietly.

The Storyboard Builder panel after building the Orbit teaser: the stage, scene groups and keyframes in Cavalry.
The Marker Notes panel listing six time markers with notes, beside the note editor window.

A list for time markers

Cavalry’s time markers exist only as ticks on the ruler. Marker Notes gives the open composition a live, sorted list: click a row and the playhead jumps there, double-click to write a note, or add a marker where the playhead sits.

Notes are the markers’ own labels, so they save inside the scene with no sidecar file. Getting there took three discarded approaches, and the simplest one was the one that stayed reliable.

Charts that stay linked to the data

One tabbed panel builds bar, radial, pie, line and scatter charts as live rigs from a CSV or a Google Sheet. Edit the data, reload the asset in Cavalry, and the chart updates.

Design and animation settings sit next to the data: direction, grid, values, rounded caps, donut or pie, and how the build animates in. A separate Bar Chart Builder clones a designed template and rewires it to a sheet.

A live bar chart built from a sample CSV, beside the Charts panel with its data, design and animation settings.
The Record panel, armed, beside the Timed Group panel.

Keyframing by doing

Record brings Apple Motion’s record button to Cavalry. Arm it, park the playhead and edit the selected layers, and every changed attribute becomes a keyframe. A first edit also keys the old value, so it reads as a complete move.

Cavalry has no callback for a changed attribute, so Record polls only while armed and never during playback. Timed Group sits beside it: a group with a set duration that fits the layers inside it to its in and out frames.

Alignment with exact gaps

Cavalry has an Align window, but no exact gap in pixels, no key layer that stays put, and aligning to the composition hides behind an Option-click. Align-Distribute adds all three, docked as a panel or laid out in one row as a toolbar.

It never moves anything silently. Keyframed or driven layers are skipped and named in the console, parented layers are measured and corrected, and if Cavalry’s API is missing a call the panel refuses with a named error instead of half working.

Cavalry has an Align window, but no exact gap in pixels, no key layer that stays put, and aligning to the composition hides behind an Option-click. Align-Distribute adds all three, docked as a panel or laid out in one row as a toolbar.

It never moves anything silently. Keyframed or driven layers are skipped and named in the console, parented layers are measured and corrected, and if Cavalry’s API is missing a call the panel refuses with a named error instead of half working.

Cavalry has an Align window, but no exact gap in pixels, no key layer that stays put, and aligning to the composition hides behind an Option-click. Align-Distribute adds all three, docked as a panel or laid out in one row as a toolbar.

It never moves anything silently. Keyframed or driven layers are skipped and named in the console, parented layers are measured and corrected, and if Cavalry’s API is missing a call the panel refuses with a named error instead of half working.

Five layers aligned on one axis and spaced 48px apart, beside the Align-Distribute panel.

The idea in one picture

A storyboard becomes an animation.

The newest panel closes the loop between how I plan motion and how I build it. Storyboards stay in Figma, and a motion plan sits between them and Cavalry, so every creative decision is written down before anything is keyframed.

1 · Figma

Storyboard

One frame per shot, with a notes card for timing, transition and camera.

2 · Extract

Raw data

The agent reads the file through Figma’s MCP and writes it out as JSON.

3 · Plan

Motion plan

Every creative default lives here: timing, easing, entrances and exits.

4 · Build

Cavalry comp

The panel executes the plan, scene by scene, and reports what it changed.

A contact sheet of frames from the Orbit launch teaser: headline, app card, features and end card.

Frames from the Orbit launch teaser, built by the pipeline.

Production panels

9

Across layout, timing, data, text and presets, each closing a gap in real work.

Automated tests

155

On Align-Distribute and Marker Notes.

Packaged for release

3

Working in Cavalry 2.7.

How I worked

Match Cavalry. Do not invent.

After the first panels, I wrote down the rules they share: an unofficial set of Human Interface Guidelines for Cavalry scripts, with a redline spec. The best script UI is one nobody notices.

Prime directive

Copy the native panels

Spacing, control heights, icon sizes and labels come from Cavalry’s own windows, so a panel looks like it shipped with the app.

Tokens

A named scale, not magic numbers

Spacing of 2, 3, 4 and 10px, 26px controls, 22px icon buttons, a 4px radius and a 1px hairline. Two densities, never mixed in one row.

Resilience

Degrade, don’t crash

Check the API a panel needs at start-up, and let optional features fall back: icons become text buttons, a toolbar becomes a normal window.

Honesty

Never silent

Report every result, grey out controls that can’t act, and make destructive actions ask twice.

And I ran the build like a creative team.

Test the logic outside the app

The geometry and formatting live in a pure core, tested under Node and inlined into a single-file panel at build time. A mock of Cavalry reproduces its awkward behaviour, so the tests fail where the app would.

Probe before you trust

The API facts behind the storyboard builder are written down with their source and a confidence tag, from the app’s own schema to things still unverified.

Review the output, not the claim

“It looks right” was never done. Changes were checked in the real app, and what the tests can’t prove is listed next to them.

Kill the clever version

Marker Notes went through custom attributes, a hidden text layer and a sidecar file before landing on the markers’ own labels. Removing the machinery removed the bugs it was chasing.

Why it matters for what’s next

What this taught me, and what I’d bring to your team.

Tools are design work

A panel is an interface like any other. The highest compliment for a script UI is that it feels like part of the app, and that takes the same discipline as a brand system.

Honesty is a feature

The panels report what they skipped, name what they substituted and refuse rather than half work. People rely on a tool that admits its limits.

Directing AI is directing people

Clear briefs, specific feedback, standards written down so they outlast the conversation. The skill that made the agent productive is the skill that makes a studio productive.

Fix friction where the work happens

Each panel came from a moment in real production. Small tools, aimed at the right gap, change how fast an idea becomes a finished piece.

I speak engineering

I can talk APIs, test suites and failure modes with a development team, and translate them into what they mean for the work and the timeline.