What's tracked
- Page URL.
- Referrer (which page or external site sent you here).
- Device category (desktop, mobile, tablet).
- Browser family.
- Country (derived from a hashed, anonymised IP — never stored raw).
What's not tracked
- No cookies.
- No persistent visitor identifier.
- No raw IP addresses.
- No user accounts, no email addresses, no profile data.
- No fingerprinting.
- No third-party advertising or marketing pixels.
How to opt out
Block cloud.umami.is + api-gateway.umami.dev (Umami) and static.cloudflareinsights.com (Cloudflare) in your browser, ad blocker, or DNS resolver. Most of the major content blockers (uBlock Origin, Pi-hole, Brave) block all three by default. The site continues to work normally without any of them.
Custom events
Beyond page views, I track a small set of custom events to see how readers actually use the archive — which downloads land, which works finish, which sharing channels carry. None of these record anything personal.
- download.work — per-work TXT / JSON / BibTeX / RIS download. Properties:
slug,format. - download.volume — per-volume ZIP or Markdown bundle. Properties:
volume,format. - download.corpus — full Conway Edition ZIP or Markdown bundle. Properties:
format. - share.click — share-block click. Properties:
network(x / linkedin / email / copy),path. - cite.copy — cite-dialog copy-citation button. Properties:
style(apa / mla / chicago / bibtex),slug. - identifier.copy — stable identifier copied on
/works/<slug>/history/. Properties:slug. - reader.open — work page opened. Properties:
slug,path,title,volume,kind. - reader.finished — reader scrolled past 95 % of a work. Properties:
slug,path,title,volume,kind. - reader.print — reader hit Print or Cmd+P. Properties:
path. - setting.change — reader-panel preference (theme, font, ruler, etc.) changed. Properties:
key,value. - start.step — reader on
/start-here/clicked one of the five numbered step links. Properties:step(1–5),slug,href. Powers the Start-here funnel. - volume.open — landed on a
/works/volume-N/page. Properties:volume,path. Pairs withdownload.volumein a funnel. - works.hub.open — landed on the
/works/hub. Pairs withdownload.corpusin a funnel.
The implementation is a single ~150-line script at /assets/js/analytics.js. It loads only when Umami loads, so blocking cloud.umami.is blocks the events too.
Why two services
Cloudflare Web Analytics is bundled with the host that already serves the site, so it costs nothing extra and gives me an operational view (latency, error rate, request paths) Umami doesn't surface. Umami gives me the public dashboard the privacy page promises. Together they let me see how the site is doing without storing anything personal.
Why publish this
If you can see what I see, you can hold me to the privacy promises on /privacy/. The dashboard makes "no personal data" verifiable, not just claimed.