
On this established project, we took ownership of an ageing codebase and brought it fully up to date migrating every legacy module to the latest versions of Swift and SwiftUI, modernising the architecture along the way, and clearing out technical debt that had been slowing the team down. Beyond the upgrade, we extended the product with new capability, designing and building modules for Rewards Eligibility and Business Accounts that slot cleanly into the refreshed foundation. The result is a faster, more maintainable app that's ready for whatever comes next on the roadmap.




Behind the scenes, every legacy module moved to the latest Swift and SwiftUI, the architecture was modernised, and new Rewards Eligibility and Business Accounts modules slotted cleanly into a foundation finally clear of technical debt.

They worked in a genuinely agile way and built the solution in record time. When the delivery hit a wall, they brainstormed their way around it without moving the date.
A brand-new design system, built in Figma, rolled out consistently across every single screen, flow, and component of the app — from onboarding to checkout.
The new designs weren't built for the legacy UIKit app, so the main goal was migrating the entire UIKit codebase to SwiftUI, plus wiring PDFKit into UIKit so it loads seamlessly inside SwiftUI
A factory pattern spins up interchangeable components on demand, so new features slot in cleanly without rewriting the core or destabilising anything already shipped.
Each location runs its own private network — so provisioning had to work remotely.

One design system, every screen. A new typography scale and a deep library of custom components, built in Figma and applied consistently across every screen, flow and state — from account onboarding through payments and transfers
SwiftUI end to end, PDFKit included. The new designs had nowhere to land in the legacy UIKit codebase, so the whole app migrated to SwiftUI. PDFKit was wired through UIKit so documents load seamlessly inside the new views, and full French language support shipped across the app at the same time.
Features that slot in, not bolt on. A factory pattern spins up interchangeable components on demand, so new work drops into place without rewriting the core or destabilising anything already shipped.
Shipping couldn't pause for the rewrite. Bitrise builds straight off Bitbucket and handles delivery end to end, so releases kept landing on a predictable, well-tested bi-weekly cadence throughout the migration.
What began as a queue-busting kiosk became the layer the merchandising team reads every morning: what sold, to whom, at which store, and what they browsed on the way there.