What we deployed
One repository, one commit, deployed unchanged to twelve free tiers: a small app with three routes, a server-rendered page hitting a Postgres read, and a 2 MB image on the landing route. Nothing exotic — the point was the shape of app people actually put on a free plan, not a synthetic benchmark that flatters edge runtimes.
Every account was created from scratch with no prior history, on the free plan only, with no card attached where the provider allowed it. That last constraint knocked out three hosts before we started.
Cold starts are the honest differentiator
Warm response times clustered tightly enough to be uninteresting — almost everything served the static route quickly from a nearby edge. The spread only appears once a container has been idle.
Edge-runtime hosts effectively have no cold start because there is no container to wake. Container-based free tiers scale to zero aggressively, and that is the cost of the plan being free: your app is not resident, so somebody pays the wake-up latency, and on a free plan that somebody is your visitor.
The four that fell over
"Fell over" means one of three things: the app stopped serving, the provider suspended the project, or response times degraded past ten seconds and stayed there.
Two hit a hard monthly bandwidth ceiling and returned an error page rather than degrading. One suspended the container for inactivity and then failed to wake it reliably. The fourth never failed outright — it simply got slower under sustained requests, with no notice anywhere in the dashboard that it was shaping our traffic.
- Bandwidth ceilings are usually the first wall, and they arrive faster than the number suggests — one 2 MB image on a page that gets shared eats a 100 GB month quickly.
- Idle suspension is survivable for a portfolio and fatal for anything with a webhook.
- Silent throttling is the worst failure mode: your monitoring shows a slow app rather than a blocked one.
What we would actually pick
For a static site or portfolio, the unlimited-bandwidth tier wins outright — traffic is the variable you cannot predict, and it is the only one that removes it.
For anything with a server component, pick on cold-start behaviour rather than headline RAM. A free plan with 512 MB that stays warm beats one with 1 GB that sleeps after fifteen minutes.
For anything with a webhook, a cron or a queue, a free tier that scales to zero is the wrong tool no matter how generous the numbers look.
The part nobody puts on the pricing page
Every one of these tiers is generous. That is not the problem. The problem is that the limit which ends your free ride is rarely the one advertised — it is the build-minute cap, the concurrent-connection ceiling, the inactivity timer, or a fair-use clause with no number attached at all.
That is the whole reason this directory prints the catch next to the headline figure. The headline number tells you what you are being sold. The catch tells you when you start paying.