Field auditors work in parks and public spaces where connectivity is unreliable. Paper forms meant re-keying everything later, and any app that assumed a live connection would lose an auditor's work the moment they walked out of range.
What I built
Two products on one typed backend. A React Native and Expo app that runs a complete audit offline, using Legend State and MMKV for local persistence with background sync when the connection returns. And a Next.js dashboard where coordinators manage sites, review submissions, and export results.
Behind both sits a FastAPI service on PostgreSQL with SQLAlchemy: role-based access control, draft save and resume, normalized scoring pipelines, and client-side CSV, XLSX, and PDF export.
Decisions that mattered
Offline is the default path, not a fallback. Every write lands in local state first and syncs after, so the app behaves the same in a dead zone as it does on wifi.
Draft-save was hardened against duplicate-key failures that only surfaced during multi-round field testing. Real auditors found edge cases no test suite had.
Scoring is normalized server-side, so a partially completed audit still produces a comparable result instead of an error.
Accessibility and i18n were configured from the start for a diverse field-worker population, not retrofitted later.
How I knew it worked
I instrumented both products with PostHog for funnels and product analytics, Sentry for error and performance monitoring, and Microsoft Clarity for session replay. That turned real field usage into signal: which steps auditors abandoned, which errors were failing silently, and where the interface slowed people down.
Like this project
Posted Sep 9, 2026
Auditors start, pause, and resume field audits with no connection and never lose a draft. FastAPI + PostgreSQL, Next.js dashboard, React Native app.