In June 2025, a solo developer named Chris Zhu posted his open-source Heroku alternative, Canine, to Hacker News. The pitch that carried it to 320 points was not a feature list — it was a single table. A machine with 4GB of RAM, it said, costs about $4 a month on Hetzner, $65 on Fly.io, $85 on Render, and $260 on Heroku. A 16x to 65x spread for the same amount of memory.
The table went viral because it is basically true — and it stayed controversial because it is not the whole truth. A year on, with Canine at 2.9k GitHub stars and the numbers slightly shifted, it is worth doing what the HN thread never quite did: re-verify every line, itemize exactly what the multiplier buys, and compute where the honest break-even sits once you price the one input the table leaves out — your own time.
The Table, Re-Verified for 2026
Here is the 4GB-RAM comparison with current list prices, actual SKUs named:
| Provider | Closest 4GB offering | vCPU | Monthly price |
|---|---|---|---|
| Hetzner Cloud | CX23 / CAX11 (shared vCPU) | 2 | ~$4–6 |
| DigitalOcean | Basic Droplet, 4GB | 2 | ~$24 |
| Fly.io | shared-cpu-2x @ 4GB | 2 (shared) | ~$21–28 by region |
| Fly.io | performance-2x @ 4GB | 2 (dedicated) | ~$62–79 by region |
| Render | Pro instance (4GB / 2 CPU) | 2 | $85 |
| Heroku | Performance-M — 2.5GB, not 4 | dedicated | $250 |
| Heroku | Performance-L — 14GB (first tier ≥4GB) | dedicated | $500 |
Three corrections to the viral version matter.
First, Heroku does not sell a 4GB dyno at all. The $250–260 figure that circulates maps to Performance-M, which gives you 2.5GB. Canine's original table said $260 (Heroku's list price has since settled at $250, and its own site now shows $250); either way it understates the gap, because the first Heroku tier that actually clears 4GB is Performance-L at $500 — with 14GB you didn't ask for. Measured against what you can actually buy, the Hetzner-to-Heroku spread is not 65x. It is somewhere between 42x (charitably, against the 2.5GB dyno) and 125x.
Second, Fly.io's number depends entirely on which CPU class you pick. The $65 line refers to performance-2x (dedicated cores). A shared-cpu-2x Machine with the same 4GB costs about $22 — cheaper than the table implies, and a fairer comparison to Hetzner's shared-vCPU CX23.
Third, Hetzner's $4 is real but European. The CAX11 (2 Ampere ARM cores, 4GB, 40GB NVMe) lists at €3.79/month; the x86 CX23 is in the same range, and Canine's own site now rounds it to $6. US-region Hetzner and equivalent providers land a dollar or two higher.
So the honest headline: for 4GB of RAM, the managed-PaaS premium runs 14x–125x over commodity European cloud, depending on provider and CPU class. The gap is smaller than the meme and still enormous. The question is what the multiplier buys.
What the 65x Actually Buys
The unfair version of the comparison — the one several HN commenters called out — treats a bare VM and a managed platform as the same product. They are not. When you pay Render $85 or Heroku $250 for a box Hetzner sells at $5, the difference is not margin on RAM. It is, roughly in order of value:
- A build pipeline. Git push → buildpack or Dockerfile build → image → release, with build minutes, caching, and rollback history. Self-hosted equivalent: a CI runner, a registry, and deploy scripts you write and maintain.
- TLS and ingress that just work. Automatic certificates, renewal, HTTP/2, zero-downtime deploys behind a managed proxy. Self-hosted: Traefik or Caddy or an ingress controller, cert-manager, and the failure modes of each.
- Health checks, restarts, and scheduling. Crashed processes come back; deploys that fail health checks roll back. Self-hosted: systemd units at minimum, an orchestrator in practice.
- Dashboards, logs, and metrics. One place to see what every service is doing. Self-hosted: Prometheus, Grafana, Loki — or
sshandjournalctland regret. - Someone else's on-call. This is the expensive line. Heroku's and Render's price includes SRE teams who get paged when the platform breaks. On your Hetzner box, as one HN commenter put it bluntly: "you'll be on the hook if they go down."
- Compliance and support surface. SOC 2 reports, security reviews someone else passed, a support ticket queue.
Every one of those lines is real. Which is exactly why the interesting question is not "is the premium justified?" — for some team sizes it plainly is — but "at what scale does it stop being justified?" That is arithmetic, not ideology.
The Honest Break-Even: Price Your Own Ops Time
Take a platform engineer's loaded cost at $100/hour (adjust to taste — the structure of the result survives). Model the self-hosted side as Hetzner hardware plus your hours:
- Hardware: roughly $5/month per 4GB service, plus ~$10/month for a control-plane / ingress node. Call it $10 + $5×N for N services.
- Setup, amortized: a realistic first build of a production-ish setup — cluster or orchestrator, ingress, TLS, backups, monitoring, deploy pipeline — is 15–25 hours. Amortize 20 hours × $100 over 24 months: +$83/month for the first two years.
- Ongoing maintenance: patching, upgrades, the occasional incident. This is the variable that decides everything, so treat it as a range, not a point.
Against Render's Pro instance at $85 per service (the mid-priced, most workflow-comparable column), the totals look like this:
| 4GB services | Render (managed) | Hetzner hardware | Self-host @ 1 hr/mo ops | @ 3 hrs | @ 6 hrs | @ 10 hrs |
|---|---|---|---|---|---|---|
| 1 | $85 | $15 | $115 | $315 | $615 | $1,015 |
| 3 | $255 | $25 | $125 | $325 | $625 | $1,025 |
| 6 | $510 | $40 | $140 | $340 | $640 | $1,040 |
| 12 | $1,020 | $70 | $170 | $370 | $670 | $1,070 |
(Add the ~$83/month setup amortization to any self-host cell for the first two years; it moves no verdicts below except at the margins.)
Read the table honestly and three regimes fall out:
- One service: managed wins, full stop. Even at a single ops hour per month, self-hosting a lone 4GB app costs more than Render — and vastly more than the $5 Hetzner sticker suggests. The viral table is at its most misleading here, for exactly the audience (solo devs with one app) most likely to act on it.
- Three to six services: it depends on your ops hours — and that's the real number to estimate. At 2–3 hours a month of real maintenance, six services on Hetzner cost about $340–$423 (with amortization) against Render's $510. At 6+ hours — which is what an immature setup or an unlucky quarter actually consumes — the advantage evaporates. Teams consistently underestimate this number; the HN thread's most-agreed criticism of the table was precisely that "production-grade reliability… carries hidden costs that managed platforms abstract away."
- Ten or more services: self-hosting wins by hundreds of dollars a month even with ops time billed honestly. At twelve 4GB services, Render's bill is $1,020/month; the self-hosted stack with a generous 6 hours of monthly ops is $670. The hardware is a rounding error — $70 — and the platform premium, multiplied across a fleet, is what you are actually buying back. Heroku multiplies the same effect by 3x–6x.
Note what drives the result. It is never the price of RAM — Hetzner's hardware line is negligible in every row. It is the number of services (which multiplies the managed premium) against your ops hours (which multiply your hourly rate). The Canine table shows you the numerator and hides the denominator. Both are real.
The Part the Table Gets Right: The Premium Is Mostly Software, Not Hardware
Here is the deeper thing the 16x–65x spread reveals, and the reason projects like Canine exist. Most of what the managed premium buys — builds, TLS, health checks, dashboards, git-push deploys — is software, not service. It was expensive to build once, at Heroku, circa 2009. It is not expensive to run in 2026, because the open-source ecosystem has commoditized nearly every layer: k3s collapsed Kubernetes installation to one command, cert-manager automated TLS, buildpacks are an open standard.
That is the actual migration math the HN thread converged on. The choice is no longer "pay 65x or hand-roll everything with ssh and duct tape." An open-source PaaS layer on owned machines keeps the Render workflow — push a repo, get a running HTTPS service, see logs in a dashboard — while paying Hetzner prices for the metal. Canine does this on Kubernetes (Apache-2.0, MIT-licensed components, deploy-from-GitHub, Helm add-ons); Dokku and CapRover do it on a single Docker host; Coolify has become the popular single-node choice; Kamal takes the imperative, Rails-flavored path. Bex takes the same bet with an explicitly Render-compatible API and AI agents as first-class operators, on the theory that the remaining ops hours — the denominator in the table above — are themselves increasingly automatable.
What none of these tools restore, and the thing to be honest about in any migration memo: someone else's on-call. The software layer collapses the setup hours and most of the maintenance hours. It does not make a Hetzner region outage at 3 a.m. someone else's page. If that guarantee is worth $400/month to your business, that is not irrationality — that is a correctly priced insurance premium. Buy it knowingly, per service, rather than by default across a fleet.
A Decision Rule for Migrators
If you take one thing from the re-verified table, make it this rule of thumb:
- Count your 4GB-equivalents. Multiply by your platform's per-instance price. That is your monthly premium over commodity hardware (hardware itself is ~$5–10 per service and can be ignored).
- Estimate your honest ops hours to run the same fleet behind an open-source PaaS layer — including the bad months — and multiply by your loaded hourly rate. Add ~$80–100/month of amortized setup for the first two years.
- If the premium is less than the ops bill, stay managed. Below roughly three services, it almost always is.
- If the premium is a multiple of the ops bill — typical from six to ten services up — the gap is yours to collect, and the tooling to collect it without giving up git-push deploys is now open source, maintained, and a
curl | bashaway.
The Canine table's real message was never "Heroku is a ripoff." It was that the platform layer that justified a 65x premium in 2012 has been rebuilt in the open, and the price of not re-deciding — of letting a default from your two-service era ride into your twenty-service era — now compounds at about $80 per service per month, forever.
Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. Star the repo on GitHub or deploy your first app today.



