The alley from Reel One, stood up in three dimensions. The camera never moves, because in 1903 it couldn’t: it sat on a tripod, held a shot while the action happened inside it, and cut when the action left. Climb, and watch it decide.
Every other 3D platformer solves the camera by gluing it behind the player. This one refuses to. There are seven fixed setups around the alley, each covering a stretch of it, and the director picks one and holds it. The slate in the corner tells you which shot is live, how long it has run, and what made it cut — press C to hide it.
The rules it follows are film rules, not game rules:
No 3D library. There is no build step on this site and no JavaScript dependency in it, and a 1903 look needs nothing a 3D engine is for — no textures, no lights, no shadow maps. It needs flat shapes, grain and a vignette. So the renderer is a pinhole camera, near-plane clipping, back-face culling and a depth sort, in about four hundred lines. It runs offline and it will keep running when whatever CDN you were pointing at moves.
Flat shading with no light in the scene. A face’s tone comes from which way it points — tops brightest, fronts next, sides darker, undersides darkest — and everything fades toward the ink with distance. That last part is doing most of the work: it is what gives the alley depth without a single lamp in it.
Two and a half dimensions, deliberately. The cat plays in one plane, with the same numbers as the 2D reels: 640 against 1500 gravity, 215 across. The world has depth so the camera has somewhere to stand. Moving her through that depth is the next problem; framing her is this one.
What is not in here yet: the neighbours, the errand chain, the lantern-moth, the hat trade, the ledge grab, and the leaderboard. The bottle, the hats and the five breakables are present only so the director has something worth cutting to. This is a camera prototype wearing a level, not a reel.
The first version put a 16:9 letterbox on every screen. On a phone held upright that is about two hundred and nineteen pixels tall — a postage stamp to climb an eighteen-hundred-unit alley in. The obvious fix is a taller picture, and the obvious fix broke the camera outright: fourteen shots instead of nine, an average under two seconds, eleven of them emergency cuts, and one ledge in the alley that no setup could frame at all.
The reason is that a field of view defined vertically gets narrower horizontally as the frame gets taller. Every setup had been composed against a wide picture, and on a tall one they had quietly become letterboxes stood on end — so the cat kept walking out of the sides of shots that no longer had any sides. The lens now covers at least the designed vertical field and at least the designed horizontal one, whichever is wider, which means an upright frame opens up instead of pinching in. At 16:9 the two agree exactly and the desktop picture is unchanged to the frame.
The thumb pads are drawn into the picture rather than sitting over it, and each finger is tracked separately — the first attempt split the canvas into invisible thirds and dropped the walk whenever any finger lifted, so jumping while running stopped you dead. A finger that slides off a pad now keeps walking, because that is what thumbs on glass do. The alley’s geometry is also built once instead of every frame, which was three hundred and forty short-lived objects per frame that a desktop shrugs off and a cheap phone collects garbage over.
This was written somewhere it could not be run, which for a camera is an obvious problem: everything wrong with a camera is obvious on sight and invisible in the source. So the things you would notice by looking became numbers instead, in tools/check-camera.mjs, which lifts the camera code straight out of the game and walks the cat up the alley at sixty frames a second.
It asks whether each setup points where it claims, whether a polygon straddling the lens clips instead of smearing across the frame, whether any ledge exists that no setup can frame the cat on, and then the question that actually matters: how long does a shot last? A director that cuts every second is a strobe light, and that failure would never show up in a syntax check.
It caught three real faults. The director could pick the shot it was already using while the cat stood outside it, and then do nothing — she was off camera for two and a half seconds of the climb. Fixing that introduced a worse one: the emergency branch ran before the cut floor, so while she was mid-jump it re-cut every single frame, which the harness reported as two cuts zero seconds apart. And the first version of the test route teleported her between ledges, inventing frame-departures that real play never produces. The numbers now: nine shots across twenty-seven seconds, averaging three seconds each, worst single lapse thirteen hundredths of a second.
The same harness takes the frame size on the command line, which is how the phone problem above was found and then proved fixed rather than argued about. Upright at 390×490 it now reports nine shots at a three-second average with two emergency cuts — marginally better than the desktop figure, because a taller frame holds a climbing cat for longer.