Skip to content

Choose a tag to compare

@DanielSnor DanielSnor released this 05 Sep 21:13
· 7 commits to main since this release

./blog.sh 1.7 — the release about finishing a post, not just sending one.

1.6 got a post from a phone to the blog and left it there as a draft, which meant the last step was still a terminal. This one closes that: the page publishes, and it finds out what happened rather than being told. Beside it, the other half of the same idea — changing what a post is without opening what it says: its series, its tags, its type and three flags, from a screen instead of from the middle of the text. Then a link card, about fifty drawings a tag can wear, a video repacked on the way in, and seventeen fixes, most of them found by reading this release as if it were somebody else's.

A post's properties, without opening the post. props gains [e]. The series a post belongs to, the part it is, its tags, its type and the three flags — unlisted, lead image, chapter list — each change from a screen that offers what the site already uses: the series you have, spelled the way you spelled them, with how many posts carry each; the tags, most used first. Until now every one of them meant opening the whole text in an editor to fix one word about it, and since the link card arrived that costs more than typing — a post whose blocks markdown cannot all write down is asked whether it may drop them. A property should not cost the text.

Publishing from the phone, and an answer the page goes and gets. publish <slug> --yes --json answers as one object, the same shape add --json prints, and leaves with zero even when it refuses — because a phone throws away the output of a command that failed. The page uses it: the answer card that appears after a post arrives now carries a Publish button, and pressing it sends one file back down the same connection. And the page no longer waits to be told what happened. It mints a receipt before sending, the build leaves the answer at an address made of it, and the page asks that address every three seconds until it answers. A post that went out while the phone was in a lift is found when the lift doors open.

A link card, written in the front matter. link:, with link_title: and link_description: beside it, makes a post that is about an address — a release, somebody else's article, a page worth pointing at. The card sits above the text rather than inside it, a post with no title of its own borrows the card's, and a paragraph that is merely a link stays what it looks like: an ordinary link in ordinary text.

About fifty drawings, by name. tag_icons could name one of the eight icons the engine ships or take an SVG of your own; there was nothing in between, so anybody wanting a bicycle drew one. The set is now around fifty — travel, weather, food, tools, the shapes a blog reaches for — on the same 24-unit grid, in the same stroke, so a tag's icon and a content type's icon sit beside each other without one looking pasted in. doctor lists them.

A video is repacked on the way in. A recorder writes the index at the end of the file, because while it is still recording there is nowhere else to put it; a browser needs that index to start, so the reader waits for the whole video instead of its first second. media: remux_video: true moves it to the front as the video is attached — the video itself is copied across untouched, not re-encoded — and check names the ones already in the archive, with the command that fixes each.

A stylesheet is no longer part of the engine's fingerprint. The build's record of what went into a page listed everything under assets/, so changing one colour in one stylesheet meant every page on the site no longer matched its record and every page was rendered again. A page links its stylesheet rather than containing it: the file changes, the page does not. Editing a stylesheet now costs the copy of that file and nothing else, where it used to cost a rebuild of every page on the site, whatever the archive's size. The generated palette is not in assets/ and never was; it comes from the configuration, which is still fingerprinted, so changing a colour in site.yml still rebuilds what it should.

/write/ carries a content policy. It is the one page the engine publishes as a file rather than rendering, so it never went through the layout that gives every other page its policy. It has its own now, written into the page: scripts and styles from the site itself, pictures and video from the site or from the camera, connections to the site alone, nothing framed, nothing embedded, no form that goes anywhere.

Fixed, among seventeen. A tag written [release] or #foto in the front matter was filed under a name carrying the punctuation — and a YAML list, tags: [release, foto], left the brackets on the first tag and the last. A published page slugged Write was written over the writing app and took it off the site, with nothing said by the build, check or doctor. A link card's address reached a live href in the heading of a post that had no title of its own. A second video attached to a post could be written over the first, with no warning and no copy in the trash. A part number sent its post to the front of the series instead of to the position it named, renumbering everyone behind it. check called an archive sound while config/site.yml would not parse — the one command people run before a build was the one that did not know. A bullet wrapped onto a second line stopped being a bullet, silently, on every site this engine builds. And a fresh install answered the phone with a bare exit code, so the five refusals that say which part is not ready were the five nobody could read.

Upgrading — nothing to migrate: git pull, rebuild, deploy. /write/ is republished by the build, so a phone holding it on its home screen picks the new page up; nothing else moves. The first build after the upgrade renders the pages this release changed and keeps the rest. Everything here was read twice before it shipped — once by a review whose job was to break it, once more by a second reader whose job was to break the fixes — and both rounds closed with tests that fail on the old code.

Full notes in CHANGELOG.md.

MIT licensed. Documentation · blogsh.app