Skip to content

./blog.sh 1.4

Latest

Choose a tag to compare

@DanielSnor DanielSnor released this 25 Aug 09:16
· 4 commits to main since this release

The widest release since 1.0, and the most thoroughly tested one — four adversarial audit rounds over real archives went into it, and the last of them was aimed at the fixes themselves. Three things arrived, and one principle.

The commits widget reads Gitea and Forgejo. Asked for by one of the first people outside this project to run the engine: most of the Fediverse hosts its code on Codeberg or its own Forgejo, and the workaround was mirroring to GitHub for the sake of one sidebar card. widgets.commits.instance takes the server's address and that is the whole configuration — an address already answers which kind of host it is. The forge path costs one request where GitHub costs one per commit, doctor checks the address before the card can turn out empty, and ./style.sh asks the question — on configs written before this key existed, too.

Comments work on GoToSocial. Found on arch-linux.cz, the first site to pair the engine with a GTS instance: no post there had ever shown a single comment, silently. GTS writes status addresses in its own shape and expects a token even on a public thread; the engine now reads both dialects, doctor --online tests the thread the way a visitor's browser will, and the same favourite-moderation Mastodon has works on GTS.

The engine speaks the site's language. The wizards were translated; the narration around them was not — a Czech or German site watched its deploy, its build warnings and its import errors go by in English. Sixty-odd sentences moved into the locales (en, cs, de): the deploy's whole narration, all eleven build warnings, every announcement failure, the import errors, the queue's repair instructions. What a server sent back stays as it arrived; the sentence around it is the site's.

And the principle: nothing fails silently anymore. One address guard answers publish, edit, scheduling, queue moves, restore and re-import before anything writes anywhere. The queue can swap two same-slug posts across years with their media and edit history riding along — and a crash in the middle of that cannot cost a post: the recovery restores, the report says what actually happened, and check's advice never points at the only copy of anything. check refuses everything the build refuses — a file that will not parse, text that is not a list of blocks, a slug that walks out of the tree, an archive of nothing but unreadable files. An install in a folder called blog [1] builds and deploys instead of silently publishing an empty site. Deploy backends survive hostile filenames, rerouted targets and root-owned manifests; imported javascript: links become dead anchors; a broken colour value cannot take the stylesheet down.

The importers grew up too. A Hugo site root imports the site's content, not its machinery; two different markdown trees no longer overwrite each other, and a moved export matches itself instead of duplicating the archive; a Facebook HTML export counts its albums; an import that loses an item says which one and exits 1.

Upgrading — nothing to migrate: git pull, rebuild, deploy. On a real 4400-post archive the rebuild differs from 1.3.2 in nineteen files — the stylesheet and two scripts (search folding, GoToSocial comments), the cheat sheet at /markdown/, where two examples had quietly stopped playing and were replaced with ones checked against the services, and one line in each draft preview whose tags have no listing page yet: those render as labels now instead of links into a 404. Published posts do not change by a byte.

Full notes in CHANGELOG.md.

MIT licensed. Documentation · blogsh.app