Why I moved my website off WordPress and onto my Mac mini
I rebuilt nielskorte.nl as a custom site and now host it myself, in a Docker container on a Mac mini at home. Here is the why, the how, and what I learned.
For years this site ran on WordPress. And honestly, WordPress is fine. I know it well, it does the job, and I even rate myself a solid five out of five with it. But every time I opened the admin I felt the same itch: this isn’t really mine. It’s a stack of plugins, a theme I didn’t write, and a database I never look at. I wanted something leaner, faster, and fully under my own control. I also run a homelab, so I had the perfect excuse to put it to work.
So I rebuilt the whole thing from scratch, and now it lives on a Mac mini in my home, in a Docker container, served to you over the internet without a single open port on my router.
The goal
Three things mattered to me:
- Ownership. The site should be plain files I can read, version, and move anywhere.
- Speed. No bloated page builder, no render-blocking plugins. Just fast.
- Fun. If I’m going to maintain my own site, I want to actually enjoy the stack.
The stack
Here’s what I landed on:
- Astro for the site itself. It ships almost no JavaScript, so pages load instantly, and it treats content as simple Markdown files.
- A Git-based CMS so I still get a friendly editor for writing posts, but everything I save becomes a commit in my own repository. The content lives in Git, not in a database I have to back up and pray over.
- Docker, via OrbStack, to package the site and run it on the Mac mini. OrbStack is a joy compared to the old Docker Desktop. It is lighter, faster, and just gets out of the way.
- A Cloudflare Tunnel to expose it to the world. This is the part I’m most happy about: no port forwarding, no exposing my home IP, automatic HTTPS, and it works even though my connection sits behind NAT. The Mac mini reaches out to Cloudflare, and Cloudflare routes nielskorte.nl back down the tunnel.
How it actually works
The flow is satisfyingly simple. I write a post in the CMS. When I hit save, it commits the change to my Git repo. The Mac mini notices the change, rebuilds the static site, which takes a couple of seconds for a site this size, and serves the fresh version through the tunnel. No FTP, no “are you sure you want to update this plugin,” no surprises.
Because the output is just static files, there’s almost nothing to attack and almost nothing to break. It’s about as low-maintenance as a website gets.
What I learned
A few things stood out:
- Cloudflare Tunnels are criminally underused. For anyone with a homelab, this is the cleanest way to put something online safely.
- Static doesn’t mean limited. With a good CMS on top, I gave up nothing in terms of editing comfort.
- Owning your stack is a feature, not a chore. When something is yours end to end, improving it is genuinely fun instead of a fight with someone else’s framework.
This site is the result. It’s faster, it’s mine, and it runs on hardware sitting a few meters from where I’m writing this. Next up: wiring in a few more homelab tricks, but that’s a post for another day.