Product
Mobile App
Field-ready companion app for measurement capture, on-the-go approvals, and offline operations in low-connectivity environments.
Stack
- Framework: React Native via Expo SDK 52, TypeScript.
- Navigation: Expo Router (file-based).
- State: TanStack Query with persistence; SQLite (op-sqlite) for offline cache.
- Maps: Mapbox GL Native with offline tile packs.
- Sensors: Camera, GPS, accelerometer, NFC for tag scanning.
- Distribution: Internal TestFlight + Google Play closed track; OTA updates via EAS Update.
Primary personas
- Field agent — captures plot measurements, tree counts, photos.
- Community lead — confirms attendance at training, logs grievances.
- Verifier (on-site) — spot-checks plots, signs off on evidence.
- Approver (executive) — reviews and approves disbursements on the go.
Offline-first model
The mobile app assumes connectivity is the exception, not the rule. All write operations are queued locally with a deterministic client_id and replayed when the device reconnects. Conflicts are resolved server-side using last-write-wins for editable fields and append-only for measurements.
- User performs an action → optimistic UI update, write to local SQLite.
- Outbox worker batches writes and uploads when online (Wi-Fi preferred by default).
- Server applies writes idempotently; returns canonical ids and timestamps.
- Local store is reconciled; tombstones removed; UI re-renders silently.
- Failures surface in a "Sync issues" tray with retry / discard actions.
Data capture quality
- GPS accuracy threshold enforced before allowing a plot measurement to save.
- Photos stamped with EXIF GPS, device id, and a server-issued nonce to deter tampering.
- Required-field validation runs locally so users never lose work to a connectivity drop.
- Voice notes auto-transcribed on the device using Whisper-tiny for low-bandwidth uploads.
Security
- Biometric unlock (Face ID / fingerprint) required to open the app.
- Local database encrypted with SQLCipher; keys stored in Secure Enclave / Keystore.
- Auto-lock after 5 minutes of inactivity; remote wipe via admin console.
- Screenshots disabled on sensitive screens (capital and KYC views).
Supported devices
iOS 16+ and Android 11+. Ruggedized devices (CAT, Samsung XCover) are part of the test matrix.