The build

A static site generated by Jekyll and served from GitHub Pages — no JavaScript framework, no client-side rendering, no build step beyond Jekyll itself. The moving parts are few: the github-pages gem plus jekyll-feed, jekyll-seo-tag, and jekyll-sitemap; one hand-written stylesheet built on design tokens; and about 500 lines of vanilla JavaScript across six small files. Every line of that JavaScript is progressive enhancement — each page works with it switched off.

Set in

EB Garamond for display type, falling through to Noto Serif SC (or a system serif) for Chinese; a system sans-serif for body text; and IBM Plex Mono for the small technical labels. The Latin faces are self-hosted from this origin — no font CDN, no Google Fonts request. Chinese glyphs are served by your own system.

How to audit it

That nothing here tracks you isn't a promise — it's enforced. A strict Content-Security-Policy pins script-src to this origin (plus the two inline theme and motion scripts, by hash) and sets connect-src 'self', so the page can't fetch from anywhere else: no analytics, no CDN, no remote calls. Every change is checked by a post-build validator (scripts/validate_site.rb) that CI runs on each pull request and push to main — it verifies metadata, bilingual hreflang parity, the security policy, and asset integrity. And the source is public: read it, clone it, open an issue.

Privacy

No analytics, no cookies, no third-party resources — no tracking. There's no contact form and no email collected; the way to reach me is a public GitHub issue or discussion, where the conversation stays next to the code.

See all work