Colophon

How this site is built.

The same preference for simple systems and fewer moving parts, applied to my own corner of the web. View source: what you see there is exactly what I wrote.

KB on a first visit, before the photo
<90
Third-party requests
0
Cookies
0
Build steps
0

No framework, no build

Plain HTML, one stylesheet and one small script, written with Claude Code as my pair programmer. No bundler and no npm install: the files in the repository are the files your browser downloads.

  • HTML
  • CSS
  • Vanilla JS
  • Claude Code

CSS does the motion

Native nesting and oklch colours. The stats count up through an @property integer, the reveals and the alpine photo are scroll-driven animations, the timeline opens with ::details-content, and pages cross-fade with view transitions. All of it respects reduced motion.

  • @property
  • Scroll timelines
  • View transitions
  • Container queries

Nothing leaves this server

Geist and Geist Mono are self-hosted rather than loaded from Google Fonts, which would share your IP address. No analytics, no embeds, no cookies. Images are AVIF with a WebP fallback, and the photo of the Alps had its location data stripped before publishing.

  • Geist
  • AVIF
  • GDPR

One machine, served straight from git

nginx on Ubuntu serves the checked-out repository directly, over HTTP/2 and HTTP/3 with brotli compression and a Let’s Encrypt certificate. Speculation rules let your browser prerender the next page before you click.

  • nginx
  • HTTP/3
  • Brotli
  • Speculation rules

Locked down by default

The Content-Security-Policy starts from default-src 'none' and only allows this site’s own scripts, styles, fonts and images. Add HSTS, a strict referrer policy, a permissions policy and a security.txt for responsible disclosure.

  • CSP
  • HSTS
  • security.txt

DNS and mail, hardened

The domains are DNSSEC-signed, CAA records limit who may issue certificates, and mail is protected by SPF, DMARC set to reject, MTA-STS and TLS reporting. For the curious: there is a humans.txt and an llms.txt.

  • DNSSEC
  • CAA
  • DMARC
  • MTA-STS