Open source · MIT
Written in Remotion and locked to the frame clock. The ecosystem ships 81 templates and nine of them are ways to reveal a logo. None of them do a prompt being typed, a cursor that acts, real app UI on a tilted plane, or a response streaming in. That gap is what this is for.
The scenes
A slab of real product UI enters from off-frame onto an inclined 3D plane, and the camera rotates toward frontal while the board fills in. It ends more frontal than it started, so the next scene can enter from this final state instead of cutting to it.
This one starts where the last one stopped. Not roughly: both scenes read the same camera pose from the same module, so the first frame here is the last frame above, and seam.sh proves it by diffing the two — the join comes out 32× closer than a deliberate cut taken from the middle of this same scene, which is the control that stops the number from being decoration. The card lifts, crosses in an arc and lands, and the column below only closes up while it is landing. Snapping the gap shut on the frame it leaves would be a cut wearing an animation costume.
The third link. It enters from the pose CardHandoff stops in and descends onto the card that scene has just delivered, magnifying it 2.35 times. One measured join made the no-cuts rule true of a pair; two make it a property of the sequence, and seam.sh now takes the pair as arguments because a join exists for every adjacent couple. Across the four scenes yaw runs -18, -9, -4, 0 and pitch 5, 2.5, 1.2, 0 without ever reversing: a join reads as a cut when the derivative flips, even when the pixels match. The text holds up under the push-in because the slab is DOM and gets rasterised at the final size, and focus-sharpness.sh measures that at 2.09× against the same content magnified from the wide shot, 1.03× on a fixture built to be exactly the defect it looks for.
The camera lets go of the card and comes back wide and frontal, with the board readable again, because the shot has to breathe before it goes anywhere else, and finishing on a detail leaves the piece open. It is the one scene in the chain that reverses the push, and it is allowed to: a reversal reads as a cut where the join is moving, and both sides of this one are at rest. rest-point.sh measures that instead of taking it on trust, and it fails on CardHandoff, which deliberately does not start at rest.
The fifth link, and the one that used to be homeless. Four beats in one unbroken shot: the cursor comes down onto the composer, the prompt is typed with uneven human rhythm, it is sent after a pause, and the answer streams back word by word. It used to draw a slab of its own — 2200 wide at perspective 2800, its own chrome, its own sidebar — which made it a second screen, and between two screens the passage is a cut whatever you do with it. Now it is the same slab as the other four, with the assistant living in the bottom half the board never used, and the move from the board to the composer is a camera descending. seam.sh measures the join.
Four rules
useCurrentFrame() and nothing else. No CSS keyframes,
no rAF, no wall clock. A frame renders the same in the studio and
in headless CI.
Every scene takes a normalized 0→1 progress so a parent timeline can drive it. Left unset, it derives one from its own frame.
The reference commercials run 52 and 41 seconds in one shot. Scenes
chain by continuous transformation, not by cut. A scene that has to
enter from another one's final state can be measured, which is what
seam.sh does to the join above.
Slabs of the actual product on inclined planes, with the product's own tokens. A mockup that is 3px off reads as a mockup.