The workshop
Things made because they were worth making
Each one runs here — and each one carries the decision that made it hard. A workbench, not a portfolio.
All of it drawn in the browser, frame by frame. Not one image file.
01crush.js
The closing room
A man smoking on a chair while the walls come in. They never open again, and they close all the way.
The wall separation is authored in body-widths, not as a fraction of the room. As a fraction, the whole interesting range — arms reach, arms buckle, ribs go — lands in the last three per cent, and he reads as standing untouched and then vanishing.
Limbs are two-bone IK against fixed bone lengths. jointFor() takes a direction, not a sign: there are always two solutions, and which one is "the elbow bends down" depends on where the limb is pointing.
02showcase.js
Strike
A bowling throw behind a chase camera. It is a strike every time, on purpose.
The pins have an explicit rest state. Restitution alone gives infinitely many ever-smaller bounces, so a pin is still turning slowly when the scene ends, at a random angle and often back upright — which reads as frozen mid-fall rather than down.
USBC pin profile and real lane proportions, recovered from the original cold open at 161e239. A static camera left the pins six pixels tall.