id: publishing
title: A post reaches the network in one deploy
status: continuous
repos: [headquarters, infra]
dependsOn: []
exitCriterion: >
Writing a post, deploying it and publishing it to ATProto is one pass, and
a shared link unfurls as the thing it points at. #
The blog is prerendered from markdown in web/src/content/blog with an Atom
feed at /atom.xml, and posts are published to lance.blue's own repository as
standard.site records with sequoia. The first post
carries its site.standard.document record.
The lag is cheap. The record carries the post's own text, so a reader
seeing it in the network gets the whole post either way; what the missing
tag costs is Bluesky's richer preview, which reads the tag off the page.
Doing it in the other order is not cheap: publishing also posts to
Bluesky announcing the URL, so publishing before the page is served sends
that announcement's clicks to the app shell, which answers 200 rather
than 404. Worth deciding whether `bluesky.enabled` should be on at all.
The reason it sat unbuilt is not the build step. A public roadmap is a
promise, and twenty-seven epics with statuses read as a commitment to
twenty-seven things. What to render is therefore part of the work: the
register as it stands, or the milestones in
[milestones.md](milestones.md), which is the same work in prose and
without the appearance of a schedule.
The glyphs are now outlines taken from the same woff2 files the browser
downloads, which fixes the drawing and the reproducibility together. The
alpha stamp is on it as well, built from `.stamp`'s own numbers, so a
card in a feed says what every page of the site says. `social-card.test.mjs`
resolves each `--font-*` token the script names and fails if the file it
loads is a different family.