Case study 09 · Identity and documents
Capturing passport applications and biometrics offline
For a national identity authority in West Africa, we built the app its agents use to take passport and ID applications in villages with no signal.
1 working day
the headline number
1 constraint
The applications included biometrics, and the people the agents visited often had no connection.
The story in 5 steps
Stack
- React
- Next.js
- Expo
- PostgreSQL
- AWS
- offline-first
- biometrics
01 · Context
For a national identity authority in West Africa, we built the system for applications, biometrics, fee payment, national registry checks and status tracking.
For a national identity authority in West Africa, we built the system for applications, biometrics, fee payment, national registry checks and status tracking. The same flow issues both passports and ID cards, and only the price differs.
The system is in production, and the app is published on Google Play.
The hard part was deciding which problem we did not need to solve.
02 · Could not change
The authority sends agents out to people, and the people they visit often have no connectivity.
The authority sends agents out to people, and the people they visit often have no connectivity. Passport applications with biometrics, the most sensitive data a government holds, therefore have to be captured on a phone in a village and uploaded later.
Requiring a connection, the usual answer, was not an option. Working offline also raises problems an online system never has: what is stored on the device, what happens if the device is lost, and how to know that the same application was not submitted twice.
03 · What we did
We limited the offline window to one working day.
We limited the offline window to one working day. Agents return their devices to the office at the end of each day, so synchronization only ever has to cover one day. Because no device comes back after weeks away, there are no merge conflicts or divergent copies to reconcile. We designed for that one-day window instead of for offline sync in general, and that is what kept the system simple enough to trust. Applications and biometrics are held in secure storage on company-issued phones that can be wiped remotely, and they upload when connectivity returns.
Company-issued phones only. Keeping biometrics on a phone is acceptable only if the phone belongs to the organization and can be wiped remotely. If agents had used their own phones, the same design would not have passed, however well the data was encrypted.
Duplicates are caught on the server. A device that has been offline cannot know what another device did. Only the server, which every device eventually talks to, can decide whether an application already exists, and it does so before the application is accepted.
Fee payment. Fees are collected through the national payment gateway, with PayPal for applicants abroad. In the public sector, regulation decides which payment provider you use.
Registry access. Calls to the national registry are secured with keys, digest authentication, single-use tokens and IP allow-listing, so a stolen key on its own opens nothing.
04 · Result
Applications, photographs and biometrics captured without a connection, on devices that can be wiped remotely
- Applications, photographs and biometrics captured without a connection, on devices that can be wiped remotely
- Duplicate submissions caught on the server before acceptance
- The system in production, with the app published on Google Play
05 · Differently
We never tested what happens when a device does not come back: an agent who does not return at the end of the day, or a phone that stays out for a week.
We never tested what happens when a device does not come back: an agent who does not return at the end of the day, or a phone that stays out for a week. The one-day window was the right design, but a design that depends on a working habit should define what happens when the habit fails. A hard expiry on unsynced data would have cost an afternoon.
Related services
The services that draw on this work.
- Regulated and sensitive systemsIdentity verification and KYCBiometric capture without internet, for a passport and ID system in West Africa.
- Cloud and DevOpsZero-downtime migrationA national identity system moved off its old registry gradually, pulling from it every month while both stayed live.
- MobileReact Native developmentAn app for passport applications, built with Expo and published on Google Play, used by agents who work in villages with no signal.
- MobileOffline-first appsPassport and ID card applications, with photographs and biometrics, captured on company phones where there is no signal and uploaded once there is. Built for a national identity authority in West Africa and in production.
- Backend, data and integrationsAPI and backend developmentCalls from our backend to a national registry in West Africa, protected by keys, digest authentication, single-use tokens and an IP allow-list. A stolen key on its own opens nothing.
- Backend, data and integrationsERP, CRM and third-party integrationsA passport system for a West African national identity authority checks applications against the national registry. The connection requires keys, digest authentication, single-use tokens and a request from an allowed IP address, so someone holding a stolen key still cannot get in.
- Regulated and sensitive systemsGovernment documents and audit trailsPassport and ID issuance for a national identity authority in West Africa. Agents capture applications and biometrics with no signal on company phones that can be wiped remotely, and the server catches duplicates. The system is in production and the app is on Google Play.
- Cloud and DevOpsAWS architecturePassport applications captured offline on company phones that can be wiped remotely. The national registry can only be reached with keys, single-use tokens and IP allow-listing.
- AISupabase reviewA passport system where the server catches duplicate applications before anything is accepted, and the national registry sits behind keys, digest authentication, single-use tokens and an IP allow-list, so one stolen key is not enough to get in.
Case study 09
Working on a similar problem? We reply within one business day.
The first call takes 30 minutes, and you’re under no obligation.