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 microformats2h-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 Kurtis Mullins