How this site is built
I wanted a site that would be straightforward to maintain as I added projects and writing. The personal site is a collection of Markdown files built by one Python script. It reads content/, writes the pages to site/, and wrangler deploy uploads them to a Cloudflare Worker. The project demos have their own subdomains. Some are static sites; the ones that need a model run on my Mac through a Cloudflare tunnel.
A post is a file named YYYY-MM-DD-slug.md in content/posts/, with a few header lines above a ---:
title: How this site is built
summary: One sentence for the list and the feed.
tags: meta
---
The body is ordinary Markdown with support for highlighted code blocks, tables, and footnotes.1 Adding draft: true keeps a post out of the lists and RSS feed, but still builds the page at its URL. That makes it convenient to preview, although the URL is accessible if the built files are deployed.
Images go in static/ and are referenced from the site root:

The personal site and project pages share a palette and similar typography. They follow the reader’s light or dark preference. Longer pages have a collapsible table of contents, and social preview images are served as static PNGs.
-
Footnotes are rendered at the end of the post with a return link. ↩