Log is my personal blog. The static-site half is unremarkable in a good way - Astro content collections, built and served on Cloudflare Pages, images on R2 so egress is free. The part worth talking about is that the interactive features are self-hosted rather than bolted on from a third party, which meant building an identity story that doesn’t ask readers to make an account.
How it works
- Bluesky-identity comments. Commenting is a Cloudflare Worker where you sign in with your Bluesky handle. That reuses an identity people already have and already trust, so there’s a real name behind each comment without me running a password database or leaning on a comment SaaS.
- Email subscribe in the same Worker. Readers can subscribe for new-post notifications through the same backend, so the whole interactive layer is one small service I control end to end.
- Full-text search, client side. Pagefind builds an index at deploy time and loads lazily in the browser, so search works with no server and no query backend.
- A shared design system. Light and dark themes and a custom typeface are shared with my main site, so the two read as one identity rather than two templates.
Using it
Reading is the plain part, done carefully: serif body type, a light/dark toggle that matches my main site, and search that feels instant because Pagefind ships the index to the browser - you start typing and results show up, no round-trip to a server. Commenting is where friction usually creeps in, and the deliberate call is to not make you make an account. You sign in with the Bluesky handle you already have, so there’s a real name and avatar behind each comment without me running a password database or handing readers off to a comment SaaS. Reusing an identity someone already trusts is a much lower bar than “create a login to leave one comment,” and the comments still live in my own D1 rather than inside somebody else’s embedded widget.
Notes
The pattern I keep coming back to here is doing the “dynamic” bits as edge Workers against a static site, instead of reaching for a full app framework. Comments and subscriptions are the only stateful parts, and they stay small and isolated.
snapshot
reflects log@5720a97captured Sep 23, 2026