Skip to content
Pod Engine
Get started

Motion

Three durations, two easings, a handful of CSS primitives, and one rule that turns all of it off. No animation library and no JavaScript.

  1. 01 Tokens
  2. 02 Primitives
  3. 03 Rules
01 Tokens

Five values for every animation

--duration-fast
150ms
Hover and press
--duration-base
300ms
Pops, tabs, menus, entrances
--duration-slow
700ms
Things entering the page
--duration-loop
12s
Product scenes
--ease-standard
cubic-bezier(.2,.8,.2,1)
Everything
--ease-emphasised
cubic-bezier(.3,1.3,.4,1)
Pops only (a small overshoot)
02 Primitives

What moves, and how

animate-rise

Things entering on load: a hero record, a sticker. 700ms, standard easing.

animate-pop

Small marks that arrive: a label, a stamp. 300ms with a small overshoot.

reveal

Fades and rises as it scrolls into view, driven by the scroll position (animation-timeline: view()). Shown at once where unsupported.

This card used the reveal utility as it scrolled in.

enter

Fades in when an element appears: tab panels, opened menus and answers, prices after the billing switch. Uses @starting-style, no JavaScript.

Switch a tab to see it enter

Lenny’s Podcast: 532K listeners a month, estimated.

Lenny’s Podcast: #26 on Apple Podcasts · Technology · US.

How accurate are the listener estimates?

They’re estimates, not download counts. Each one comes with a confidence level and the signals behind it.

Which shows have transcripts?

7.4M episodes so far, with the biggest shows first. You can request a transcript for any episode and we’ll add it.

draw and grow-x

Charts draw their line once and bars grow from the left, on load. Data marks only.

#20 #28 #35 3 Sep 10 Sep 17 Sep 24 Sep 1 Oct
Audio 391K YouTube 140K
03 Rules

When not to move

  • Nothing the reader needs is hidden until an animation finishes; every element is readable in its first frame.
  • Animate transform and opacity only, never layout (width, height, top).
  • No page transitions (decided 2 Oct 2026) and no animation libraries.
  • Loops (product scenes) run at --duration-loop and stop under reduced motion.
  • Every animation uses a duration and easing token; none uses a raw value.