Open source · MIT · Live on npm

Every animation needs a reason

MotionLint reviews the design and motion of your running web app. A vision LLM catches what your coding agent can't see; a deterministic linter measures what it can't feel. In your terminal, in CI, or inside Claude Code.

View on GitHub →

Review what actually renders

Coding agents read JSX and CSS — they're blind to what users see, click, and watch animate. MotionLint captures the running app and hands ranked, cited findings back to the loop.

A finding, from the audit report
Warning duration
1400ms exceeds the UI budget
div.features > div.feature > div.skeleton.sk-line
Current
Saved
1400ms · ease-in
Suggested
Saved
180ms · ease-out (Emil)

Both chips animate at their real timings — the difference between the finding and the fix is something you feel, not read.

Sees what your agent can't

motionlint review captures multi-viewport screenshots and 50ms frame bursts after every interaction, then returns ranked findings across 12 UX dimensions — each with a suggested fix.

Deterministic where it counts

motionlint audit measures every animation in the browser and lints durations, easing, stagger and exits against encoded standards. No API key, no LLM — plus SARIF and exit codes for CI.

Tune, don't guess

motionlint tune opens your real animations in a live tuner — sliders for duration and delay, Emil easing presets, instant replay — and exports the diff for your agent to apply.

Lives inside the coding loop

A native MCP server for Claude Code, Cursor, or any MCP-aware client — findings land next to the code being written, not in a separate dashboard. Validated at 100% recall, 0% false positives on a 24-fixture stress test.

Standards, not vibes

The linter checks real, machine-checkable constants — every finding cites the exact rule and value it was measured against.

01 Duration. UI motion stays under the budget; only modals and drawers may take longer. ≤ 300ms · modals 200–500ms
02 Easing. Entrances and exits use a strong ease-out — built-in CSS easings are too weak for deliberate motion. cubic-bezier(0.23, 1, 0.32, 1)
03 Exits. Leaving is less interesting than arriving — exits run faster than their entrance. ~20% faster
04 Physicality. Nothing in the real world appears from nothing — entrances never start at scale(0). scale ≥ 0.9
05 Stagger. Grouped items enter one after another — close enough to feel connected, far enough to read. 30–80ms apart
06 Accessibility. Motion respects prefers-reduced-motion, and hover effects stay behind a real hover. @media (hover: hover)

Encoded from Emil Kowalski's animation standards. The same constants power the linter's findings, the tuner's presets, and the suggested fixes — one source of truth.

Point it at your app

The audit runs fully offline — no account, no API key. For vision review, bring Anthropic, OpenAI, Google, or a local Ollama model.

Read the docs on GitHub

MIT licensed · TypeScript · runs on Chrome via CDP