Writing for machines that cannot see
Most of the web is now read first by something that will never look at it. That changes what a page owes its reader.
There is a particular kind of vanity in a website that looks magnificent and says nothing. For most of the last decade this was a survivable flaw, because the audience was a person with eyes, and a person with eyes can be persuaded by a good photograph and a confident headline. That audience has not disappeared. But it has been joined by another one, and the second audience cannot see anything at all.
When a language model reads a page, it does not experience the page. It receives a sequence of characters. Whatever meaning survives that transformation is the only meaning the page has. The hero image is gone. The careful spacing is gone. The colour that took an afternoon to choose is gone. What remains is the text, and the shape the text was given by its markup, and nothing else. If the argument of a page was carried by anything other than those two things, the argument does not arrive.
This is not a complaint. I think it is one of the more clarifying constraints to appear in web design in years, because it is a constraint that rewards exactly the thing that was always supposed to matter. A page that reads well as plain text was, almost always, a page that was written well in the first place. The discipline of writing for something that cannot see is the discipline of having something to say.
The failure is quiet
What makes this difficult is that the failure mode gives no warning. A site that renders its content with client-side JavaScript looks perfect to its author, perfect to its designer, perfect in every screenshot, and arrives at a crawler as an empty shell with a loading spinner in it. There is no error. Nothing is red. The page simply contains nothing, and no one finds out, because the people checking are people, and people run JavaScript.
The measurements bear this out more starkly than I expected. When Vercel instrumented real crawler traffic against their own infrastructure, they found that none of the major AI crawlers rendered JavaScript at all. Anthropic's crawler downloaded JavaScript files in roughly a quarter of its requests and never executed a single one. OpenAI's did much the same. The only significant exception was Google's, which inherits a rendering pipeline built over fifteen years for an entirely different purpose. So a page can hold the first result on Google and be, to every other reader that matters now, a blank sheet.
I find the asymmetry worth sitting with. We spent a decade being told that the rendering gap had closed, that Googlebot could handle a single-page application, that server-side rendering was an optimisation rather than a requirement. All of that was true, and all of it quietly stopped being true, and almost nobody was told.
What the text has to carry
Once you accept that the text is the whole artefact, some decisions that felt like matters of taste turn into matters of function.
Headings stop being typographic furniture and become the table of contents that a model builds its understanding from. Skipping from a first-level heading to a third because the third one looked better at that size is no longer a small sin; it is a false statement about the structure of your argument. Link text stops being something to keep tidy and becomes the only description the destination gets. Alt text, when there are images at all, stops being an accessibility checkbox and becomes the sole existence of the image.
And the first sentence of anything you write becomes disproportionately load-bearing, because it is the part most likely to survive summarisation intact.
None of this is new advice. It is the advice that accessibility practitioners have been giving, patiently and largely unheeded, for twenty-five years. The interesting development is not that the advice changed. It is that the incentive finally did. Writing a page a screen reader can navigate and writing a page a model can understand turn out to be very nearly the same task, and the second one has a budget attached.
Against the image
I have taken the constraint further on this site than most people would want to, and removed images entirely.
The reasoning is not that images are bad. It is that an image is a place where information can hide. Every diagram I have ever put in a post was a diagram I made because the prose underneath it was not doing its job, and the image let me avoid noticing. A screenshot of an error message is a way of not writing the error message down. A chart is a way of not stating the finding. When the picture is removed, the sentence has to be written, and the sentence is what everything downstream — the search index, the summariser, the person reading on a slow connection, the person reading with their eyes closed — actually receives.
There is a cost. Some things genuinely are easier to see than to describe, and I will occasionally lose that. I have decided I would rather pay it than keep the escape hatch, because the escape hatch is the thing I reach for exactly when the writing is weakest.
The part that is still for people
None of this argues for austerity. A page can be entirely plain text and still be beautiful, and I think the constraint makes the typography more interesting rather than less, because typography is suddenly the only visual instrument left. Measure, leading, the scale between a heading and its body, the amount of air between one thought and the next — these are the whole toolkit now, and a toolkit of five things used seriously beats a toolkit of fifty used carelessly.
So the design of this site varies from one piece to the next, and it varies according to the writing itself: how long the paragraphs run, how often the argument breaks for a heading, how much of it is prose and how much is code. Two essays of similar length can look nothing alike, because they are not shaped alike.
But the markup underneath never changes. Every post here emits the same elements in the same order, so that anything reading it structurally sees one consistent document, over and over, no matter what it looks like. The variation is entirely in the stylesheet, which is precisely the layer that the machine discards.
That seems to me the right place to put it. Let the design be for the reader who can see. Let the structure be for the reader who cannot. Neither has to be compromised for the other, so long as you are honest about which layer you are working in.