What a listing says now

./blog.sh v1.10 — part 5 of 8

A listing is the page the engine builds most often and nobody writes. The front page, a tag's page, a year of the archive, the parts of a series, the search results — all of them are cards of posts one after another, and what a card says is the engine's decision, not the author's. 1.10 changes several things on listings at once, and one of them changes without anybody setting anything. That one is worth being ready for.

The card of a picture post carries the picture

A card is cut by height and keeps its first block whatever it weighs. So a photograph under one line of words fell off the card of exactly the post that is that photograph: on one archive the first page of the pictures showed three pictures in thirteen cards. For a post whose kind is image or video the medium now goes first on the card, and the same cut runs over what follows. A picture taller than wide is held to 22rem instead of taking a screen, and the card is charged that height, so the caption under a portrait photograph is on the card too.

This is the change that happens by itself: every site with such posts shows more pictures on its listings after the upgrade. An article with a photograph in it is still an article. And whoever wants the first card of the front page to lead with a picture even for an article switches on layout.lead_card. It is off: it changes one card and only on the front page, and that is a decision about looks the engine does not make for the author.

A page says the days it covers

The pages of a listing are numbered from the oldest post, so the one right behind the front page carries the highest number, and a number without a total says nothing about where you are. There is still no total — it would rewrite every page each time one is added. The dates need none: they are read off the page's own posts.

page 689 · Sep 17–27, 2026

What the two ends share is said once — one month, one year — in each language's own way. The page the numbering starts from says "the beginning" where the link to older posts would stand. A series is paged by parts and says neither.

A heading says how many it holds

A small number after the name, as the index of tags writes it: posts under a tag or of a type, parts of a series, posts of an archive year and of the whole archive, tags in the index. On a tag's listing it stands on the first page only — that page is rewritten by a new post anyway, and on all of them it would rewrite every page of a tag each time a post takes it. A series says it on every page, because that costs it nothing: its cards already count the parts.

And series got a page. A series could be reached only from a post that belongs to it, and /series/ answered 404 with every address under it alive. Now a line stands there for every series — its name, how many parts, which years — with the one still being written first:

Nový Sean.cz     23   2026
Zprávobot.news   19   2026
Mastodon          2   2022–2026

A part's card now names the series first: "Zprávobot.news — part 5 of 19" where it used to read "Part 5 of 19 of Zprávobot.news", so a reader meets what they are in before where they are in it. The same line stands on every card of the series' own listing, which until now showed what belongs to it and not what comes when.

The search says why

The words you asked for are marked in a result — in the title and in the excerpt, as written, accents or none: "ctyri" marks "Čtyři". Only what the card shows is marked; a match deeper in the post marks nothing.

The terminal got the same search: ./blog.sh list --search="words" is the search browse runs behind the slash, for a caller with no screen to type it into. And both keep an index now. Every query used to read every post and fold its text again — 4.9 s on 6,600 posts, 3.8 s of it rebuilding what the query before had built. The index is written to .search_index.json and a post is read again only when its file changed: the same search answers in a quarter of a second. And it searches what the site's own search box searches, in every language the site publishes — a translation's title and text, and the label a language gives a tag.

The 404 page offers what it promises

It said "the menu above and the search box are the way on", and neither stood under the sentence. Now a search field stands there, filled with the words of the address that was not found — /posts/2019/a-day-out/ becomes "a day out", and nothing is searched until the reader asks — and under it links back to the front page, to the archive and to the index of tags, each only where the site has that page, plus the year of the archive when the address names a year the archive knows. No word on that page is new: they are the labels those pages already carry.

What a listing marks for a skin

Nothing looks different until a stylesheet says so. A mention and a hashtag in a post's text carry mention and mention hashtag, the same classes they have in the comments and in the sidebar's toots. The series sentence is three spans — the name, what joins it, the part — so a series' own listing can drop the name every card repeats. "page 689" is a word and a number apart, "4 results" too, the heading of an archive year says its kind and its year separately and the year alone is the link back to the map of years. On a tag's listing the pill of that tag is tag-pill-own. A zero under a post is post-stat--zero.

The price is in the first build after the upgrade. Every listing of a tag and a type, every archive year and every post whose text links a mention or a hashtag is rewritten — on an archive that came from a social network that is a quarter of its posts (1,786 of 6,585 on the one it was counted on), so the first deploy after moving to 1.10 is a long one. Once.

The page nobody writes

None of this the author wrote and none of it they have to keep up: the next build rewrites it by itself, on every site alike. A listing used to be a list of what exists. Now it also says where in the listing you are, how many there are, why this result is here and where to go when an address leads nowhere. Those are four questions a reader has always asked, and until now had nobody to ask.

Comments