~/ james liew /2026-05-26-moving-to-hetzner $
May 26, 2026 · 5 min read

Moving everything to Hetzner

Inspired by @levelsio, I'm consolidating my projects onto one server.

Today I provisioned a Hetzner server in Germany and deployed this site on it.

The plan is bigger than just this blog. Over the coming months, I want to move my works off the various platforms they sit on (Vercel, Supabase) and onto a single server I own.

This isn’t a story about saving money, although the math is wild. The real reason is something else.

The tweet that did it

I’ve been following @levelsio on X for a while. He runs his entire empire — Nomad List, Remote OK, Photo AI, a dozen other things — off a handful of Hetzner boxes. He posts the pricing screenshots like trophies.

The one that got me was this:

Levelsio tweet: 20TB free bandwidth for $4.99/mo at Hetzner

20 terabytes of bandwidth for the price of a coffee. For comparison, that’s about the same as what Vercel charges me for far less, on a “Pro” plan I never use the features of.

But it wasn’t just the price. It was the implication — that one person can actually run this stuff themselves. Not “use a platform that runs it for you” but actually own the infrastructure.

The second tweet that pushed me over:

Levelsio tweet: Tailscale + Cloudflare lockdown for VPS

Block all inbound traffic. Tailscale for SSH. Cloudflare in front of the web port. That’s it. Anyone who’d previously thought “running your own server sounds scary” — that’s the whole security model in three lines.

Why I actually did it

The honest answer: I’ve been paying for too many things.

Vercel Pro. Supabase Pro. A second Supabase project. Cloudflare Pro on one domain. A handful of other small monthly bills that add up. Each one of them solves a real problem, but each one also charges for the next problem in the series — bandwidth, builds, edge functions, seats.

The other honest answer: I want to know how this works. There’s a part of me that wants to actually understand the stack I’m sitting on, not just rent it.

What the day looked like

About three hours from “I haven’t even bought a Hetzner account” to “the site is live.” Most of that was DNS — fighting my home WiFi router because the Deco mesh was caching the old DNS records and refusing to resolve the new ones.

The actual server work: maybe 30 minutes of commands.

Things I now have running:

  • A Hetzner CPX32 in Falkenstein, Germany
  • Tailscale managing SSH, so port 22 isn’t even exposed publicly
  • Coolify managing deployments (the open-source Vercel/Heroku alternative)
  • Cloudflare in front of the public web traffic
  • This site, auto-deploying every time I git push

Total cost: about $17/month for the server, plus a $3 Hetzner backup add-on. That’s it.

What’s next

This site is the easiest thing to move because it’s static. The harder migration comes next:

  • MilesLah — needs Postgres, more involved

I’ll write about it as it happens. The point of this blog is to document the journey, not the final state.

If you’re someone who’s been thinking “should I leave Vercel?” — the answer’s probably yes, eventually. Not today. But the tooling has gotten good enough that one person can do this now.

Thanks Pieter.

infraaiclaude
< back to writing