They'd outgrown the monolith before it was ready to retire — feature branches lived for weeks, and a single migration could block six teams.
What they needed wasn't a rewrite. It was a seam — one the existing code could grow into without a big-bang cutover.
I set up a modular monolith with enforced module boundaries, then layered Temporal for long-running workflows and Kafka for cross-module events.
Teams kept shipping into the same repo; their code just couldn't reach across modules anymore. After four months, splitting out the first real service was a weekend's work.
Release cadence went from every three weeks to every three days. The on-call rotation flipped — humans stopped waking up for routine deploys.
The platform now runs seven product lines on the same substrate. No rewrite happened. That was the point.