Last month I looked at my hosting bill and felt stupid.
I was paying $20/month for a VPS whose only real job was running Postgres for three side projects — a habit tracker, a link shortener, and a dashboard that gets maybe 40 visitors a day. Combined database size: 412 MB. Combined queries per day: under 3,000.
I was paying rack-mount prices for a lemonade stand.
The Math That Made Me Switch
| VPS Postgres (old) | Neon Free Tier (new) | |
|---|---|---|
| Monthly cost | $20 | $0 |
| Storage | 25 GB (94% unused) | 0.5 GiB included |
| Compute | Always-on (idling 99% of the day) | Scale-to-zero, ~190 compute hrs free |
| Backups | My cron job (untested) | Point-in-time restore, built in |
| Branching | lol no | Full DB branches like git |
| Idle RAM burned | ~180 MB 24/7 | 0 MB when idle |
The killer feature isn't the price. It's scale-to-zero. My dashboard gets queried for maybe 20 minutes total per day. Why was I paying for the other 23 hours and 40 minutes?
The Migration Took 11 Minutes
pg_dump out, pg_restore in. That's it:
# Export from the old VPS
pg_dump -Fc -h old-vps -U postgres mydb > mydb.dump
# Restore into Neon (connection string from the dashboard)
pg_restore -d "postgresql://user:pass@ep-cool-name.us-east-2.aws.neon.tech/mydb?sslmode=require" mydb.dump
Then I flipped the SQLAlchemy URL in my Python app:
from sqlalchemy import create_engine
# old: "postgresql://postgres:pw@1.2.3.4/mydb"
engine = create_engine(
"postgresql://user:pass@ep-cool-name.us-east-2.aws.neon.tech/mydb?sslmode=require",
pool_pre_ping=True, # handles scale-to-zero wakeups gracefully
pool_recycle=300,
)
pool_pre_ping=True matters. When Neon scales to zero, the first connection after idle wakes the database (~300-500ms cold start in my logs). Without pre-ping, stale pooled connections throw errors on wake. With it, my users never notice.
The Honest Tradeoff
Everyone raves about serverless Postgres and nobody mentions the catch: the first query after idle has a cold start. Mine averaged 380ms over two weeks of logs (p95: 620ms). For a side project dashboard, invisible. For a latency-sensitive API with real users, you'd want the paid tier with always-on compute.
Also: 0.5 GiB won't hold your life story. It holds three small projects with room to spare, but if you're storing user uploads or event logs, you'll hit the ceiling fast.
The Controversial Part
Here's my take after 3 weeks: if you're running a dedicated Postgres VPS for side projects in 2026, you're paying a laziness tax. The free tiers of Neon, Supabase, and Turso cover 95% of hobby workloads. That $20/month wasn't buying reliability — it was buying avoidance of a 11-minute migration.
I redirected the saved money into things that actually matter. One of them is my AI coding setup — I write all my migration scripts and SQL with MonkeyCode, a free open-source AI coding assistant (no $20/month Cursor subscription either, because apparently I enjoy deleting recurring bills): https://ly.cyberserval.tech/iIETXiF
Total: $240/year saved, cold starts under 400ms, zero 3am "the VPS disk is full" alerts.
Are free-tier serverless databases ready for real production traffic, or am I one traffic spike away from regret? What's your breaking point for leaving the free tier?
Top comments (0)