Your app runs in Johannesburg. Your database runs in Frankfurt. Every query crosses 8,700 kilometers of ocean cable — twice — before your user sees a single byte. That is not a thought experiment: it is the documented production stack of kerf, a real open-source project that paired Fly.io Machines in jnb (Johannesburg) with Neon serverless Postgres in eu-central-1 (Frankfurt).
The topline answer first: for a typical small production workload the split-brain stack costs roughly $35–45/month and adds ~150 ms to every database round-trip. Neither number is a dealbreaker on its own. The interesting question is why a competent team chose the split at all — and at what point the gap between the two halves starts charging rent.
Why the split exists: the managed-database gap
Nobody picks cross-continent latency for fun. The kerf team landed on Fly-plus-Neon by elimination, and each elimination is a data point about the 2026 PaaS market.
First, Fly.io deprecated its unmanaged Postgres. The old fly postgres path — Postgres on your own Fly Machines, self-operated — is officially deprecated in favor of fly mpg (Managed Postgres), and Fly's own docs tell users the company cannot provide support or guidance for the unmanaged path. The managed replacement starts at a $38/month Basic plan with a shared 2x CPU and 1 GB of RAM, plus $0.28 per provisioned GB of storage, and it is available in only 12 regions.
Johannesburg is not one of them. When a user asked directly about Managed Postgres in jnb, Fly's answer was that there were no plans to open MPG there (community thread). So a team that wants its compute near its South African users cannot buy a managed database from the same vendor in the same region. Half the stack has to live somewhere else.
Second, Neon has no Africa region either. Neon's Postgres runs in eight AWS regions — Virginia, Ohio, Oregon, Frankfurt, London, Singapore, Sydney, and São Paulo — with Azure regions closed to new projects (region list). From Johannesburg, Frankfurt is the practical pick: it rides the Equiano/WACS subsea path up the west coast of Africa, and it keeps EU user data inside the EU for GDPR purposes. The database was always going to be a continent away.
Third, the all-in-one alternative priced itself out. Kerf tried migrating to Koyeb in May 2026 and withdrew before DNS cutover, documenting the reason in its architecture notes: Koyeb imposed a minimum ~$29/month floor on its Starter tier, removing the pay-as-you-go property that Fly provides at low early-stage traffic. That floor is now structural — Koyeb closed its Starter tier to new signups after joining Mistral AI, and the $29/month Pro plan is the entry point for new teams.
So the split is not a preference. It is what remains when no single vendor sells both halves — cheap regional compute and managed Postgres — in the region you need. That is the managed-database gap, and Fly-plus-Neon is its clearest 2026 specimen.
The worked cost: both sides summed to a total
Take a typical small production workload: one always-on app server (2 shared vCPUs, 2 GB RAM), a small Postgres database with modest traffic, and tens of gigabytes of monthly transfer. Here is the split-brain bill, line by line.
| Line item | Price | Source |
|---|---|---|
Fly.io shared-cpu-2x / 2 GB, always on | ~$12/mo | Fly pricing (~$11.83 in Amsterdam; varies a few percent by region) |
| Neon Launch plan base | $19/mo | metered compute and storage on top |
| Neon compute, lightly used with scale-to-zero | ~$1–6/mo | $0.106/CU-hour, scales to zero after 5 idle minutes |
| App-to-user egress out of Africa | $0.12/GB | Fly pricing update, effective Oct 2026 |
| DB-to-app transfer (query results) | inside allowance at this scale | Neon meters public transfer (~$0.10/GB past the paid-tier allowance) |
| Split-brain total at ~50 GB egress | ~$38–43/mo | two bills, two meters |
The number to stare at is the egress row. Fly charges $0.02/GB for traffic leaving North America or Europe but $0.12/GB for traffic leaving Africa and India — six times more. At 50 GB/month that is $6; it is the only line item with a steep slope, and it is denominated in your users' geography, not your architecture choices.
Now the consolidated side: the same workload on Hetzner-backed infrastructure with Postgres run by CloudNativePG on the same private network as the app.
| Line item | Price | Source |
|---|---|---|
| Hetzner Cloud box, 2 vCPU / 4 GB class | ~$5–7/mo | CX22-class shared cloud server |
| Second box or headroom for Postgres via CloudNativePG | ~$5–7/mo | same private network, sub-ms RTT |
| Traffic, up to 20 TB included | $0 | 20 TB monthly transfer included per server |
| Consolidated total | ~$10–15/mo | one bill, one network |
At this scale the honest summary is that consolidation wins on price by roughly 3x — but the absolute delta is only ~$25/month, which is less than an hour of anyone's time. The cost table alone does not settle the argument. Latency does.
The latency budget: what 150 ms does to p99
Johannesburg to Frankfurt round-trips at roughly 150–190 ms in practice. The fastest dedicated fiber on record — Paratus's express route over the Equiano cable — advertises 123 ms from Johannesburg to Europe, and that is a best case for premium transit, not commodity cloud traffic. Independent CloudPing measurements from Africa to eu-central-1 land around 153 ms. Kerf's own deployment notes put South Africa-to-London at ~150–250 ms. Call it 150 ms per round-trip and you are being kind.
Now multiply. A request that issues one query pays 150 ms before the database does any work. A request that issues five sequential queries — load the user, load the project, check permissions, fetch the job row, write the audit entry — pays 750 ms of pure distance tax. That is a p99 floor no amount of query tuning can move, because the floor is the speed of light in glass plus router hops, not your indexes.
Connection pooling does not fix this. Neon's built-in PgBouncer pooler in transaction mode removes the per-connection TLS-and-auth handshake, which matters enormously across 150 ms links — but every query's results still ride the full round-trip. Pooling amortizes connection setup; it cannot shorten the distance data travels.
This is presumably why kerf eventually moved its Fly compute from jnb to fra, co-locating the app with its database. The project's own notes describe Frankfurt as the region where compute sits next to Neon, trading South-African user latency for single-digit-millisecond app-to-database RTT. When your database cannot come to your users, your app goes to your database — and your users eat the latency instead. Somebody always pays the 150 ms; the only question is which hop carries it.
Sensitivity: when the split wins, when it loses, and who pages whom
Rerun the math at the extremes and the two architectures trade places.
At idle, the split wins. Neon's scale-to-zero suspends compute after five idle minutes, so a side project that serves a few requests a day pays close to $0 for database compute. Fly's autostop does the same for the app tier. The consolidated Hetzner fleet costs its full ~$10–15/month whether anyone visits or not. This is the pay-as-you-go property kerf explicitly refused to give up to Koyeb's $29 floor — and at idle it is worth more than any per-unit saving.
At 10x traffic, consolidation wins decisively. Push 500 GB/month through the split stack and Fly's Africa egress alone is $60 — more than the entire consolidated fleet, which is still flat inside its 20 TB allowance. Neon's transfer metering starts to bite on the DB-to-app leg too. The crossover sits somewhere around 100–200 GB/month of egress, depending on how query-heavy the workload is. Below it, the split's premium is a rounding error; above it, the meter runs away.
The failure domains are the permanent cost. The split stack has two bills and two failure domains that fail independently: a Fly jnb incident and an AWS eu-central-1 (or Neon control-plane) incident are uncorrelated, which is genuinely good for blast radius. But they are coupled by the public-internet path between them — TLS over the open internet, no shared private network — and by your incident response.
When queries get slow, the first suspect is always the WAN, and ruling it out means correlating two status pages, two support queues, and a traceroute neither vendor owns end to end. The consolidated fleet has one provider and one network: failures are correlated (a dead hypervisor can take app and database together unless you run a three-node CloudNativePG cluster), but there is exactly one throat to choke and no speed-of-light suspect in the lineup.
Note what the split buys that the table cannot price: zero Postgres operations (no upgrades, no failover drills, no backup restores to test), copy-on-write branching for review apps, and point-in-time recovery as a checkbox. Kerf's notes list all three as load-bearing. Consolidation hands every one of those jobs back to you.
The consolidation sketch
For completeness, here is what the other side looks like in practice. CloudNativePG — the CNCF Postgres operator — runs the database as Kubernetes-native declarative infrastructure: a Cluster custom resource describes three Postgres instances with streaming replication, automated failover, and scheduled backups to S3-compatible storage.
On a Hetzner-backed fleet the app and the database share a private network, so the 150 ms round-trip becomes sub-millisecond. One bill, one network, 20 TB of included transfer, and the database lives wherever your compute lives — including regions where no managed-Postgres vendor will ever show up.
The honest price is operational, not financial. Backups, failover testing, major-version upgrades, and 3 a.m. pages for a sick primary are yours now. Managed Postgres exists because that work is real, and a team without Postgres experience will spend more than $25/month of engineering time learning it. Consolidation is cheaper on paper from day one and cheaper in reality only once the team can operate what it owns.
The Fly-plus-Neon stack is not a mistake to mock. It is a rational response to a market gap: Fly sells the compute but not the managed database in-region, Neon sells the database but not in-region, and the all-in-one platforms charge a floor that early traffic cannot justify. The split buys zero-ops Postgres and true scale-to-zero at the cost of a permanent latency tax and an egress meter with a steep slope. Know the crossover — roughly 100–200 GB/month — and pick your side deliberately.
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.



