the plan v1 never had

September 7, 2026 meta metaroadmap

v1 of this blog is done and merged. Before I start on v2 I wanted to write down the roadmap that got me here, and that is where the joke starts: there wasn't one.

When I began, the plan in my head was roughly "a blog, written in Go, that I host myself". That was the whole spec. No list of features, no order, no idea how big it would get. I just started with an auth service because logins felt like the hard part, and figured the rest would follow.

The rest did follow, but not in any order a sane person would have picked. Here is roughly what actually happened, reconstructed from the git log:

The front page of the blog as v1 ships, scenery and all

First the auth service, with its own database, JWT keys and roles. Then the blog service with posts and markdown. Then comments, because a blog without comments felt dead. Then likes on comments, then moderation because I now had things to moderate, then media uploads through MinIO, then the admin panel to hold all of it. Then I spent days on the redesign, the island, the birds, the night sky, and wrote more posts about pixels than about code. Then scheduling, so posts could publish themselves while I sleep. And at the very end, in what I called v1.1, the grown-up features arrived: GDPR data rights, visitor analytics, and an error log I can actually read.

Notice what is missing from that list until the very end: everything boring and important. Backups still don't exist. Email doesn't exist, so password reset doesn't exist either. If I had written a roadmap on day one, "backups" would have been near the top and "animated puffins" near the bottom, and honestly the puffins might have lost. I'm glad they didn't, but that is luck, not planning.

The stack ended up like this, which I am actually happy with:

services:
  caddy:     # the front door, TLS, body limits
  frontend:  # SvelteKit
  auth:      # Go, own Postgres
  blog:      # Go, own Postgres
  minio:     # media storage

Two small Go services with their own databases talking over an internal network, a SvelteKit frontend, and Caddy in front deciding who gets in. Every piece is something I can read top to bottom. That was the one rule I accidentally followed the whole way: no piece I don't understand.

What I would tell the me from a few weeks ago: write the map first. Not a detailed spec, just the order of things, so the boring load-bearing features don't all pile up at the end. That lesson is why v2 is getting an actual roadmap on this blog, written before the code this time. Growth, probably.

0 comments

Log in to comment.

Log in

No account?