The problem
Development happens on whatever each dev has locally, and there is no shared, documented way to get a beefy, always-on personal dev environment. The one cloud dev box in use (Petri's) proved the concept but was expensive on EC2 (~$130/mo always-on) and entirely hand-built.
If several devs want the same thing, ten ad-hoc setups — different providers, different security postures, different bills — would be the default outcome. Doing nothing means the option simply stays unavailable to everyone except those who build their own.
The proposal
One Hetzner cloud server per dev, opt-in. Each box is a CX43 (8 vCPU / 16 GB / 160 GB NVMe, EUR 15.99/mo + EUR 0.50 IPv4, ex VAT) or a cheaper CX33 for lighter stacks — EUR 100–165/mo total for ~10 devs.
- One company Hetzner project with team members; boxes provisioned from a cloud-init/hcloud script derived from the existing setup runbook (
runbook.md). - Each box joins its owner's personal free Tailscale tailnet and has no open ports on the public internet — SSH and dev servers (e.g. Django on
:8000) are reachable only over the tailnet. - Full isolation: any OS image, root for everyone, a dead box affects exactly one dev, and Hetzner is the ops team.
Key decisions
These are recommendations to validate, not made decisions — the discussion below is what this page exists for.
- One cloud server per dev (Option A) over a shared dedicated host with Proxmox VMs (Option B)Option B is EUR ~60/mo cheaper at 10 devs and genuinely faster (bursty dev workloads oversubscribed on 16 dedicated Zen4 cores beat shared cloud vCPUs) — but someone becomes the hypervisor admin (host updates, RAID, VM provisioning), and one host down takes out 5–10 devs. The admin-overhead breakeven is closer to 15–20 devs than 10. At 10 devs the absolute cost is noise compared to salaries; simplicity wins.
- No self-service layer (Coder) yetSelf-hosted Coder on top of a dedicated host would give Terraform-defined workspace templates, dotfiles auto-applied, and idle auto-stop — "Codespaces on our own EUR 109 server". Worth it when template consistency and self-service provisioning start mattering, i.e. more devs than now. (Actual GitHub Codespaces: ~$430/mo for 10 devs at ~120 h, ephemeral by design, no OS choice.)
- Ephemeral compute (snapshot cycling, Fly.io machines) is an experiment, not the planHetzner bills per hour and deleted servers cost nothing, so "devbox down = snapshot + delete" could cut a box to EUR ~5–7/mo. But it's automation to build and maintain, and the sharp edge for our workflow is idle detection: long-running Claude Code sessions look idle to naive auto-stop logic — "idle" must mean no active claude/test/build processes, or overnight agent runs get killed.
- Personal free tailnets over a company Tailscale plan or HeadscaleBoxes are personal and nobody else needs access, so each dev's box joins their own free tailnet. The Tailscale team plan (~EUR 55/mo for 10 devs) would cost more than Option B saves; self-hosted Headscale only makes sense if a single company-controlled mesh becomes a requirement.
The plan
Effort is relative — S < M < L. The plan activates only if the team validates Option A (full task table in 04-roadmap.md):
| Step | What | Effort |
|---|---|---|
| Decide | The team picks the option and devs opt in; sizing per dev (CX43 vs CX33) | S |
| Set up | Company Hetzner project + members; turn the setup runbook into a cloud-init/hcloud provisioning script | M |
| Roll out | Provision boxes for the opted-in devs; each joins their own tailnet | S |
| Migrate | Devs move over at their own pace; old environments (incl. the EC2 instance) decommissioned | M |
| Verify | Cost check after the first month against the EUR 100–165/mo estimate | S |
Rollout risk is minimal by construction: boxes are independent, opt-in, and each dev's migration is individually reversible (keep the old environment until the new box has proven itself — that's exactly how the EC2→Hetzner migration was done).
Risks
- Stopped Hetzner cloud servers bill at full price (unlike EC2) — there is no stop-when-idle savings lever on Option A. The mitigation (snapshot cycling) is deliberately deferred as an experiment.
- Shared-vCPU performance may disappoint devs used to fast local machines — that was the real argument for the dedicated-host option. If it becomes a complaint, or headcount grows toward 15–20, revisit Option B (+ Coder).
- Prices are a snapshot: ex-VAT Hetzner list prices as of July 2026, after their June 2026 increase. Re-check at purchase; +25.5% VAT if billed personally in Finland.
- Per-dev security posture depends on following the script — the provisioning script must bake in the hardening (Tailscale-only SSH; the cloud firewall as the only firewall, because Docker bypasses ufw via iptables; unattended upgrades), so a hand-rolled box can't quietly skip it.
- Sizing is an assumption. "~10 devs" is headcount, not a signup list; actual interest is unconfirmed. If only 2–3 devs opt in, the decision barely matters — which is itself an argument for the simplest option.
Open questions
The concrete questions we want the team to answer — this is the discussion agenda.
- Which option? A (per-dev cloud servers, recommended), B (dedicated host + Proxmox), or wait?
- Who actually wants a box? Opt-in signup — and per dev, CX43 (EUR 16.50/mo) or the lighter CX33 (EUR 8.49/mo)?
- Who owns the Hetzner organization and billing — and does EUR 100–165/mo need a budget sign-off, and whose?
- Timeline: is this worth doing now, or parked until more devs ask for it?
Out of scope
- Forcing anyone off local development — boxes are strictly opt-in.
- Shared infrastructure beyond one Hetzner project (no shared hosts, no company mesh VPN, no platform team).
- Deferred: the Coder self-service layer (revisit at 15–20 devs), snapshot-cycling/auto-stop cost optimization (an experiment for whoever wants it), and any company-wide Tailscale/Headscale mesh.