August 23, 2024

Hamish Cundy

Read Time: ~12 minutes

<aside> 📎 One of the downsides of mobile app development, compared to backend or web, is the lack of control we have over our apps in the wild. While a web developer can redeploy their site and have the updated version instantly available to every user, mobile developers are reliant on Play/App Store review processes, as well as users choosing to update their apps to the latest version. This greatly slows down rapid product iteration. Server-driven UI allows us to have a greater degree of control of our app’s functionality from afar.

</aside>

Introduction

Something is broken in production. How do we fix it?

The answer is simple for a web or backend developer: make the fix, test it, and deploy it. Job done. But for those of us in the mobile space, the answer is a bit more complex: We don’t actually control the entire deployment lifecycle!

Once our fix is ready, releasing it to the public is at the whims of Apple, Google and their store review processes. Once past that gauntlet, and published to the store, we have to wait for users to install the new app on their device. Altogether, it can take a week or two for a change to reach the majority of our user base. This greatly gets in the way of being able to rapidly improve and iterate on our product, as well as deal with urgent bugs and crashes in a timely manner.

We do have some tools in our toolkit to help with this problem, such as tactical force update mechanisms, feature toggling, and server-side workarounds through to more strategic choices like hybrid apps. However, being able to quickly deploy new features and bug fixes to our apps in the wild is a capability most mobile developers can only dream of.

One potential solution for this problem is Server-driven UI. At Empower, we’ve recently explored this approach in our new app for the Southeast Asia market. This approach gives us significant control over the functionality of our app, while maintaining native mobile app look-and-feel and performance.

Our situation

Earlier this year, Empower acquired Cashalo, a Filipino lending company. Part of the process of integrating Cashalo into the wider Empower business is building a new mobile app and backend for Cashalo, on Empower’s tech stack.

Initially, we planned to build this using the same techniques that have proven successful in our Empower US app. This stack includes native Android and iOS apps which talk to a .NET backend in a RESTful-ish way and allows for frequent client releases to deploy new features and bug fixes.

However, there had been a desire from both our product team and engineering management to take this (mostly) green-fields opportunity in the Philippines to try something new - a different approach that would give us faster iteration and development speed, and the ability to quickly build and test product experiments to deliver better outcomes for our users and the business.

Approach

From the get-go, we wanted a complete solution for moving client-side logic out of our mobile apps. So rather than the piecemeal approach of making particular screens, parts of screens or flows to be server-driven, we sought an approach that abstracted away the important facets of a mobile app to a remote system: