Writing
Writing on building for the web, mostly on Cloudflare.
14 posts20262 hours of reading
21 minFeatured
Every Cloudflare product, and which ones this site runs on
What every Cloudflare developer product does as of September 2026, and which ones a complete site runs on and why.
3 min
Carrel, part 3: AI drafts sit beside mine, never on top
Carrel, part 3
How Carrel lets an AI assistant draft, check and preview writing without ever replacing the writer's text or publishing on its own.
3 min
Carrel, part 2: one small API for every site
Carrel, part 2
The API every site gives Carrel to list, read, save, preview and publish posts, how this site implements it, and its one rule about first publication.
3 min
Carrel, part 1: a writing desk that lives apart from the site
Carrel, part 1
Why the writing for this site moved out of the site's own admin and into a separate private tool, and what that separation buys.
10 min
Rendering Observable Plot charts inside a Cloudflare Worker
How to render accessible Observable Plot charts inside a Cloudflare Worker with linkedom, with the same output in Node and workerd.
9 min
Put the rules in the API, not in the MCP server
Put authentication, authorization and business rules in your HTTP API once, and build MCP servers as thin layers on top that hold none of them.
13 min
Building an MCP server on Cloudflare Workers with OAuth
How to build a production MCP server on Cloudflare Workers, choose its auth by testing your real client first, and keep policy out of it.
12 min
Giving an AI agent write access to a live site
How to give an AI agent real write access to a production site safely, with one shared write path and one operation only a human can perform.
11 min
Site search on Cloudflare D1 with SQLite full-text search
How to build site search on Cloudflare D1 with SQLite FTS5, using two indexes for stemmed and exact matches and reciprocal rank fusion to rank them.
15 min
How this blog stores posts in git and serves them from D1
How to keep markdown posts in git as the source of truth and serve every read from Cloudflare D1, with one renderer shared by the build and the Worker.