version two

September 10, 2026 devlogmeta

version two

When I pushed version one of this blog out the door in the summer I wrote that the next step was to turn "a nice blog" into "a real self-hosted system". Version two was that step, and it is done now, so here is the whole thing in one post.

The blog got its own post office. A small mail service now owns everything that leaves the site as email, with a durable outbox so nothing gets lost if SMTP is having a bad day. That unlocked a bunch of things I had wanted for ages: registration emails with verification links, contact form messages landing in my inbox, replying to those messages straight from the admin panel, and now password reset. If you forget your password there is finally a "forgot password?" link. The reset link works once, dies after an hour, and asking for one reveals nothing about whether an email address has an account here, the answer looks identical either way.

Every error, one place. Auth, blog and mail each used to keep their own error log, and the admin view had to stitch them together in the browser. Now a small log service collects everything. Each service still writes locally first and ships in batches in the background, so if the log service is down nothing is lost, the rows just wait and go later. I stopped it on purpose, threw errors at the site, started it again, and watched everything arrive exactly once. Very satisfying.

Backups that actually run. Database and media backups on a schedule, with restore controls in the admin panel and a health check that complains if a backup goes stale. I tested a full restore, including the case where a whole database was missing. You do not want the first restore test to be the real one.

Push to deploy. Merging to main now builds everything, runs the tests, and rolls the live site over by itself. Getting there was its own little saga, the first deploy failed on a missing host key, the second on a missing secret, and one empty variable in the production config turned out to have been silently disabling every email feature the whole time. That one stung. It all works now, and a deploy leaves a release notes draft in the admin for me so I stop forgetting what went out.

The admin panel grew up. It had become thirteen flat menu items and three different button styles stacked over a year of adding things. I rebuilt it: grouped navigation that folds away, one set of controls everywhere, tables where the delete button actually looks dangerous, and user management in one dialog instead of five widgets crammed into a table row. The settings page speaks human now instead of showing raw config keys.

Posts in three languages, with help. The blog has been trilingual since the i18n work, but keeping en, no and es in sync by hand is the part that makes people quit. There is now a translate button in the editor that pre-fills the other language as a draft for me to review and fix before publishing. It never runs on its own and a page view never triggers it, translations happen once, when I ask, and get stored. The privacy policy says exactly what leaves the server and when, because that matters to me.

A photo gallery. I live on an island that looks like this and I hike a lot, so the blog now doubles as a photo collection. Bulk upload, albums, thumbnails so nobody downloads a 12 MB original just to see a grid, and each photo gets its own page with a caption. The originals stay usable inside posts.

Series and reply emails. Posts can belong to an ordered series with a "part 2 of 7" box and previous/next links, which is what the seven part story about building this place always wanted to be. And if someone answers your comment you can get an email about it, one email even if five people pile on, with an off switch in your account settings. For now those emails are English only, since the site deliberately never stores what language your account is. I may revisit that.

Version one was me learning to build a blog. Version two was me learning to run one. The difference turned out to be bigger than I expected, and most of it is invisible, which I have decided is the point. Next up: probably a newsletter, maybe federation, definitely more photos.

0 comments

Log in to comment.

Log in

Forgot password?

No account?