Problem
A lifestyle and rewards platform serving 1M+ users had reached the point every successful app reaches: the architecture that made version one fast was now fighting the team. Changes rippled unpredictably, features slowed, and engineers avoided the riskiest parts of the code.
Solution
Not a rewrite — a staged migration, measured against stability the whole way. Move the app from MVP toward MVVM and from XML layouts toward Jetpack Compose incrementally, proving each stage in production before moving on.
Technical challenges
- 1M+ active users meant stability could not regress for a single release.
- Multiple teams shipped in parallel; the codebase couldn't freeze.
- Business needed continuous delivery throughout — no feature gap.
Architecture decisions
- Introduced clear architectural boundaries so business logic and UI could evolve and be tested independently.
- Migrated UI to Jetpack Compose feature by feature behind the existing navigation.
- Guarded every stage with crash and performance monitoring so regressions were caught before a store review, not after.
Business impact
The real win was organisational: teams could ship in parallel again, and the codebase stopped getting harder to change every quarter — protecting delivery speed as the product grew.
Results
- Boilerplate reduced ~40%.
- Sub-2-second screen loads and a 99.5%+ crash-free rate held throughout.
- Parallel feature development unblocked across teams.
Lessons learned
Full rewrites are where good companies lose a year. Staged, reversible migration — measured against real stability metrics — delivers the same modernisation with a fraction of the risk.