UIKit to SwiftUI
A phased migration from UIKit to SwiftUI, with both running side by side.
Mobile
App modernisation for the mobile apps that still work but cannot keep up — UIKit to SwiftUI, Views to Jetpack Compose, the data layer to the modern persistence library, the navigation to the new component, phased and shipped without a rewrite.
UIKit to SwiftUI
Views to Jetpack Compose
Data Layer Modernisation
Navigation Modernisation
State Management Refresh
Architecture & Module Boundaries
Overview
The most expensive app modernisation is the one that tries to rewrite the app from scratch. The rewrite takes twice as long, the feature parity is never quite right, and the new app ships with a regression the team did not know about. The work is to migrate one piece at a time, with the old piece running alongside the new until the new is trusted.
We do app modernisations as a series of focused migrations, each one aimed at the next piece the team needs. The migrations are flagged, tested, shipped behind a feature flag and rolled back if they drift. The app becomes modern a piece at a time, without a freeze on new features.
This is the wrong engagement if the app is small enough to be replaced by a new build. The cheapest modernisation is the one where you do not have to modernise.
What we deliver
A phased migration from UIKit to SwiftUI, with both running side by side.
A phased migration from Android Views to Jetpack Compose, in steps that ship.
Core Data to SwiftData, Room to SQLDelight, the data layer the next feature needs.
A migration to the modern navigation component, with deep links preserved.
A migration to the modern state management approach, without a rewrite of every screen.
Clean architecture, modularisation and the seams the next feature needs.
Our process
01
Discover
We audit the app, the architecture and the riskiest parts of the codebase.
02
Plan & Design
We write the migration plan, the flag strategy and the cutover plan.
03
Develop
We build the new piece, with the old piece still running in production.
04
Deploy
We flip the flag, watch the metrics and roll back if it drifts.
05
Optimize & Grow
We move to the next piece, with the metrics as the input.
Technology
What you can expect
Industries we serve
The riskiest part of the app is the first candidate, because that is where the legacy code is most likely to break. The second candidate is the part of the app that is blocking new features. The migration is sequenced against risk and value, not against a wishlist.
No, when the migration is done right. The new piece ships behind a feature flag, with the old piece still serving traffic. The flag is flipped for a small percentage, then for everyone, with the metrics watched at each step. The user experience stays the same, and the new piece gets the chance to prove itself.
A written data migration plan with named owners, a test cut with a small subset of records, a parallel run for at least one full release cycle, and a recovery path that does not require restoring the legacy code. The data is preserved, the old code is decommissioned in its own time.
Yes, the same way. A Flutter or React Native app can be modernised one piece at a time, with the new piece shipped behind a feature flag and the old piece decommissioned in its own time. The principle is the same, regardless of the framework.
Related services
Business software
Tell us the outcome you need. We’ll come back with an approach, a timeline and a written estimate.