Writing

The 200 milliseconds that decide everything

Whether an interface feels alive or dead comes down to a handful of transitions most people never tune. Here's how I think about them.

There’s a moment, right after you click something, where the software either feels alive or feels dead. It’s about 200 milliseconds long, and almost nobody budgets for it.

Dead software responds correctly — the state updates, the right thing happens — but it snaps between states with no acknowledgement that you, a person, did a thing. Alive software answers you. The button presses in. The panel eases open instead of teleporting. The new row settles into place. None of it is decoration; it’s the interface telling you it heard you.

Why the number matters

Human perception has thresholds, and they’re remarkably consistent. Under about 100 milliseconds, cause and effect feel fused — you don’t experience the response as a separate event from your action. Between 100ms and roughly one second, you notice a delay but stay in flow. Past a second, your attention starts to drift and you wonder if it worked.

The 200ms window sits right in the sweet spot: long enough to be a graceful movement rather than a jarring cut, short enough that nobody waits on it. That’s why it’s the default duration I reach for, and why I treat anything over ~400ms on a routine interaction as a smell.

Three rules I keep

Acknowledge instantly, complete soon. Feedback should begin within ~100ms of input — that’s the threshold where an action still feels connected to your click. The action itself can finish later; the acknowledgement can’t wait. A button that depresses immediately and then does its slow work feels faster than a button that does fast work but doesn’t react until it’s done.

Ease out, never bounce. Real motion decelerates. I use exponential ease-out curves for almost everything and reserve bounce and elastic for exactly nothing. Overshoot is charming the first time and grating the third. A panel that springs past its position and wobbles back is telling you the designer was having fun; it isn’t telling the user anything useful.

Animate the cheap properties. transform and opacity are composited and nearly free. Animating width, top, or box-shadow drags the main thread, and the smoothness you were chasing evaporates into jank. If I need a layout to move, I find a transform that fakes it — a translate instead of a top, a scale instead of a width.

The reduced-motion clause

None of this is permission to make the interface a fireworks show. Every transition I add ships with a prefers-reduced-motion alternative — usually a plain crossfade or an instant cut. Motion is a tool for clarity, not a personality you impose on people who’ve told you they don’t want it. Vestibular disorders are real, and “it looked cool on my machine” is not a counterargument.

The trick is that the reduced-motion version should still feel finished. The goal isn’t to strip motion out and leave a worse experience; it’s to convey the same state change through a different channel. Opacity does a lot of quiet work here.

It’s invisible when it’s right

The 200 milliseconds are invisible when they’re right. That’s the whole point. You don’t notice good interaction design — you just trust the software a little more and never quite know why. You come away thinking the app is “fast” or “clean” or “nice,” reaching for adjectives that don’t capture the dozen small decisions underneath.

That invisibility is also why it gets cut first. It never shows up in a demo, never makes a changelog, never wins an argument about priorities. So you have to decide, ahead of time, that it matters — and then defend the 200 milliseconds like they’re load-bearing. Because they are.