← Back to all work
(01 — 02)

A booking platform that actually survives bad network days

MobileReact NativeOffline-first
Client
SmartsApp
Role
Lead Engineer
Timeline
4 months
Platform
iOS / Android
[ hero product shot ]
The problem

Connectivity isn’t a fallback case — it’s the default condition

SmartsApp connects schools and parents through a real-time communication platform. The original build assumed reliable connectivity and treated offline states as edge cases. In the markets we operate in, that assumption was backwards — for a meaningful share of users, intermittent or no connectivity is simply how the app gets used most days.

Every screen needed to work first without a network, and treat a live connection as a bonus rather than a requirement.

The approach

Local-first writes, opportunistic sync, and a sync indicator users actually trust

We rebuilt the data layer around a local-first model: every action — a message sent, a payment initiated, an attendance record logged — writes to the device first and queues for sync. The UI never blocks on network state.

For payments specifically, we embedded a WebView bridge with a postMessage auth handshake so the parent web portal could be reused without duplicating payment logic natively — reducing both build time and the surface area for bugs.

If a write silently fails and the user finds out three days later, you haven’t built an offline app — you’ve built a data-loss machine with a nice UI.
The outcome

A pipeline the team could actually ship on, not just demo

Beyond the offline architecture, we stood up a proper EAS build pipeline — automated iOS/Android signing, staged rollouts, and OTA updates — so releases stopped being a multi-day manual ritual and became something the team could trust week to week.

By the numbers
9
Countries served
4mo
Build to launch
0
Lost writes post-launch
Stack & tools
React NativeExpo / EASWatermelonDBTypeScriptNestJSWebView Bridge
Next project

Full pharmacy operations built for infrastructure you can't control

View case study →