./blog.sh 1.5
./blog.sh 1.5 — the release that says what is there.
Two things happened here. The site learned to name and to map itself — a post is called by its own words instead of by its address, an archive of thousands gets a map, a site's subjects get a page — and the engine underneath went through two adversarial reviews four days apart: thirty-six surfaces and 173 findings, then twelve surfaces over everything the first round's fixes had touched. Every finding either closed and pinned by a test that fails on the old code, or written down with the number of posts it affects.
A post that never said what it is called gets named from its own words. Until now the slug stood in, so one post had two names: the date in its heading and a machine's address everywhere else. On the archive this was measured against, 2 754 posts of 4 418 — 62% of the site — were called burtiky-opekame-hipstamatic-oggl-jane in the browser tab, on the link card and in every feed item. It takes a whole first sentence when one fits in four to twelve words, and otherwise the first eight, which is what slugs have always been cut to.
/archive/ — a map of the archive. A row per year with a strip of twelve months, and a page per year listing every post by month. An index, not another listing: no excerpts and no pictures, because the point is to see the shape of twenty years at once. Pagination cannot show that — it is anchored to the oldest post, so /page/128/ says nothing about which year it holds.
/tag/ — every subject the site has. Every tag as a pill with how often it was used, alphabetically or by count. Folded, so an accented name sorts where a reader expects rather than after z.
A post can write its own invitation. Asked for in issue #35 by somebody else running the engine: a machine cut rarely lands on a good sentence. A line reading //--more--// splits a post into what it says about itself and what it actually says.
A listing card is cut before it is written, not hidden afterwards. The budget is height rather than characters — a photograph contributes no characters and six hundred pixels — and blocks are kept whole. "Read more" appears exactly when something did not fit.
A code block carries a copy button. Asked for by another operator, for a blog of terminal how-tos. Built by the page's own script, so a browser without JavaScript shows no dead control, and never offered where the clipboard cannot be reached. On a listing card, where the block may have been cut, there is no button: half a script copied silently is worse than none.
Upgrading — nothing to migrate: git pull, rebuild, deploy. On a real 4 418-post archive, 2 744 posts gain a name they did not have, 2 288 listing pages have shorter cards, and twenty-seven files appear (/archive/, its twenty-three years, /tag/, two scripts). Posts are now ordered by the moment they happened rather than by the text of their timestamp, which moves twenty-six posts and takes three of them across a /page/N/ boundary. Not one address changes.
Full notes in CHANGELOG.md.
MIT licensed. Documentation · blogsh.app