Oct 14, 2026
How Claude Code helped us move a live telecoms platform to schema-as-code
Platform45 used Anthropic's Claude Code to move Konverge's Reflex Connect platform onto a single TypeScript schema, across three live environments, without writing a single data row.

The vision
Reflex Connect is Konverge's platform for running network services from order to billing. Konverge wanted its database structure to live in code: readable in one place, reviewed like any other change, and built the same way in every environment. The goal was to stop piecing the database together from years of hand-written SQL scripts.
Working with P45 on the Reflex Connect programme has been a genuine partnership. Their team brought strong delivery discipline, clear communication and a real willingness to take ownership of complex problems, which made a material difference to our pace and quality. I would recommend P45 to any organisation looking for a dependable, capable delivery partner.
Vishal Project lead (Reflex Connect)
The challenge
The database had grown out of more than 250 hand-written SQL migration files, run in order by a custom script. No single file showed what the database actually looked like. Every change meant writing raw SQL by hand, with nothing to catch a mistake before deployment.
Drizzle, the TypeScript schema toolkit Konverge chose, can see tables, columns and indexes. It cannot see triggers, functions and other objects it can't describe. Reflex Connect had 84 of them, including the three triggers that drive its entire event system.
A switchover that missed those would have produced a database that looked perfect and quietly stopped sending events. And all three environments were already live, so none could be rebuilt from scratch.
What we set out to do
- Make a TypeScript schema the single source of truth for more than 130 tables.
- Prove, not assume, that a database built from the new schema matches production exactly.
- Adopt dev, staging and production in place, without writing or changing a single data row.
- Leave guardrails behind so the team can't slip back into the old ways.
- Keep application code untouched, so the change carried no runtime risk.
How Claude Code worked alongside our engineers
Claude Code co-authored 103 of the programme's 146 commits. Our engineers set the strategy and made the key decisions. Sensitive changes went through CTO sign-off and an outside review. Within that, Claude Code did much of the heavy lifting:
- Rebuilt the schema in TypeScript, plus a hand-maintained companion layer for everything Drizzle can't express.
- Built a schema comparator that checks 15 structural dimensions. Its brief: a check only reports on what it actually looked at. Widening the comparison kept surfacing differences that narrower checks had passed as "zero differences".
- Added CI gates that block unsafe patterns, such as the Drizzle commands that would overwrite the schema. The gates test themselves, so a broken gate fails loudly.
- Rehearsed the switchover on a real clone of dev. It wrote zero data rows across all 130 tables, and re-running it changed nothing.
- Wrote the documentation: a plain-English explainer, a runbook and a day-to-day guide for changing the schema.
The result
All three environments moved to the new deploy path in September 2026, and deploys stayed green. The old SQL folder is now frozen history.
- 130+ tables moved to a TypeScript schema
- 84 hidden objects captured and verified
- 0 data rows written during adoption
- 39 schema changes shipped through Drizzle since
What's next
The next phase moves the application's 1 355 raw SQL queries onto Drizzle's type-checked query builder, one package at a time. A mistyped column will fail at compile time instead of in production, and renaming a column will flag every affected query straight away.
The safety net is already in place. Each converted query's SQL is compared with the original's, and so are the results it returns. On its first run, that check caught a converted query that would have exposed an encrypted secret the original deliberately withheld.