Feel
Feel is a Claude Code skill, runtime, and test rig for interactions built on physics. Describe a feel—“a toggle that feels heavy”, “a drawer with a magnetic snap”—and get a production component driven by mass, stiffness, damping, and force fields on a line, in a plane, or around a dial. The rig plots position, velocity, and the force field, overlays the model's prediction on measured motion, can hand each release to the browser as CSS keyframes baked from the same model, and exports the spring to Framer Motion, react-spring, SwiftUI, Compose, or CSS `linear()`. The rule is strict: no hand-picked durations or easing curves anywhere.
Build StackJavaScript, TypeScript, React, CSS linear(), Claude Code skills
Challenges
Translating vague words like “heavy” or “snappy” into physical parameters that behave consistently across toggles, drawers, cards, and knobs.
Making drags feel weighted and releases feel thrown, so heavy things lag the finger and land where momentum would carry them.
Handing motion to CSS when a platform demands it without letting a hand-tuned duration back in.
Proving the solver, snapping, and settle times are correct rather than just looking right.
Solutions
Built Feel.words to map descriptions onto mass, stiffness, and damping, with magnets, detents, and 2D points as force fields on the same body.
Pulled the body through a hand spring during drags and kept its real release velocity, deciding the target from where it would coast.
Baked CSS keyframes and linear() easings from the model itself and labelled any computed duration as such.
Wrote an audit that fails on transition: 300ms or cubic-bezier, checks the solver against exact solutions, and verifies baked keyframes match the JS loop.
