How this site is built

Everything below can be verified from your browser’s developer tools without taking anyone’s word for it.

Architecture

Pages are rendered at the network edge, close to the reader, then written to a cache there. In steady state almost every request is served from that cache and never reaches the database: a cached response has no database in its path, which preserves most of the security profile of a purely static site.

Editorial content lives in version control and is deployed as code. Nothing is stored in a content management system. The revision history shown on each doctrine document comes from the commit log.

What this site does not do

  • Sets no cookies, which is why there is no consent banner.
  • Loads nothing from a third-party origin. No hosted fonts, no analytics, no embedded widgets, no share buttons.
  • Collects no analytics of any kind.
  • Has nothing to log in to. There are no user accounts and no sessions.
  • Uses no CAPTCHA. Challenge scripts are an accessibility barrier and a third-party dependency; unwanted traffic is filtered at the network edge instead.

One exception, on the server side rather than in your browser: when someone submits the contact form, this site calls an email service so the message is not missed. It is told which kind of enquiry arrived and when, never the sender’s name, address or message, which stay in the database described below. Nothing is called for an ordinary page view.

Security posture

Content Security Policy
Denies everything by default. No inline style is permitted, and the one script on the site is allowed by the SHA-256 hash of its own source rather than by a per-request token, so the policy cannot fall out of step with what is served, and pages stay cacheable.
Transport
HTTPS only, with HSTS preloading and no mixed content.
Database access
Every statement is prepared with bound parameters, and all of them live in a single file so there is one place to audit.
Object storage
Private. No public bucket and no public bucket domain.
Data retention
Messages sent through the contact form are deleted automatically after one hundred and eighty days. Nothing else about a visitor is recorded.

The one script

Roughly five hundred bytes, and it does one thing: remembers which reading theme you chose. Without it the site follows your operating system’s light or dark preference, and every page works normally. It is disclosed here rather than described as “no JavaScript”, because the second would not be true.

It is permitted by the hash of its own source. That detail matters: an earlier version used a per-request token, which meant cached pages were served with a token that no longer matched, and the script was silently blocked. Every claim on this page is meant to be checkable, so a mechanism that quietly stops working is worse than one that is simply less clever.

Typography

Set in whichever serif and sans-serif your device already has. Nothing is downloaded, which is faster and means no font service learns that you visited.