The DAW for web motion
Design motion by touching it.
Paste your component, drag the spring until it feels right, and export clean Motion, GSAP or CSS. No account needed.
import { motion, type Variants } from "motion/react"; const container = { hidden: { y: 24, opacity: 0 }, show: { y: 0, opacity: 1, transition: { y: { type: "spring", stiffness: 220, damping: 12, mass: 1, restDelta: 0.01, restSpeed: 0.01 }, opacity: { type: "spring", stiffness: 220, damping: 12, mass: 1 }, delayChildren: 0.09, staggerChildren: 0.08, }, },} satisfies Variants; const item = { hidden: { y: 10, opacity: 0 }, show: { y: 0, opacity: 1, transition: { y: { type: "spring", stiffness: 220, damping: 12, mass: 1, restDelta: 0.01, restSpeed: 0.01 }, opacity: { type: "spring", stiffness: 220, damping: 12, mass: 1 }, }, },} satisfies Variants; export function RevenueCard() { return ( <motion.div variants={container} initial="hidden" animate="show" > {/* your component here */} </motion.div> );}In the editor
Feels like editing video. Ships like code.
The editor's own demo card, from paste to export. Every keyframe, spring and line of code in it is real.
Paste a component
HTML or JSX, into the paste dialog, then Add to stage. It renders as itself: real DOM, real Tailwind.
- 01
Paste a component
HTML or JSX, into the paste dialog, then Add to stage. It renders as itself: real DOM, real Tailwind.
Paste component
Bare JSX, an export default component, or plain HTML — TSX and Tailwind classes work, shadcn tokens map to the editor theme. Variables from your codebase render as wireframe stand-ins, so the preview approximates your app rather than matching it pixel-for-pixel — you're here to design the motion; the export wraps your real code untouched.
<div className="w-[380px] overflow-hidden rounded-xl border border-border bg-card"> <div className="flex items-center gap-3 border-b border-border px-4 py-3"> <div className="flex size-9 shrink-0 items-end justify-center gap-[3px] rounded-lg bg-primary p-2"> <div className="w-[3px] h-[7px] rounded-full bg-primary-foreground" /> <div className="w-[3px] h-[14px] rounded-full bg-primary-foreground" /> <div className="w-[3px] h-[10px] rounded-full bg-primary-foreground" /> </div> <div className="min-w-0 flex-1"> <p className="text-[13px] font-medium text-foreground">verve editor</p> <p className="text-[11px] text-muted-foreground">Motion you design. Code you own.</p> </div> <span className="shrink-0 rounded-full border border-border px-2 py-0.5 text-[10px] text-muted-foreground">free export</span> </div> <div className="flex flex-col gap-2 p-3"> <div className="flex items-center gap-3 rounded-lg border border-border bg-background p-3"> <span className="size-7 shrink-0 rounded-md bg-secondary" /> <div className="min-w-0"> <p className="text-[12px] text-foreground">Paste a component</p> <p className="text-[10px] text-muted-foreground">Real JSX, real DOM, real Tailwind.</p> </div> </div> <div className="flex items-center gap-3 rounded-lg border border-border bg-background p-3"> <span className="size-7 shrink-0 rounded-md bg-secondary" /> <div className="min-w-0"> <p className="text-[12px] text-foreground">Drag it, don't guess it</p> <p className="text-[10px] text-muted-foreground">Scrub the timeline. Pull the springs.</p> </div> </div> <div className="flex items-center gap-3 rounded-lg border border-border bg-background p-3"> <span className="size-7 shrink-0 rounded-md bg-secondary" /> <div className="min-w-0"> <p className="text-[12px] text-foreground">Export the code</p> <p className="text-[10px] text-muted-foreground">Motion, GSAP or plain CSS.</p> </div> </div> </div> <div className="flex items-center gap-2 border-t border-border px-3 py-3"> <span className="flex-1 rounded-lg bg-primary py-2 text-center text-[12px] font-medium text-primary-foreground">Export code</span> <span className="rounded-lg border border-border px-3 py-2 text-[12px] text-muted-foreground">Preview</span> </div></div>free exportverve editor
Motion you design. Code you own.
Paste a component
Real JSX, real DOM, real Tailwind.
Drag it, don't guess it
Scrub the timeline. Pull the springs.
Export the code
Motion, GSAP or plain CSS.
Export code PreviewCancelAdd to stage - 02
Pick inside it
Double-click the component, then click a part of it to give that part its own layer. ⌥ targets the parent, Esc when done.
free exportverve editor
Motion you design. Code you own.
Paste a component
Real JSX, real DOM, real Tailwind.
Drag it, don't guess it
Scrub the timeline. Pull the springs.
Export the code
Motion, GSAP or plain CSS.
Export code PreviewClick elements inside the component to animate them on their own tracks.Hold ⌥ to target the parent · Esc when done
- 03
Pose, then key
Drag a value in the inspector and a keyframe lands at the playhead. Move the playhead, drag again.
0s0.5s1sComponent 1div.flex "Drag it, don't guess i…"y - 04
Tune the feel
Click the curve between two keys, make it a spring and pull the pad. The code beside it rewrites as you drag.
lineareaseeaseIneaseOuteaseInOutspringcustomslowerfasterbouncierstiffness 220damping 12weight1molassesgentlesnappycrispbouncy - 05
Export the code
Motion, GSAP or CSS, copied straight into your project. Nothing of ours comes with it, and no account needed.
Export code
Your animation as production code — no runtime, no lock-in. Paste it into your project.
Component 1MotionCSSGSAPSend to repoCopy codedriven byTimeScrollNavigationintensitySubtleDefaultDramaticreduced motionimport { motion } from "motion/react"; export function Component1() { return ( <div className="w-[380px] overflow-hidden rounded-xl border border-border bg-card"> <div className="flex items-center gap-3 border-b border-border px-4 py-3"> <div className="flex size-9 shrink-0 items-end justify-center gap-[3px] rounded-lg bg-primary p-2"> <div className="w-[3px] h-[7px] rounded-full bg-primary-foreground" /> <div className="w-[3px] h-[14px] rounded-full bg-primary-foreground" /> <div className="w-[3px] h-[10px] rounded-full bg-primary-foreground" /> </div> <div className="min-w-0 flex-1"> <p className="text-[13px] font-medium text-foreground">verve editor</p> <p className="text-[11px] text-muted-foreground">Motion you design. Code you own.</p> </div> <span className="shrink-0 rounded-full border border-border px-2 py-0.5 text-[10px] text-muted-foreground">free export</span> </div> <div className="flex flex-col gap-2 p-3"> <div className="flex items-center gap-3 rounded-lg border border-border bg-background p-3"> <span className="size-7 shrink-0 rounded-md bg-secondary" /> <div className="min-w-0"> <p className="text-[12px] text-foreground">Paste a component</p> <p className="text-[10px] text-muted-foreground">Real JSX, real DOM, real Tailwind.</p> </div> </div> <motion.div className="flex items-center gap-3 rounded-lg border border-border bg-background p-3" initial={{ y: 12 }} animate={{ y: 0 }} transition={{ y: { type: "spring", stiffness: 220, damping: 12, mass: 1, restDelta: 0.01, restSpeed: 0.01 }, }} > <span className="size-7 shrink-0 rounded-md bg-secondary" /> <div className="min-w-0"> <p className="text-[12px] text-foreground">Drag it, don't guess it</p> <p className="text-[10px] text-muted-foreground">Scrub the timeline. Pull the springs.</p> </div> </motion.div> <div className="flex items-center gap-3 rounded-lg border border-border bg-background p-3"> <span className="size-7 shrink-0 rounded-md bg-secondary" /> <div className="min-w-0"> <p className="text-[12px] text-foreground">Export the code</p> <p className="text-[10px] text-muted-foreground">Motion, GSAP or plain CSS.</p> </div> </div> </div> <div className="flex items-center gap-2 border-t border-border px-3 py-3"> <span className="flex-1 rounded-lg bg-primary py-2 text-center text-[12px] font-medium text-primary-foreground">Export code</span> <span className="rounded-lg border border-border px-3 py-2 text-[12px] text-muted-foreground">Preview</span> </div> </div> );}
The blind loop
You're typing numbers to describe a feeling.
Change stiffness: 300. Save. Wait. Watch it once. Now try to remember what the last one felt like.
The usual way
The same spring, here
The docs
It's all written down.
Each card opens its page in the docs. The code on it is what the export writes.
- 01
Springs you pull
Right is faster, up is bouncier. Motion gets a native
spring, and CSS gets it as alinear()curve.stiffness: 220, damping: 12 - 02
Hover, press, focus, drag
Where an element goes while you interact with it, on top of wherever the timeline left it.
whileHover={{ scale: 1.03 }} - 03
Scroll-linked
The same animation, driven by scroll position instead of time. Scroll back and it plays backwards.
animation-timeline: view(); - 04
Split text
Letters or words become elements of their own, and the export writes the split markup for you.
stagger: 0.06 - 05
Motion paths
An arc, a wave, a loop or an orbit, exported as CSS
offset-pathwith no plugin.offset-distance: 100%; - 06
View transitions
One element that travels between two pages:
view-transition-namein CSS,layoutIdin Motion.view-transition-name: card; - 07
Reduced motion
Travel is pinned and fades are kept, so the animation still says something when nothing moves.
useReducedMotion() - 08
Import as tracks
Paste a component written with Motion, and what it already animates arrives as tracks you can tune.
initial={{ y: 12 }}
The exit door
What do you actually leave with?
Features are easy to compare. The real question is what's in your hands, and in your bundle, when you close the tab.
| Tool | What you walk away with | What your app has to carry |
|---|---|---|
| Jitter | What you walk away withA video, GIF or Lottie file | What your app has to carryA playerIt's never real UI. |
| Rive | What you walk away withA proprietary .riv file | What your app has to carryRive's runtimeIn your bundle for as long as you ship it. |
| Lottie | What you walk away withA JSON animation | What your app has to carryA player libraryIt interprets the JSON at runtime. |
| Figma Motion | What you walk away withCSS, React or JSON copied from Dev Mode, on a paid seat | What your app has to carryMotion for ReactNothing for CSS. You wire it to your own markup. |
| verve | What you walk away withMotion, GSAP or CSS, in your own files | What your app has to carryNothing from usMotion or GSAP if you pick them, nothing for CSS. |
Export is free. And nothing you export depends on us, which is the whole point of this table.
And it's the animation you designed. We play every export in a real browser and check it against the preview.
Paste, animate, export
Paste it. Animate it. Export it.
You animate the component you already wrote, and you leave with a file.
Paste
Drop in the component you're shipping, JSX or plain HTML. It renders for real in a sandbox.
<div class="toast">
<svg class="check" />
<div>
<strong>Changes published</strong>
<span>3 files · 340ms</span>
</div>
</div>Animate
Scrub, drag keyframes, pull the spring until it feels right. Every element inside it can get its own track.
Export
Copy the Motion, GSAP or CSS into your project. It moves the way it did in the editor.
import { motion } from "motion/react";
export function PaymentToast() {
return (
<motion.div
initial={{ x: 36, scale: 0.94, opacity: 0 }}
animate={{ x: 0, scale: 1, opacity: 1 }}
transition={{
x: { type: "spring", stiffness: 340, damping: 27, mass: 1, restDelta: 0.01, restSpeed: 0.01 },
scale: { type: "spring", stiffness: 340, damping: 27, mass: 1 },
opacity: { type: "spring", stiffness: 340, damping: 27, mass: 1 },
}}
>
{/* your component here */}
</motion.div>
);
}
The engine
What you see is what ships. We check.
Most tools show you one thing and hand you another. We run the export in a real browser and measure it against the preview.
0.30%
Worst-case drift, measured
20/20
Ten fixtures, two dialects
0 KB
Of verve in your bundle
We wrote our own spring engine.
No wrappers around someone else's library. Every frame is computed right here.
Scrub to any moment.
Drop the playhead anywhere and everything is exactly where it should be.
Then we check it.
We generate the code, run it in a browser, and measure it against the preview.
The plot is CSS. Motion is measured live, so it gets a little more wiggle room. Or skip all this and export something and diff it yourself.
Templates
A hero entrance is five animations.
Each one is a whole scene, with every element on its own track and timed against the others. Click one and it opens with the timeline already full.
Hero entrance
Badge, headline, copy and buttons arriving one after another. The stagger every landing page wants.
Feature cards
Three cards popping in on a spring, 100ms apart. A classic stagger, and it exports as one.
Avatar stack
Faces popping in one after another. 80ms apart — fast enough to read as one gesture, slow enough to count.
Field shake
A field shaking off bad input. Each shake is smaller than the last, because an even shake looks like a glitch.
There are 20, and each one has to be worth exporting. They double as tests for the exporter.
Browse all 20What comes with it
Most of the work is already done.
Components that arrive animated, kits that hold to one motion profile, and the scales they're all built from. Every one of them opens in the editor.
Components
The shadcn-shaped ones, shipped with their motion already authored — a dialog whose backdrop dims while the panel rises, a dropdown that doesn't just appear. Open any of them and every keyframe is there to be moved.
12 components · dialog, dropdown, toast…
Kits
Grouped by what you're building, each kit holding to one stated motion profile. A dashboard has no business moving like a landing page.
20 animations · 4 kits, 4 profiles
The scales
Five springs, five durations, five distances — the vocabulary everything above is built from, drawn by the solver that runs your preview.
bouncy · 220 stiffness, 12 damping
Docs
What each thing does and — the part most docs skip — where it stops. Written from the engine, so the figures in it can't drift from the code.
- Paste, animate, export
- What you can paste
- The timeline
- What each dialect cannot express
searchable · every capability has a page
Or start from nothing
Paste your own component and animate that instead. No account, no setup — the editor opens with a document ready.
no sign-in required
52 animations in all. Every one of them opens in the editor.
Pricing
Export is free.
Making an animation and exporting it costs nothing. Pro is for when you're making a lot of them.
Free
no cardEverything you need to make an animation and export it.
- The full editor, with no account at all
- Every property, template and easing
- Motion, GSAP and CSS export, including scroll, hover and page transitions
- 5 saved animations once you sign in
- Share links, so anyone can watch it run — revoke one whenever you like
Pro
/monthFor when you're making a lot of these.
Everything in Free, plus:
- Unlimited saved animations
- AI assist to start an animation from a sentence
- Motion tokens — export your motion system, or apply a team's