Colophon
This site is built to still work in twenty years. That constraint decided nearly every piece of it: each component has to be rebuildable offline from its source or spec, or be ignorable without taking the site down.
The stack
The pages you are reading are static HTML, generated by Zola
from Markdown files with TOML front matter. There is no database and no application server
in the read path. If every tool below disappeared, the content would still be a directory
of Markdown files, plain photos in a date tree, and TOML manifests — readable with cat.
Caddy serves the built files and gets its own TLS certificates over ACME. It runs on a NixOS virtual machine on a Proxmox cluster in my basement, in Maine, behind a home internet connection. The whole machine is declared in a flake and is treated as cattle: only the content and photos are backed up, because everything else can be rebuilt from that one file.
Writing and posting
Posts arrive one of two ways. I write a Markdown file and copy it up, or I post from my phone through Micropub — an IndieWeb standard for publishing to your own site from someone else's app.
The Micropub endpoint is a small Rust program I wrote called micropub-rs. Its entire job
is to accept an HTTP request and write a file. It talks to no database, holds no state, and
can be deleted without the site noticing. Its dependencies are vendored into the repository
so that it still compiles when the crates it was built against have long since rotted.
Between the file landing on disk and the page appearing here, everything is Perl 5 and
systemd. systemd path units watch directories; when a file appears, a Perl script runs.
process-photo.pl makes web and thumbnail derivatives with
libvips, applies the EXIF rotation and then strips the metadata,
and files the photo into a date tree. build-site.pl runs zola build and swaps the result
into place atomically, so a broken post can never replace a working site — it just fails and
sends me a notification. syndicate.pl posts copies to Mastodon and writes the resulting
URL back into the post's front matter.
Perl because its backwards compatibility is close to unmatched, it ships in the base system of nearly everything, and a script written against its core modules in 2011 still runs today. Every stage runs by hand from a shell. Nothing in the pipeline requires the pipeline.
Photos
Full-resolution originals stay private, on disk, forever. What gets published are derivatives with the identifying EXIF removed — location data from a photograph taken at my house should not be a public fact. Photos live in a dated directory tree with a small TOML file beside each one, which means the collection remains meaningful with this website deleted and no software at all.
The design
One typeface: Inter, self-hosted, subset down to the characters this site actually uses. The stylesheet is about a hundred lines. Dark mode follows your system setting and nothing else.
There is no JavaScript on any page. No analytics, no tracking, no cookies, no fonts or
scripts fetched from anyone else's server. Nothing here watches you read it. The Content
Security Policy says default-src 'self', and it is honest — there is nothing to allow.
Standards
Pages carry microformats2 — h-card,
h-feed, h-entry — so machines can read them without a bespoke API. Writing, notes, and
bookmarks each publish an Atom feed. Subscribe
with whatever you like.
URLs are meant to be permanent. When something moves, a redirect stays behind. Cool URIs don't change.
Elsewhere
The site's skeleton — templates, stylesheet, and the pipeline scripts — is public. The content and photographs are not in it. That is the point: the repository stays small forever, and the writing is not a build artifact.
By