Skip to main content

Where to Host Your Web App in Late 2026: The Indie Decision Tree, Plus the Self-Hosted Option It Omits

11 min readDora NodaDora Noda
Share
On this page

On September 13, 2026, Flavio Copes did the chore every indie hacker keeps postponing: he opened every hosting pricing page, re-checked every number, and published the result as “Where to host your web app: how to choose.” The headline casualties are the two most-quoted prices in indie lore. The fabled €4 Hetzner server no longer exists — the cheapest plan is now €5.49 before VAT and IPv4, up 37.5% since June. And Netlify's generous-sounding free tier turns out to be exactly 20 production deploys a month, after which your site shows a “Site not available” page with no way to pay for more.

Copes distills the re-checked prices into four questions — what are you building, do you need a database, how much traffic, what is your budget — and a pick for each project type. It is the best current statement of the indie default. But the guide's four kinds of hosting (static/serverless, PaaS, VPS, big clouds) quietly skip a fifth option that now belongs in the tree: a self-hosted PaaS on the same cheap VPS, giving you git-push deploys and automatic TLS at the same fixed price as hand-rolled Docker. This post is a row-by-row read of the guide's math, and the missing row.

The whole decision on one table​

The unit of comparison is the typical indie project Copes optimizes for: one small full-stack app (Node or similar) with a Postgres database, low traffic, deployed from git. Here is what that costs per month on each of his picks, with the fifth option added at the bottom. All prices are the September 2026 numbers from the guide unless noted.

OptionAppDatabaseMonthly total
Cloudflare Workers + D1$0–5 (100k req/day free; Paid $5)Included in D1 free usage$0–5
Netlify Free + serverless DB$0 within 300 creditsNeon/Supabase free tier$0, then $9+
Railway Hobby$5 plan incl. $5 usageUnmanaged Postgres template, metered~$5–10
Laravel Cloud Starter$5 + usage, $5 credit incl.Managed, sleeps with the app~$5–8
Render Starter$7 fixedManaged Postgres $6~$13
Vercel Pro + serverless DB$20 Pro (commercial)Neon/Supabase free tier$20+
Hetzner CX23, hand-rolled Docker + CaddySame boxSame-box Postgres€5.99 ($7.10) fixed
Hetzner CX23 + self-hosted PaaSSame box, git-pushSame-box Postgres€5.99 ($7.10) fixed

That table is the whole argument in miniature. The metered PaaS options cluster between $5 and $20 before traffic, the hand-rolled VPS lands at about $7 fixed with the database included, and the fifth option keeps the $7 while removing the hand-rolling. The rest of this post shows the working: what changed in September, where each row's math actually crosses over, and what the fifth option does and does not buy you.

What September 2026 changed​

Five price facts in the guide are new enough to invalidate older advice. First, Hetzner raised Cloud prices on June 15, 2026: the entry CX23 (2 vCPU, 4 GB RAM, 40 GB disk) went from €3.99 to €5.49 a month before VAT, a 37.5% jump, while the old CX22 plan stopped being orderable entirely (bitdoze's plan-by-plan table has the full grid; DeployHQ's September price check confirms €5.49 as current). Add the separately billed IPv4 at €0.50 and the real entry price is €5.99. Any guide still quoting a €4 Hetzner box is dating itself — and that includes most of them.

Second, Netlify's credit system is now the binding constraint on its free tier, not a footnote. Every Free plan gets 300 credits a month, and production deploys, bandwidth, requests, and Functions compute all drain the same pool: 15 credits per production deploy, 20 per GB of bandwidth, 10 credits per GB-hour of function time. Twenty daily deploys consume the entire month with nothing left for traffic. When the pool empties, every project on the account goes dark until the next cycle, and Free cannot top up — the escape hatch is Personal at $9 for 1,000 credits or Pro at $20 for 3,000.

Third, Vercel changed the bandwidth story in September 2026: new Pro teams get Flat Rate CDN by default, with 1 TB of transfer and 1 million CDN requests baked into the $20 rather than metered. That removes the surprise-egress anecdote that haunted Vercel comparisons for years — but note the floor is still $20 for any commercial project, since Hobby covers personal non-commercial use only.

Fourth and fifth are the two 2026 newcomers Copes folds into the tree. Railway now has a permanent Free plan: $0 a month with $1 of recurring usage credit for one small service (capped at 1 vCPU, 0.5 GB RAM, one replica), after a one-time $5 trial — Railway's own pricing post confirms the shape. And Laravel Cloud's Starter plan runs $5 a month plus usage with a $5 credit included, compute that scales to zero, and a hard spending cap — the spend-cap pattern Copes explicitly recommends enabling everywhere it exists.

Row by row: where the VPS already wins on math​

With the prices fixed, the interesting question is where each row stops being the cheapest honest answer. Start with the easy rows: static sites and scale-to-zero APIs are not contested. Cloudflare Pages stays free for commercial static sites with no bandwidth bill — which is exactly why Copes moved his own 2,000-post blog off Netlify onto Pages in June 2026 — and Workers or Cloud Run win any workload that idles most of the time. No VPS math beats zero.

The contested ground is the always-on full-stack app with a database, and here the guide's own numbers keep pointing at the VPS sooner than its prose admits. Consider the drivers one at a time. Deploy frequency kills Netlify Free first: a site that deploys daily needs Personal at $9 before serving a single byte, and a media-heavy site burns the 15 GB bandwidth allowance even faster.

A second app doubles the metered PaaS bill but costs nothing extra on a VPS with headroom — Copes notes you can run several small Docker projects on one box. Traffic spikes are absorbed by Hetzner's 20 TB of included EU transfer, a quota no $5–13 PaaS tier comes near.

Then there is the database, which Copes rightly calls a second decision and a second bill. Render's honest total is not $7 but $13 ($7 Starter plus $6 managed Postgres). Railway bundles app and database into one meter but leaves its Postgres template unmanaged — you own backups, tuning, and maintenance, the exact chores a managed-database fee is supposed to buy away.

On the VPS, same-box Postgres has no service fee at all; it consumes the box's CPU, memory, and disk, and you own the backups. So the real comparison for the typical app is ~$13 on Render (managed) or ~$5–10 on Railway (unmanaged, metered) against ~$7.10 fixed on Hetzner (unmanaged, unmetered). The VPS row wins on price the moment you accept the ops work — which is precisely the trade Copes prices as “add your time.”

That time cost is real and the guide is honest about it: on a VPS you are the ops team, and “if Postgres fills the disk at 3 AM, nobody fixes it for you.” Copes himself draws the line at Kubernetes — “I don't run Kubernetes for side projects” — and reaches for Railway when he wants git-connected deploys with a database in the same project. The guide's implicit position is that the VPS discount is wages for sysadmin work. Which raises the question the guide never asks: what if the sysadmin work gets cheaper than the discount?

The fifth option: PaaS UX on the €5.99 box​

Here is the row Copes omits. Take the same Hetzner CX23 at €5.99 a month and, instead of hand-rolled Docker Compose plus Caddy, run a self-hosted PaaS on it — Coolify, Dokploy, CapRover, or a Render-compatible open-source platform. The monthly total does not move: the software is free, the box is the box. What moves is everything Copes files under “add your time.”

Concretely, the fifth option replaces the hand-rolled chores with the PaaS behaviors the guide charges $5–20 a month for elsewhere. Git-push deploys with per-PR previews instead of SSH-and-pull. Automatic TLS issuance and renewal instead of a Caddyfile you wrote once and now fear to touch. Supervised restarts, centralized logs, and one dashboard for all N apps on the box instead of N compose files.

Environment variables and persistent volumes are managed per service rather than per container. For the typical indie project — a web app, a worker, a Postgres container, maybe a second side project — this is the Railway workflow at the Hetzner price, with the database on the same box instead of a second bill.

Be precise about what the fifth option does not give you, because the dishonest version of this pitch hand-waves all of it. It does not give you managed backups — same-box Postgres is still yours to dump and restore, exactly as on the hand-rolled VPS and exactly as with Railway's unmanaged template. It does not give you scale-to-zero; the box bills €5.99 whether it serves one request or one million.

It does not give you a second region, a compliance badge, or anyone to page at 3 AM. What it gives you is narrower but exactly matched to the guide's audience: the git-push experience, on hardware you own, at a fixed price that does not grow with your second app or your deploy count.

The sensitivity analysis from the previous section now reads differently. Daily deploys cost nothing — there is no credit pool. A second app costs nothing — it lands on the same box. A traffic spike is absorbed by the 20 TB allowance.

The metered-PaaS failure modes the guide documents one by one (empty credit pools, per-service minimums, the database second bill) all share a root cause: the meter. The fifth option deletes the meter while keeping the workflow that made the meter tolerable.

When to ignore the fifth option​

A reader who finishes this post and migrates everything to a VPS has misread it. The fifth option has sharp edges, and Copes' four questions still filter correctly — they just need the new row evaluated honestly.

Stay on the metered PaaS when your scarcest resource is attention, not money. If you will not set up Postgres dump-and-restore on day one, pay Render its $6 and let the managed database be someone else's 3 AM. If your app is commercial Next.js, Vercel Pro's $20 buys framework-native behavior (ISR, image optimization, preview-per-PR) that no generic PaaS reproduces exactly. If your workload idles — the cron job, the webhook receiver, the side project between launches — scale-to-zero on Workers or Cloud Run beats any always-on box at any price, self-hosted PaaS included.

Stay on hand-rolled Docker, even, in one case: when the box runs exactly one app and you already know the stack. A single compose file you understand beats a platform you are still learning; the PaaS layer pays for itself at N apps and N deploys, not at N equals one. And keep Copes' own hardest line in mind: he avoids AWS “when a simpler host can do the same job.” Simplicity is a feature with a price, and sometimes the price is the whole point.

The honest summary is a small amendment to the guide's decision tree, not a replacement. Static: Cloudflare. Idle/spiky: Workers or Cloud Run. Commercial Next.js: Vercel. Full-stack with a database and no ops appetite: Railway or Render.

Full-stack with a database and one evening to set up a platform: the fifth option — a self-hosted PaaS on the €5.99 box, fixed price, N apps, no meter. Hand-rolled VPS: only when you genuinely enjoy being the ops team, or when your app needs something no platform abstracts.

Copes ends his guide with HostingPicker, a free tool that turns the four questions into a ranked host list. It is worth running your own project through it. Just remember, when you read its output, that every price on it was re-checked on September 13 — and that the cheapest PaaS-shaped row on the page is the one nobody listed.

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.

Related articles

Run this on infrastructure you own

bex is the open-source, AI-native Render alternative — push a git repo and get a running HTTPS service on your own machines.

Get started with bex