Welcome to the terminal
A quick note on why this blog exists, what you can expect, and how to drop a new post into it.
This is where I keep the receipts.
Most of what I do leaves no externally visible trace. A server stays up. A deploy doesn't wake anyone. A migration lands without a rollback. Nobody gets a postcard when that happens — which is fine, because nobody wanted one.
But I've been doing this for over a decade, and I've run out of patience for re-deriving things I already figured out. So this blog is where I write down the post-mortems that never needed to be written, the hacks that turned out to hold for five years, and the operational trivia I'll otherwise forget.
What to expect here
- Operations, at scale. Scaling a Minecraft hosting platform to 850 concurrent servers taught me things that still apply today. Some of them are embarrassing.
- Homelab experiments. I self-host as much as I can, and I document what actually survives contact with my kids, my cats, and the occasional power blip.
- Post-mortems. Always with names changed to protect the innocent. I have opinions about blamelessness and none of them are strong enough to override "read the damn logs first."
How this blog works
The frontend you're reading is a plain Next.js page that reads markdown files out
of /src/content/posts/. To publish a new post I drop a file like this one into
the folder and it shows up. No CMS, no database, no admin panel. Just text and
git.
The frontmatter looks like this:
---
title: "Your post title"
description: "The one-line teaser that shows on the index."
date: 2026-04-14
tags: [ops, homelab]
draft: false
---
If I ever need a CMS, I'll set one up. Until then, I have vim and an unreasonable
amount of muscle memory for git commit -am "post: thing".
Come back whenever
The front page carries a preview of whatever's most recent, and there's an RSS feed at /feed.xml if you're into that sort of thing. I am into that sort of thing.
Thanks for reading. See you in the next one.
— Jake