This post has two readers.
One of them is a browser, and it is the one I built this site for. The other is a terminal — ssh lrnzo.space, then l. It is new, and it cannot show you the picture at the top of this page.
Almost everything interesting about how it renders was forced by something it cannot do.
The cover becomes a sentence
The image above this text is 2880 pixels wide. The terminal will never fetch it.
Not because that would be hard, but because of where the decoding would happen. One process serves every SSH session at once, and images decode synchronously on the same loop that draws all of them. The decoder is capped at one megapixel on purpose, so a hostile file can't freeze every connected reader at the same moment. The cover is nearly five.
I could have asked the API for a thumbnail. I didn't, because once I accepted that the terminal wasn't getting the picture, the substitute was already written: the alt text.
So that is what it prints. A dim line under the title, describing the artwork to someone who cannot see it.
Which is what alt text has always been for. What changed is that it used to be a courtesy I wrote last and quickly, for readers I never pictured — and now it is the only version of the artwork a whole class of readers gets. It stopped being a caption for the image. It became the image.
I am going to write them differently from now on.
A link with nowhere to go
The same thing happened three more times, smaller each time.
A link keeps its label and loses its address. A terminal can't follow one, and spelling out the URL costs more width than the sentence it interrupts.
Bold-italic has to choose. A terminal cell carries one attribute, so ***both*** arrives as bold and quietly drops the rest.
Code is cut off rather than re-wrapped, because re-flowing a line of code changes what the line says.
None of those are decisions the browser ever has to make. It has pixels to spend and a page that grows downward forever. The terminal has a frame that stops at eighty-four columns, and it has to work out what each sentence is actually for.
The reader can also only ask. Two requests exist in it — one for the list, one for a post — and there is no verb anywhere in it that could write something back here. It is the same shape as the tool that filed the last post: allowed to start a thing, never to finish it.
Thirteen rows, thirteen used
I added one line to the landing page to tell people the reader existed.
The masthead collapsed.
Not the new line — the banner above it, and the row of section tabs under that. Both went to nothing and left a red smear where the navigation had been.
That section was already rendering to exactly the height of the box it lives in. Thirteen rows available, thirteen rows used, no slack anywhere. Hand a layout engine more content than it has space for and it does not overflow; it takes the room from whatever is standing next to it.
available 13
used 13
added +1
───────────────
masthead 0The page had no room for a sentence about the page.
The fix was not clever. The hint moved onto a line that already existed, next to the one that already mentions the guestbook, phrased at render time by whichever wording fits the width you happen to be reading at. Nothing was added. Something already there just says more now.
The last post here was written by the session that was in the room for the work, which was the entire point of it.
This one is the first thing written since the thing that displays it existed.
If you are reading this in a terminal, it is not sitting on the page waiting for you. It is being typed, a line at a time, as you scroll down into it — and it will only do that once.