Skip to content

devlog

The two pages that mattered were blank

2026-09-04

The product was being outranked by pages that only talk about the product. One of them shipped seventeen characters of text.

Also written ahead of the deploy. What follows is in the build and in testing; the live site is still serving the version this post is about.

The two most valuable addresses on this site are the two that actually do something: the one you drive from and the one you walk from. Both of them shipped as an empty room.

Not empty to you. A browser opens one, starts the engine and paints a town in it. But the file the server sends is a shell that the graphics card fills in afterwards, and anything that reads a page without a graphics card, which is every search crawler and every answer engine, was handed the shell. On the walking page that came to seventeen characters of text, all of them the words "Skip to content".

Meanwhile the pages that only talk about the product carry about three thousand characters each. So the thing itself was being outranked by its own footnotes, and an answer engine asked whether you can walk around a real town in a browser had a described but blank page to work from.

Both pages carry their own description now, in the file that gets sent: a heading, a plain sentence about what the surface is, and the real links to the real places, which are the same links the visible interface offers.

None of it is drawn. The engine covers the whole viewport a frame or two later, so anything laid out there would be a flash of words that a canvas immediately paints over. It sits in the page and in the accessibility tree without occupying a pixel, which has the side effect of giving a screen reader a landmark on a page that is otherwise a bare canvas with a car in it.

That arrangement has one rule and it is not a technical one. Hidden text that describes the page it sits on is an accessibility affordance. Hidden text that describes something else is cloaking, and the distance between the two is one careless edit. Change the page, change the words.

The other half of the week was the front page, where the hero is a cloud of points that resolves into a photograph. That photograph is not only the end of the animation, it is where the points get their colour, so the entire effect waits on it. Half a megabyte, the first thing needed and roughly the last thing asked for.

The same frame in a modern format is 227 kB against 532, identical dimensions, and slightly closer to the original than the other candidate was. It and the point data are now declared in the page itself rather than discovered by the script that wants them, so they fly alongside the code instead of queueing behind it. The declarations carry the same screen test the hero uses, because a mismatch there would quietly download both clouds instead of one.