Investigation
Step 1 — the first plan was aimed at the wrong app
The first plan was a rewrite of clevrstart, our most visible site. It looked like the obvious suspect. It was scoped at 40 to 80 hours (estimate).
Then we read the Vercel dashboard per project (measured, 2026-08-30, 30-day Fluid Active CPU):
| Project | Share of the account’s CPU |
|---|---|
| flowingkhaos (old app) | 32.5% |
| cms | 22.2% |
| clevrstart | 7.9% |
| everything else | the rest |
The rewrite would have freed about one fourteenth of the problem. The two apps that mattered were somewhere else. Worse, the mechanism the plan blamed did not exist: clevrstart was already revalidated by webhook, not by polling.
Attribution is the first measurement. Before per-route tuning, before any rewrite: which project is spending?
Step 2 — what each heavy app was actually worth
The old flowingkhaos app held a third of the account’s compute for 4 users, 1 gated page and no revenue (measured, 2026-09-05). No tuning makes that ratio good. It was paused, and the property was re-planned as a static site.
The CMS is worth a lot: every site reads from it. So it could not be paused. It had to move.
Step 3 — could the database move with it?
The obvious plan was to move the CMS and its data into one Railway project. We checked before we decided. One query lists every foreign key that crosses from one schema into another:
select tn.nspname, tc.relname, fn.nspname, fc.relname, con.conname
from pg_constraint con
join pg_class tc on tc.oid = con.conrelid join pg_namespace tn on tn.oid = tc.relnamespace
join pg_class fc on fc.oid = con.confrelid join pg_namespace fn on fn.oid = fc.relnamespace
where con.contype = 'f' and tn.nspname <> fn.nspname;
It returned 25 foreign keys pointing into cms.users: 22 from ccc, 3 from scheduling
(measured, 2026-09-11). Postgres cannot keep a foreign key across two servers. Moving cms alone
meant dropping all 25 guarantees. Moving the whole instance meant migrating the fleet.
And there was no money to save on the data. Neon was on its Free plan, holding 80 MB of a 512 MB limit (measured). It cost 0 USD. A Postgres container on Railway would cost about 3–6 USD a month (estimate, from published rates) and would lose Neon’s branching and point-in-time restore.
Decision: move the compute, keep the data. The 22.2% was compute. Moving compute alone reclaims all of it.