Search articles

Type a keyword to start searching

Colophon

How this site is built and maintained. It is a small engineering project of its own, and some of its choices are worth writing down.

Static first

The site is generated as static HTML with Astro. Interactive parts of the work pages render with React and load scripts only where needed; articles are plain HTML and CSS. There is no server application to patch.

One profile, many pages

Biography, experience, papers, patents, and contact details live in one JSON file. The home page, About, Publications, and structured data are generated from it. Generated snapshots are never edited by hand, and a check compares hashes so pages cannot disagree.

Approve, then publish

The writing folder holds both public articles and private notes, so location alone never makes something public. Only articles whose content hash is registered in the publication allowlist reach the build, the search index, and RSS. Change one character and the hash changes; the article must be reviewed again. After the build, an independent check scans the output for anything unapproved.

Search, feeds, and sharing

Search uses Pagefind: the index is built ahead of time and queried in the browser, with no external service. RSS carries a summary of each article, and every article and project gets its own share card at build time.

No tracking

There are no third-party analytics, ad, or social widget scripts. The Content Security Policy allows only this site's scripts, with each inline script registered by hash.

Type

Chinese headings use Noto Serif SC and body text Noto Sans SC; Latin text uses Inter and code JetBrains Mono. All are used under the SIL Open Font License and subset to stay small.

Releases

Every release runs type checks, unit tests, privacy regressions, build output checks, performance and size budgets, and browser tests. The output is then frozen into a hashed bundle and uploaded; a bad release rolls back to the previous bundle.