Offline first app development

Apps that keep working in the hour with no signal.

Skippers on a river, technicians in a plant room, drivers in a yard: the real work happens where coverage is worst. We build offline first mobile apps where the device is the source of truth during the job and sync is engineered, not assumed: no duplicates, no lost photos, and a status the user can trust.

Flutter or React Native Sync engine included Web admin and backend Cloud in your account
Offline first app on a phone with no network connectionPaste mockup: two phones, app in offline mode
19+
Projects delivered, mobile plus backend
100%
Fixed price, agreed before we start
1 year
Warranty on larger contracts
1
Codebase for iOS and Android
Who this is built for

Teams whose work happens where the network is not

The common thread is not the industry. It is a person with a device, a job that has to be finished on site, and coverage that cannot be relied on for the length of that job.

Inspection and audit companies

Long checklists, mandatory photos, findings with severity, a locked record at completion and a report the client receives. Usually filled in basements, plant rooms and steel halls.

Field service and utilities

Work orders, forms that change by job type, time capture and signatures, with the technician in a crawlspace or a substation. The field service app development page covers the operational side.

Equipment and HVAC service

The unit as the record, service agreements, refrigerant logs and certificates, captured on the roof where the unit is. See custom HVAC software development.

Logistics and drivers

Proof of delivery, scans, damage photos and exceptions captured in yards, warehouses and loading bays, then reconciled when the vehicle is back in coverage.

Navigation, maps and outdoor operations

Maps that live on the phone, routes and points of interest available without a network, and reference data such as water levels or closures refreshed whenever a signal appears.

Construction sites and agriculture

Site diaries, snag lists, measurements and photos from places where the signal is a rumour, on rugged devices that get closed, restarted and handed between shifts.

Our starting position

Offline is not a feature you add to a connected app. It is the default state the app is designed for. Connectivity is the exception the app takes advantage of when it appears.

Where offline first projects actually get hard

Reading offline is easy. Writing offline is the work.

A cached list of jobs is a weekend project. What follows is where the engineering sits, and where an app that looked fine in the demo loses data in production.

Problem one

Two devices, one record, both offline

Two inspectors work the same site. A dispatcher reassigns a job while the technician is already on it. Both come back into coverage with a valid version of the same record. The app has to decide what wins, per field where it matters, and never quietly discard one side.

The answer is not "last write wins" applied to whole records. It is a sync model designed with you around how your operation actually behaves when people work in parallel.

What runs underneathConflicts
  • Every change is a small, timestamped operation, not an overwrite of the whole record
  • Field level rules decide which side wins, and which fields need a human to look
  • Completed records are locked; later edits are new versions with an audit trail
  • The user sees the outcome as a status, never as a record that vanished
Problem two

Photos on one bar of signal

Photos are the largest thing the app moves and the most fragile. An upload that starts on one bar, stalls halfway and reports success is worse than no signal at all, because the app now believes something the server has never seen.

Uploads are resumable and idempotent. Sending the same photo twice creates one record, not two, and a stalled upload picks up where it stopped instead of starting over.

What runs underneathMedia
  • Photos are stored locally at capture and linked to the record, the site, the time and the user before any network exists
  • Uploads run in the background in chunks and resume after the app is closed or the phone restarts
  • Each upload carries a stable identifier, so retries cannot duplicate
  • Compression happens on the device, sized for a report, not for a gallery
Problem three

Two days offline, and the form changed on day one

The form your admin edits on Monday cannot rewrite the record a technician started on Sunday. Definitions are versioned. A record keeps the version it was created with for as long as it exists, and the report for it renders under that version years later.

The same rule covers everything the app is told from the outside: customer lists, equipment records, user roles. Each arrives with a version, and the app knows which one it acted on.

What runs underneathVersions
  • Checklists, forms and reference data are versioned on the server and cached on the device
  • A started record is pinned to the version it began with; new definitions apply to new records only
  • Reports render from the version stored on the record, not the current one
  • Reference data refreshes in the background whenever coverage allows, without interrupting work
Problem four

A status the user believes

Adoption is decided here. If a technician has ever lost an hour of work to a sync that "should have" happened, they will photograph the screen with their own camera and email it later. The app is now paper with extra steps.

So every record shows its own state, in plain words: synced, pending, needs review. Nothing is dropped without being shown. And closing the app, killing it, or restarting the phone changes none of it, because the local database is what the user is working in.

What runs underneathTrust
  • A local database on the device is the working store; the network is a background process
  • An outbox holds every pending change with its own retry state
  • Records rejected by the server stay on the device, flagged for a person to resolve
  • Battery and data usage are budgeted, because a sync that drains the phone by 14:00 is also a failure
Problem five

Maps that have to be on the phone

Some offline first apps carry a map, not just a form, and a map is the largest thing the device will ever hold. On Liniowiec, a river navigation app we built in Flutter, the whole waterway network of over 1,000 km across more than 18 rivers has to work with the phone in airplane mode in the middle of the river.

That means map tiles packaged and cached on the device, a storage budget the user understands, and reference data such as water levels or KML overlays refreshed in the background when coverage returns, without ever blocking navigation. It also means accessibility, because a map used one handed in glare on a moving boat is a WCAG problem, not only a design one.

What runs underneathMaps
  • Vector tiles packaged for offline use and cached by region, so a user downloads the stretch they need, not the whole country
  • Routes, markers and overlays stored locally and versioned like any other reference data
  • Live data such as water levels merged in the background, with a visible timestamp for how fresh it is
  • WCAG conformance built into the map screens, not retrofitted after launch

Not sure which of these problems is yours?

Tell us where your people lose coverage and for how long. Thirty minutes is enough to say whether offline first is the right shape and what a first version would contain.

Book an intro call
What we deliver

Not an app. A system, and you own all of it.

Offline first work is rarely a single mobile app. The device, the sync layer, the backend and the office view have to be designed together, or the seams show up in the field.

What is in scope
  • Mobile app for iOS and Android from one codebase, Flutter or React Native, chosen with you at the workshop
  • Sync engine with local storage, outbox, conflict rules, resumable media and background sync
  • Backend and API with versioned reference data, role based access and a full audit trail
  • Web admin for customers, sites, equipment, checklists, users, history and reports
  • Report generation, typically PDF with your branding, stored against the record
  • Store publication on your own developer accounts, included in the price
What stays yours
  • The source code, in a repository you own from the first commit
  • The cloud environment, in your account, in the region you need, EU or US
  • Your data, exportable in full at any time, with no dependence on us to get it out
  • The developer accounts, set up in your name at the start of the project
  • The scope document and the acceptance protocol, as attachments to the contract
  • Everything after launch: a scope guarantee on what was agreed, and a support package if you want one, never a lock in
Proof from the field

Requirements that only real jobs produce

Case study

Liniowiec, offline navigation for Polish rivers

Liniowiec is a river navigation app we built in Flutter for inland waterways in Poland: over 1,000 km of navigable water across more than 18 rivers, with offline maps as the core of the product rather than an add on. Stage one is live and in use; the next stage extends the map stack, adds water level data and brings the app to WCAG AA.

What it proves for an offline first project: the map, the routes and the reference data have to be usable with no signal at all, refreshed quietly when a signal appears, and never in the way of the person steering.

Case study

TimeFix, a field service app for technicians

On TimeFix the work timer had to keep counting when the technician locks the screen, and when the technician places a call from inside the app itself. That was not in the original assumptions and it did not come out of a specification meeting. It came out of technicians using the app on real jobs.

That is the pattern offline first projects are planned around: your own crew works with the app on real sites during development, without signal, and what they find becomes scope while it is still cheap to change.

Investment

A fixed number per stage, agreed before we start

Every offline first project is scoped in a discovery workshop and priced as a fixed number per stage, with payment on acceptance of each stage. The scope guarantee is simple: everything agreed in the scope works, and if it does not, fixing it is our job, not a change request. On larger contracts we carry a one year warranty on the software.

How the number is built
  • Design, mobile, backend and web admin are priced as separate lines, so you see where the money goes
  • Store publication on your own developer accounts is included
  • What separates a defect from a change request is written down before we start
  • Current ranges and what each tier contains are on our pricing page
The commercial model
Process

From first call to a system your crew trusts

Intro call

How the work runs today

Who does what, where coverage fails, which systems exist. If the honest answer is a connected app or configuration of what you own, you hear it here.

Discovery workshop

Connectivity map and scope

Where and for how long devices are offline, what is written there, and who else touches the same records. Output is a scoped document and a fixed number.

Design

Screens for gloves and glare

Large targets, few taps, and sync status visible without hunting. Reviewed with the people who will actually hold the device.

Build in stages

Your crew tests without signal

Each stage ends with your own team using the app on real jobs in airplane mode. What they find becomes scope while it is cheap.

Acceptance

Protocol, handover, warranty

Acceptance protocol per stage, code and cloud already in your name, store release included, and the warranty running from launch.

What building this asks of you

The delays are rarely engineering delays

  • One person who can decide. Someone who knows how the work runs and can answer a question about a form rule or a conflict rule within a day.
  • Accounts and access at the start. The Apple developer account, the Google Play account and credentials for any third party service are the most common cause of a slipped launch date, and setting them up is not quick.
  • Your own crew on real jobs during development. Not after. Offline problems only show up in the places where the network is missing, and only your people go there.
  • An honest connectivity picture. How long devices are really offline, and whether it is minutes or whole shifts, changes the design more than any feature does.
  • A cloud account in your name. We deploy into it from day one, so ownership is never a migration later.
FAQ

Questions we get on the first call

Flutter or React Native for an offline first app?

Both handle local storage, background work and sync well. The choice is made at the workshop based on your existing systems, your team and the platform features you rely on, not on a default preference. Either way it is one codebase for iOS and Android.

How long can the app stay offline?

Days, if the design calls for it. The limit is device storage for photos, not the sync model. The workshop establishes how long your people are actually out of coverage, and the app is built for that with margin.

What happens if two people edit the same record?

Field level rules decide what wins where that is safe, and a person is asked where it is not. Completed records are locked, so later changes are new versions with an audit trail. Nothing is silently overwritten.

Can the app write into a platform we already use?

Usually. The deciding factor is that platform's API: what can be written, how often, and whether custom fields are exposed. We check that in the first days, before scope is written, because it changes the price.

Where is the data hosted?

In your own cloud account, in the region you require. For European clients that means EU hosting under GDPR; for US clients a US region. Encrypted in transit and at rest, with role based access, backups and full export.

Who owns the code?

You do, from the first commit, in a repository under your account. The contract says so in writing, alongside the acceptance protocol and the line between a defect and a change request.

How long does a first version take?

A narrow first version usually runs 12 to 16 weeks from kickoff. A full system with web admin, reports and integrations runs 16 to 24 weeks. Both assume accounts, access and decisions arrive on time.

Do you also maintain it after launch?

The scope guarantee covers what was agreed. Beyond that, a monthly support package is available with a fixed number of hours, or you take the code to your own team. Both are normal outcomes and the choice is yours.

Next step

Tell us where the signal drops.

Bring how the work runs today, where your people lose coverage and what happens to the data when they do. You will get a straight answer on whether offline first is the right shape, and if it is, a written scope and a fixed price for a first version.

Thomas SiudutThomas SiudutCo-Founder and CEO, Apps Value

30 minutes, no preparation needed.