Engineering · July 2, 2026 · 7 min
Why AI coding agents can't see motion (and how we gave them eyes)
Video models sample ~1fps by default and miss entire choreographies. How MotionLens measures motion from pixels, records with real frame timing, and declares what it can't know instead of hallucinating it.
The one-frame-per-second problem
Feed a video to a multimodal model with default settings and it samples roughly one frame per second. A modern UI animation lives and dies inside 300–800ms. At 1fps, a logo that fades in while the keyboard slides up while three suggestions stagger into place is — at best — two frames: before and after. The model literally never saw the choreography. It saw a slideshow.
That's the root reason “make it like this video” fails with AI coding agents. It's not a reasoning gap. It's a perception gap.
What we do differently
MotionLens is a pipeline of small, honest fixes stacked on top of each other:
- Sample at 8–12fps, per mode. Enough temporal resolution to catch a 250ms spring; past ~12fps we measured diminishing returns — multi-pass analysis beats more frames.
- Measure motion from pixels, not vibes. Before the model sees anything, ffmpeg diffs consecutive frames and produces a motion-energy timeline: bursts (discrete events), steady spans (loops), settles (holds). The model gets this as ground truth to anchor its timeline on, instead of inferring event boundaries from sparse frames.
- Sharp keyframes at the moments that matter. Full-resolution stills are extracted exactly at the energy events and attached alongside the video — the video is the source of truth for motion, the stills for appearance.
- Record with real frame timing.When we record a live site, frames are captured with the browser's own timestamps and assembled with true per-frame durations. A 420ms ease-out in the browser is a 420ms ease-out in the video. A naive constant-fps recorder would quietly distort every duration — fatal for a product whose whole job is timing.
- Verify, then ship. Precision mode runs a second pass that re-watches the video against the draft blueprint and corrects it — the same trick that works for human reviewers: the second look catches what the first one assumed.
The part most tools get wrong: admitting the ceiling
A video sampled at 12fps cannot tell you a spring's stiffness constant, whether a single-frame squish happened, or the exact cubic-bezier of a 200ms curve. Tools that output those numbers anyway are hallucinating precision — and a spec that lies is worse than no spec, because your agent will faithfully implement the lie.
So every Motion Blueprint carries a blind spotssection listing what genuinely couldn't be determined from the clip, and per-motion confidence flags anything inferred. Recent benchmark work backs this up: on UI-animation comprehension tests, several strong general models fabricate elements that don't exist and misclassify motion types. Perception honesty is the product.
What comes out the other end
A structured blueprint your agent reads natively over MCP:
{
"summary": "Radial explosion of mail stickers around a centered headline…",
"beats": ["Headline fades into center", "Stickers stack, then detonate…"],
"motion": [
{ "element": "Stickers", "change": "scatter", "from": "center",
"to": "scattered field", "easing": "ease-out-back", "duration_ms": 600 },
{ "element": "Stickers", "change": "drift", "from": "-3deg", "to": "3deg",
"concurrent_with": "ambient", "confidence": "high" }
],
"blind_spots": ["Exact spring constants for the explosion overshoot"],
"agent_prompt": "Recreate a radial sticker explosion: …"
}Words lose motion. Specs carry it. Give your agent eyes — 5 free credits, no card.