In July I wrote a decision record for FameCake, the billboard booking platform I run. The question was “do we need Postgres?”, asked because we also wanted to ship a mobile app.

No migration. The database is not the problem.

— FameCake decision record, July 2026

In September I moved the platform to Postgres. Next.js is gone, and Firestore is frozen. The database didn’t change in those ten weeks. The price of leaving it did.

The New New Stack

  • Mobile: full native. Swift and Kotlin, no bridge.
  • Data: Postgres.
  • Auth: Better Auth, in the same Postgres.
  • Web: SvelteKit.

Five years ago this list was the expensive option. Firebase, React Native and Flutter, and hosted auth all sell the same thing: less code to write. You skip the backend. You write the app once. You rent the login screen.

Agents made code cheap, so that bargain flipped. The abstraction is now the cost. Firestore limits you to 30-item in queries and 500-write batches. A VAT report is SUM(taxTotal) GROUP BY period in SQL. The July record called that “impossible here”. An admin page loaded 2,000 documents to show a handful. Every workaround was code that an agent had to write and I had to review.

Old technology also suits agents best. Postgres, SQL and the platform SDKs have decades of public examples, while a vendor SDK has a few years. Agents write migrations, reconcilers and foreign-key checks for Postgres without much help. SvelteKit is the one taste call here: I like it, and now agents write it well.

Native mobile is next for FameCake, not done. We built a Flutter app in March and deleted it in September. With a plain API over Postgres, two native clients are two ordinary API clients. Writing each screen twice used to be the objection. It is now the cheap part.

How It Went

The agents wrote the plan first: 84 work items, each sized for one agent. Then 291 agents on Opus 5.5 moved 705,614 documents, 237 API routes and 52 admin pages. Most of the port took just two days.

The Agent Said Wait

The agents were the careful ones. On cutover night the lead agent wrote:

The numbers mean I recommend not cutting over tonight.

— Lead agent, cutover night

I cut over anyway, and the freeze took 33 minutes. The agents built the runbooks and the safety rails. I spent the margin they gave me.

Gotchas

  • Firestore is forgiving. It stored NUL bytes and half-emoji that Postgres rejects.
  • Firestore’s order was implicit. Queries without ORDER BY silently dropped rows from finance reports.
  • GET requests write. You can’t make a host read-only at the HTTP layer.
  • Dev data hides bugs. A pager broke on page two in production. Dev never had a page two.
Firebase came back on day one

Our SMS provider held the account for a compliance review on cutover day. By evening, phone sign-in went through Firebase Auth again.

What It Doesn’t Solve

  • Review. Agents write commits faster than anyone reads them. An account-linking bug still reached the code, and I caught it.
  • Operations. Firebase ran the database for me. Now I do.
  • The bill. It should roughly halve, but cost was never the reason.

The July decision was right for July. In September the same rewrite took two days. The boring stack is boring because everyone knows it, and now that includes the agents.