Back to home
Mobile App Development

One codebase, both app stores

We build mobile apps in Flutter, so iOS and Android come from a single codebase with one set of tests and one release process — a decision we made for our own product before recommending it to anyone else.

Two native apps means two of everything

Building separately for iOS and Android doubles the engineering, but the real cost arrives later: two backlogs, two bug queues, and features that quietly drift apart until Android users are on a different product from iPhone users.

For the overwhelming majority of business apps — anything that is fundamentally screens, forms, notifications and a network connection — that price buys almost nothing a user can perceive.

Flutter gives one codebase, one test suite and one release, without the sluggish, obviously-not-native feel that made earlier cross-platform tools a compromise. Our own app is built that way — English and Arabic maintained key-for-key side by side, with an integration suite that drives the real interface on a device.

What we build into a mobile app

Every item here is something we built and still run ourselves — not a service line we have only read about.

Flutter for iOS and Android

One codebase, native compiled performance, and a single place to fix a bug. Both platforms stay genuinely in step because there is only one of them to maintain.

Push notifications that arrive

Device registration, token refresh, permission handling and detachment on sign-out. Push fails silently — nothing crashes, the notification simply never arrives, and nobody reports a message they never knew was sent.

Honest loading and failure states

Caching so a cold start is not a blank screen, a connection that re-establishes itself when the signal returns, a retry on anything that failed, and a localised message saying what went wrong — because a phone on mobile data fails far more often than a desktop does.

Arabic and right-to-left

The whole interface mirrors properly — navigation, gestures, icons and typography — with Arabic and English resource files maintained side by side. For an app serving the UAE or Saudi market, where one company's staff and customers read in both, that is the baseline rather than a feature.

Secure sessions on a device

Tokens in the platform keystore — Keychain on iOS, EncryptedSharedPreferences on Android — a single-flight refresh so concurrent requests never trip the session revoke, and sessions that end when they should, rather than credentials sitting in plain preferences.

Tests that drive the real app

Integration tests that drive the real interface — sign-in, push registration, notifications and the core flows — against a real device or emulator, so a regression shows up as a failed run rather than in review.

Store submission handled

Release signing, provisioning, store listing assets and screenshots — prepared for our own app, and taken off your hands on yours, including the rejections a first submission usually collects for boring reasons.

The back end too

The app is usually the visible tenth of the work. We build the API, the data model and the admin behind it rather than handing you a client with nothing to talk to.

How a mobile build runs

The same sequence on every engagement, whatever the stack.

1

1. Decide what belongs on a phone

Some things are better in a browser. We say so early — a smaller app that people open is worth more than a large one they install once.

2

2. On a device from week one

You get builds on your own phone throughout, not a demo at the end. Reading a flow on hardware tells you things no mockup will.

3

3. Through review and out

Store accounts, signing, listings and submission — then the update process handed over so you are not dependent on us to ship a fix.

Straight answers

The questions that actually come up on a first call.

Thinking about an app?

Tell us who opens it and what they need to get done. We will come back with a scope, an estimate, and an honest answer on whether it should be an app at all.

Every project starts with a scoping conversation and a written estimate before any code is written. No retainer required to talk.