The engine

The solver is a pure function of time

Given a document and a time in milliseconds, the engine returns the value of every property, with no state carried between calls. Scrub backwards, jump to the end or render the same frame twice, and you get the same answer.

Springs are solved, not stepped
A spring segment is evaluated from its closed-form solution, so sampling at 37ms costs the same as sampling at 3700ms, and neither builds up error. That’s what makes a spring scrubbable: a simulation would have to rerun from the start of the segment every time the playhead moved backwards.
…except where a target moves every frame
The homepage’s pointer effect chases a cursor, which has no fixed destination to solve toward. That case uses a semi-implicit Euler step from the same module, and a test keeps the two within 0.25 units of each other across every preset.
An unsettled spring is cut
If the next keyframe arrives before a spring comes to rest, the engine stops the spring at that keyframe instead of letting it ring past it.
20 animatable properties
10 compose into one transform and 5 into one filter. opacity, Along path (offset-distance) and the 3 colors each have a declaration of their own. Members of a group share a declaration, so their order shows whenever two of them don’t commute.
Color interpolates in OKLCH
sRGB is visibly wrong for this: a straight line between two hues dips through a muddy gray. OKLCH is built so equal steps look equal, which is what an interpolation needs. Hue takes the short way around the circle, and a fade from gray travels out along the target’s hue instead of swinging onto it.
5 spring presets
molasses, gentle, snappy, crisp, bouncy: the same set the editor’s preset buttons offer, and the same springs the marketing pages use.
Nothing of ours in your bundle
The engine runs in the editor and doesn’t ship with your export. Motion and GSAP exports import their own library, and CSS needs nothing. Nothing you export imports anything of ours.