Skip to content

devlog

A control you cannot see

2026-09-03

Phones stopped being turned away on their name. Then the controls had to become controls, which took being told so plainly.

None of this is live yet, and on this one that is worth saying first: open the site on a phone today and you still meet the wall. It is built, it is being tested on real handsets, and it goes out when the numbers at the end of this post have been taken on more than two of them.

A phone used to be turned away here on its name. The browser sends a string saying it is a phone, and the site said come back later. That sounds cautious until you notice that every other machine is tested on what it can actually do. A desktop with no WebGPU was let through and shown the compatibility page, politely, on the strength of a real capability check. A recent Android with the same WebGPU a laptop has never got the chance to pass one.

One of those is a gate and the other is a guess about a category. The guess is gone; there is one test now, and a phone takes it.

Then the controls, which is where I got it wrong first. The instinct was minimal: draw almost nothing, let the picture have the screen, bring a control up under the thumb that reaches for it. On my screen that looked restrained. On a phone it was invisible, and the verdict came back in one line. A control you cannot see is a control you cannot find.

That is not a disagreement about taste. Minimal was my idea and not the visitor's, and a phone is a touchscreen rather than a cursor with a smaller desk. Everything is drawn now, at rest, the whole time.

Speed lives on the left edge and it is not a pedal. A pedal means a thumb pinned to the bottom of the screen for the length of a drive. The lever holds where you leave it, so a hand sets a speed and lets go, and the bottom tenth of its travel is reverse and springs back to nothing when released. Direction lives on the right: an arc, thumb on it, slide along it, centres itself when you lift off. Four buttons carry words rather than glyphs you have to learn, and on foot two of them become run and jump.

Brake means stop. The first version paused the cruise and let the speed resume when you let go, which is a defensible rule on paper and read on a phone as the brake doing nothing at all.

Anything that flies gets something else entirely: two sticks, one under each thumb, laid out the way a radio transmitter is, because anyone who has flown a quad already has that layout in their hands and nothing is gained by inventing a different one.

The steering was the part that was broken rather than merely unfinished. The on-screen controls could only press the same left and right a keyboard sends, so a phone got full lock or straight ahead while a game controller plugged into the identical physics got a proper axis. A touchscreen knows exactly how far along the arc a thumb has slid, and that was being rounded to a key press. It writes the axis directly now, and so does tilt-to-steer, so a small lean is a small correction.

Holding the phone upright was the other decision worth writing down. The obvious move is a card telling you to rotate it. What ships instead is the whole surface turned ninety degrees, so it stays playable held either way and simply reads as wanting to be turned. On Android the browser will go fullscreen and lock the orientation when you tap to start; on an iPhone it will do neither, and the rotation is the thing that works on both. The failure mode there is worth knowing about: pointer coordinates do not rotate with the picture, so the layout looks perfect and the car steers when you swipe upward.

A pause console designed for a laptop, on a phone in landscape, is mostly not on the screen. Pause, settings, the map and the controls card all have a short-screen version now: one card with resume as the accent and the rest as chips, a settings pane whose categories run in a strip along the top, a map that is a small plate you tap open instead of a quarter of the view.

Then speed, and the cheap wins first. The drawing is paced to thirty frames a second on a handheld and fifteen when nothing is moving, while physics, input and the readouts keep running every tick, so the controls stay as responsive as they were and the part that flattens a battery stops running flat out. The brightness pass over each finished frame is skipped, since it is a second full-screen compositing pass for a mild exposure correction. The reverb is not built at all: it is a stereo convolution running continuously on a chip whose audio thread shares the cores the renderer is already starving, and a phone speaker loses very little to going dry.

The honest part. Three of the ceilings a phone runs into were desktop numbers that nobody had ever considered in a phone context: the detail level a walked town opens at, the memory budget for splats, and how many pixels the renderer is asked for. All three have a handheld number now, and none of those numbers is a measurement. They are arguments, and they were chosen on two devices.

Which is why the pause card on a phone now prints the frame rate, the splat count and the resolution actually being drawn. The next step is a spread of real handsets, weighted toward old ones, and that goes much faster when the phone will simply tell you the numbers. The new phone is not the one that decides whether this works.