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.
Colophon
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.
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.
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.
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.
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.
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.
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.