CleanCode
Contact
WorkServicesBlogAbout
MobileField ops2 min read

Field apps should never wait for a signal.

On an oil-palm estate or in a basement car park, the signal goes first. Here's how we build apps that keep working without it.

A harvest clerk on an oil-palm estate records bunches at the roadside, on one bar of signal or none. A traveller opens a currency app on hotel Wi-Fi that won't load. Neither cares why the number isn't there. They stop trusting the app.

We build for both. Kyupisi+ records a whole day of field work with no connection. Matawang shows exchange rates in a basement car park. Different apps, same rules.

Assume the phone is alone.

Most apps are a window onto a server. Every screen asks it a question and waits. In the field, the answer often doesn't come.

We flip it. The phone keeps its own copy of what it needs, and every screen works from that copy. Recording a harvest, adding a transport trip, converting 250 dollars: none of it waits for a network.

A window onto a server
Phone
waiting…
Server
No signal, no screen
Its own copy
Phone
later
Server
Saved now, synced when it can
A phone that waits for the server stops with the signal. One with its own copy keeps working.

Sync when you can, and be honest.

When a connection appears, the app sends what it has and fetches what it missed, on its own. There's also a button, because people in the field like to see it happen.

Matawang shows how old its rates are. Kyupisi+ shows what hasn't synced yet. An app that says "this number is from 40 minutes ago" earns more trust than one that pretends everything is live.

Kyupisi+3 records waiting to syncSync now
MatawangUSD → IDRRates from 40 minutes ago
Honest apps say what hasn’t synced, and how old their numbers are.

Decide up front whose edit wins.

Sooner or later, two people will edit the same record while one is offline. That isn't a bug to fix later. Write the rule down first: untangling it afterwards costs more. On an estate, the field record is the fact, and the office corrects it openly, with a trail.

Lock the numbers people get paid on.

Kyupisi+ estimates tonnage from bunch counts and each block's average bunch weight, then locks the result on the record. If the average changes next month, a reprint still matches the slip printed on the day. Anything someone might reprint, dispute or get paid on should be frozen the moment it's created.

Printed on the dayBunches120Block average18 kgEstimate2,160 kg Locked on the record
Next month the average is 19 kg
Reprinted laterEstimate2,160 kg✓ Still the same
The estimate is locked when the slip is printed, so a reprint matches it.

Offline shapes the whole app.

If your staff work beyond the signal, "works offline" isn't a line item for version two. It decides where the data lives and how every screen works. Build it in from the first week, and the app gets quieter as it grows.

Have a workflow that ends where the signal ends? We'd like to hear about it.

Written by
CleanCode
A software studio in Medan, Indonesia. About us →
KEEP READING

More from the studio.

(Let's talk)

Let's make it work.

Tell us what's broken or what you want to build. We'll reply with what we'd make and what it would take.

How we work →
Start a project

Tell us what you need.

Pick what fits and add a line or two. It becomes an email you send from your own mail app.

What do you need?
When would you like to start?

Nothing leaves this page until you press send in your mail app. Nothing opened? and send it to .