Click any element in a running React or Next.js app and shape how it moves on hover, click, focus or scroll, with real controls and a live preview on the page. Intently saves each interaction as a spec, then hands it to the coding agent you already use (Claude Code, Codex or Cursor) to write it into your code, in your project's own style.
Every change can be undone byte for byte, and versions you tried but didn't pick are kept for later.
Built with
- React
- Next.js
- TypeScript
- MCP
- Claude Code
- Codex
- Cursor
01The gap
AI coding agents can build a whole interface in minutes, but motion is the part they can't feel. Is a hover 1.03 or 1.05? 180ms or 320ms? Eased, or a little springy? You only know when you see it, and describing it in a chat is slow and lossy.
Intently puts the controls on the page. You pick an element in your running app, shape how it moves, and watch it play on the real thing. When it feels right, Intently writes it down as a spec and hands it to your coding agent to put in your code.
02Controls made for feel
The panel opens on top of your own app, so it's built to stay out of the way: it can't inherit your styles or leak its own. Every control edits plain CSS underneath. Scale snaps to common steps on a dot slider, a handle in the preview sets where the element moves to, and the easing is a curve you drag.
Two of the best ideas came from DialKit, Josh Puckett's library for tuning interfaces: springs set by time and bounce instead of physics, and versions you can flip between to compare. In Intently, the versions you don't pick are kept with the spec, so "the bouncier one" can be reopened next week, under the same letter it had.


03Anything on the page, even Server Components
Testing on a fresh Next.js app exposed the biggest gap: every element on the default page is a Server Component, and Intently couldn't select any of them. Before changing anything, I measured what the browser actually receives. React already sends the name of the server component that made each element; Intently had been throwing it away.
Now those elements are editable by name, and the agent gets the rules that matter. A Server Component can't hold state or handle events, so a hover is written in CSS, and anything that needs JavaScript is moved into a small client component.


04The agent you already pay for
The first version ran its own AI on an API key, so every Apply cost money, enough that it had never run for real. The fix was to stop being an AI product: Intently hands the work to the coding agent you already use, signed in as you.
- One click on Apply runs your own Codex or Cursor in the project
- Or type /intently:apply inside Claude Code
- Or copy the prompt and paste it anywhere
Intently never touches your login. Before the first edit it also reads your project once, so the agent writes motion the way your codebase already does: Tailwind classes in a Tailwind project, CSS rules in a CSS one.
05What only real runs found
Every Apply can be undone byte for byte, from snapshots taken before the agent edits. Getting there meant testing on real apps, and each real run found something the tests hadn't:
- The panel forgot its Undo when the agent edited the file the panel lives in. The bridge now remembers for it.
- The install broke a fresh Next.js app, because its bundler refuses files outside the project. Intently now installs a copy inside it.
- “ease-out” turned out to mean two different curves: CSS's, and Tailwind's class of the same name. The agent picked the wrong one. Intently now spells out the exact curve.


06Proven three times
The same hover went through Claude Code, Cursor and Codex, each on its owner's own plan. All three wrote it correctly and in the project's own style, and all three were undone to the original bytes. Claude Code's run is the one that exposed the easing mix-up; Cursor and Codex, after the fix, both wrote the exact curve. The spec is the record; any agent can derive the code from it.
Intently is now a public beta on npm: npx @intently-dev/cli@beta init sets it up in a Next.js app. One-click Apply through Claude Code is held back until Anthropic confirms a tool may launch it on a user's behalf; until then, Claude Code users run /intently:apply in their own session.