SearchBook a call

RESEARCH / ARCHIVE

Where to host an MVP, and what it really costs

Frontend, backend and Postgres compared on cost before users, deploy time, whether Postgres is first-class, and the cost of leaving. Ends in an answer.

From the archive. This page preserves the original publication; product plans and capabilities may have changed. See current open source work.

Every hosting comparison ends in a table and no answer. This one ends in an answer.

Four things decide it: what you pay before you have users, how long a deploy takes, whether Postgres is first-class, and how expensive it is to leave.

The frontend question is already settled

Static frontends are a solved problem. Every serious option gives you a global CDN, automatic TLS, preview deploys per pull request, and a free tier that carries an MVP.

HostFree tierBest atWhere it bites
Cloudflare PagesUnlimited bandwidth, 500 builds/monthBandwidth cost, edge functions via WorkersBuild minutes are the cap, not traffic
Vercel100GB bandwidthNext.js, by a wide marginBandwidth and function pricing past the free tier; commercial use restricted on Hobby
Netlify100GB bandwidthForms, redirects, identity without a backendBuild minutes run out faster than you expect
GitHub PagesFree, 100GB softDocs and static sites with zero moving partsNo server-side anything, no previews, no redirects

On Next.js, use Vercel; the integration is the product. For anything else, or where bandwidth is a cost, Cloudflare Pages is the better default.

Do not spend a day on this decision.

The backend question is the real one

The options split into three philosophies.

Platform-as-a-service: Railway, Render, Fly.io

You push a repo, it detects your stack, builds a container and runs it. Postgres is a checkbox.

RailwayRenderFly.io
Entry costUsage-based, ~$5/mo creditFree web tier that sleeps, $7/mo to stay awakeUsage-based, small free allowance
Cold startsNone on paidFree tier sleeps after 15 min, ~30s wakeConfigurable, can scale to zero
PostgresOne click, backups on paidOne click, free tier expires after 30 daysYou run it, or use an external provider
Deploy ergonomicsBest in class, near zero configVery good, blueprint fileGood, but you will meet a Dockerfile
RegionsLimitedLimitedExcellent, run close to users
Bites youUsage billing gets expensive quietlyThe sleeping free tier makes demos look brokenNetworking and volumes have real depth to learn

Render's sleeping free tier is the most common reason a first customer sees a spinner for thirty seconds. If anyone will click it, pay the seven dollars.

Fly.io is the strongest technically and the weakest for a first MVP, because its advantages, multi-region, anycast, running your own Postgres cluster, are answers to problems you do not have yet.

Serverless containers: Cloud Run, AWS App Runner

Google Cloud Run is the most underrated option. You give it a container, it scales to zero, you pay per request, and the free tier is generous.

Two caveats. Cold starts are a second or two for a Python container, fine for an API and poor for a page load. And it has no managed Postgres, so you pair it with Cloud SQL (expensive at small scale) or Neon (better).

AWS App Runner is the same idea, executed less well and priced worse.

A box you rent: Hetzner, DigitalOcean, plus Coolify or Dokku

A Hetzner cloud server with 4 vCPU and 8GB of RAM is around five euros a month. Put Coolify or Dokku on it and you have your own Heroku: git push to deploy, automatic TLS, Postgres in a container, preview environments.

What you are buying: an order of magnitude more compute per euro, no surprise usage billing, and no vendor who can reprice you.

What you are paying: you own the operating system. Security updates, backups you have tested, and being the person who gets paged. That is perhaps two hours a month, and a full day to set it up the first time.

Postgres is a separate decision, and it matters more

This is the part most comparisons skip, because moving compute is a day and moving a database with customer data is a project.

ProviderFree tierStandoutWatch for
NeonGenerous, realScale to zero, and database branching per pull requestCold start on the first query after idle
SupabaseGenerous, pauses when idleAuth, storage and realtime includedYou are adopting a platform, not just a database
Railway / RenderBundledSame dashboard as the app, zero extra setupRender's free database expires at 30 days
AWS RDS12 months onlyOperationally boring at scaleCosts real money from day one, heavy to configure

Neon's branching is the feature. Every pull request gets a copy-on-write branch of production data, so migrations are tested against the shape of your data before they merge.

The costs nobody puts in the table

  • Egress. AWS charges roughly nine cents per gigabyte out. Cloudflare charges nothing. On a media-heavy product this dwarfs your compute bill.
  • The idle tax. A managed Postgres that cannot scale to zero costs the same whether you have four users or none.
  • Your hours. A day setting up a VPS is a day not building.
  • Exit cost. A Docker container on a PaaS moves in an afternoon. A product built on a proprietary function runtime, a bespoke KV store and a vendor auth system does not move.

The verdict

Three situations change that answer, and only three:

  1. You are on Next.js. Use Vercel for the frontend. The integration is worth more than the bandwidth pricing costs you.
  2. You are cost-sensitive and comfortable with Linux. Hetzner plus Coolify, with Postgres in a container and backups to object storage. Roughly one tenth the cost at ten times the compute. Budget a full day to set it up, and test a restore.
  3. Traffic is spiky or near zero. Cloud Run plus Neon, both scaling to zero.

What we would not do for an MVP: raw AWS with ECS, ALB, RDS, VPC and IAM. It is the right answer eventually and a week of yak-shaving now.