Hello, world (Again)
By Daniel Samson · 2026-05-19
Welcome weary traveller!
I restarted my blog site with Cloudflare Workers, D1, R2 and Hono — and after a few weeks of building on it I think this is the stack I'd reach for again.
Why this stack?
The whole site runs at the edge. There are no containers, no VMs, no DevOps to keep warm. Here's what I've come to like about each piece.
Cloudflare Workers
Workers run on V8 isolates rather than full containers, so cold starts are measured in milliseconds. Deploys go worldwide in seconds, and each request is served by whichever data centre is closest to the visitor. No spin-up cost, no warm pool, no idle bill.
The bit that surprised me most is the price/performance: the free tier alone covers a personal blog comfortably, and the paid tier is priced per CPU-millisecond rather than per request-second. You stop optimising for "keep the server warm" and start optimising for actual work done.
Hono
Hono is a tiny (~14 kB) router that fits Workers' programming model perfectly. It's fast, type-safe, and the API reads like express without the legacy baggage. Middleware, routing, JSX rendering, OpenAPI — they all compose cleanly.
Because everything is fetch-native, the same Hono app I write here would run on Bun, Deno, Node or Vercel Edge with no code changes. That portability matters less for a blog, but it's a nice property to have for free.
D1 (SQLite at the edge)
D1 is SQLite running in Cloudflare's data centres. You get real ACID transactions, the familiar SQLite dialect, and a binding-shaped query layer — no HTTP round trip per query, just function calls into the runtime.
For a personal site, the schema you'd normally outsource to Postgres fits comfortably here: auth, posts, pages, files, tags, settings. Migrations are versioned via Wrangler so the local dev DB and prod DB stay in lock-step.
R2 (object storage)
R2 is S3-compatible storage with one crucial difference: zero egress fees. Images, uploads, attachments — none of them rack up bandwidth bills when readers fetch them.
Combined with Workers, you can stream files straight through, gate them behind auth, or transform them on the fly without paying twice for the same byte.
Putting it together

The CMS that renders this very post is built block-by-block on top of those primitives. ProseMirror handles content editing, Tiptap wraps it for React, and a small block system (Title, Text, Hero) lets me compose pages without a templating language. Every page render is just a D1 query and a string concat — no SSG step, no edge cache to fiddle with.
The whole site lives in a single repo, deploys via Wrangler in about 20 seconds, and costs less per month than the domain name.