Make your AI agent build apps that feel right.
Coding agents ship working screens with generic motion: a 300 ms ease on everything. ExperienceOS gives your agent the exact springs, curves and timings behind the best apps, recovered from their shipping code, so what it builds feels like it was made by a team that sweats the details.
Same screen. Different team.
Left: what agents usually write, one generic transition for everything. Right: the same moments with numbers recovered from a shipping app. Press replay and watch them side by side.
transition: 300ms easeduolingo.progressFill · statCardEnterYour agent asks. ExperienceOS answers with evidence.
Describe the feel you want by pointing at something real. Your agent pulls the recovered values instead of guessing, builds with them, and checks the result.
Point at a feeling
"Make the lesson-complete screen feel like Duolingo's." A reference beats an adjective.
Pull the real numbers
The agent reads named presets with provenance, such as duolingo.statCardEnter: scale 0.25 → 1 in 175 ms, a 21 dp tab lift, a 900 ms shine.
Build with them
Drop-in Web Components or plain values for any stack, with reduced motion handled.
Check the result
ExperienceOS captures the running interaction and compares it against the reference, so "feels right" becomes a test.
# you build the lesson-complete screen. it should feel like duolingo's. # agent → preset('duolingo.statCardEnter') recovered · Duolingo 6.101.2 · ShortLessonStatCardView fromScale 0.25 · 175 ms · token lift 21 dp · ticker 300 ms · shine 900 ms → preset('duolingo.progressFill') recovered · ProgressBarView delay 200 ms · 400 ms · Android overshoot, tension 2 → build <xos-stat-card> ×3, <xos-progress> → verify capture vs reference: card entrance and fill timing within tolerance
Preview: agents read presets from the kit today. A preset lookup tool for agents (MCP) and reference comparison for app screens are on the way; behavior capture and comparison already run for web experiences.
Recover, measure, rebuild.
Every value on this site is labelled by where it came from, so you can tell a measured fact from a design guess.
Recover
Decompile the app and read its motion code and resources: spring(0.6f, 350f), PathInterpolator(0.74, 0, 0.11, 0.96), layout constraints, type scales and palettes.
Measure
Read the timing out of bundled animation files (Lottie, Rive, even a game's packed UI movie clips), frame by frame, without shipping a single one of them.
Rebuild
Recreate the screen with original artwork and open fonts, test the numbers against their source, and package them as presets and Web Components.
Eighteen moments, taken apart.
Every reference your agent can point at is a playable study. Open one, press things, and read the evidence beside it. Each one grows out of its card on the spring Robinhood uses to open a post, and Back folds it away again.
Feel, as a dependency.
Framework-free Web Components and motion primitives. One import, no build step, themed by tokens, and every preset names its source.
<!-- tokens + components --> <link rel="stylesheet" href="/kit/tokens.css"> <script type="module"> import { defineKit } from '/kit/components.mjs'; defineKit(); </script> <xos-progress value="0.4" streak="3"></xos-progress> <xos-lip-button tone="success">Check</xos-lip-button> // or just the numbers import { preset } from '/kit/presets.mjs'; import { springEasing } from '/kit/motion.mjs'; const { spring } = preset('venmo.clusterEntrance'); el.animate(frames, { easing: springEasing(spring) });
Study the feel, not the brand.
Numbers, never assets
No artwork, animation file, sound, font or copy from any app ships here. Durations, curves, springs and layout values are recovered; everything you see is original.
Honest provenance
Every value is tagged recovered, measured or authored, with the app version and the class or file it came from. Guesses are labelled as guesses.
Tested against source
Each preset is pinned by a test to the study it came from, so a number cannot drift from its evidence without failing the build.