Writing
3 posts, newest first. Filter by topic or search to find something specific.
2026
How this blog is built: static Next.js, Cloudflare, and a visitor counter that doesn't spy
A look under the hood: MDX files in a repo, a fully static site, client-side search, GitHub-backed comments and a privacy-friendly view counter on Cloudflare D1.
When two services disagree about a table: why I built migradrift
Schema drift between services is quiet, boring and expensive. Here is the problem, the small Go tool I wrote to catch it in CI, and what it deliberately doesn't do.
Hello, world — why this blog exists
A first post, and a template for how posts are written on this site.