Skip to content
MOBILE

Approve it from
your pocket.

A real Expo / React Native app, not a wrapper around a mobile website — the governed approval experience is implemented in the repository, with store distribution still on the release roadmap.

01 — APPROVALS QUEUE · SHIPPED

The same risk gate, now on a phone.

Every card shows a color-coded risk score and a plain-language routing label straight from the decision engine. Tap through for the full picture before you decide.

Approve or deny with one thumb. Nothing on the phone is a paraphrase of what the backend actually says.

QUEUE
3 tabs — Pending, Approved, Denied
RISK DISPLAY
Color-coded score (red above 80, amber above 50, gray below) plus the exact routing label the backend assigned — auto-execute, requires approval, or requires senior approval
DETAIL VIEW
Source, endpoint ID, bulleted reasons, a pretty-printed JSON payload, and an optional note
ERROR HANDLING
Backend 403 senior-gate and 409 ACL-deny messages render verbatim on the phone, not re-paraphrased
02 — SHARED CORE · SHIPPED

One OpenAPI spec. Two clients.

The mobile app isn’t a second implementation someone has to remember to keep in sync — it’s generated off the same spec as the dashboard.

Backend, dashboard and mobile can’t quietly drift apart — CI regenerates and diffs the client on every push, the same discipline the rest of the platform holds itself to.

AUTH
Password-grant login against the same /auth/login the dashboard uses, plus a silent single-flight token refresh — concurrent requests share one in-flight refresh instead of racing
TOKEN STORAGE
expo-secure-store — Keychain on iOS, Keystore on Android
TENANT SWITCHER
MSP-admin only — hidden entirely for tenant-scoped roles
API CLIENT
openapi-typescript, generated from the exact same committed spec the dashboard uses
CI
A dedicated mobile-ci.yml — regenerates the client, diffs it, typechecks, runs Jest, on every push
BUILD STATUS

P0 is real. P1+ is roadmap.

Expo SDK 57, React Native 0.87, React 19.3, TypeScript strict, expo-router — 36 test cases across 8 files, no Android/iOS toolchain needed since native builds run on EAS, not in this repo.

✓ SHIPPED (P0)
Password-grant login + refreshKEYCHAIN · KEYSTORE
MSP-admin tenant switcherHIDDEN FOR TENANTS
Approvals queueLIST · DETAIL · APPROVE/DENY
Generated API clientSAME SPEC AS DASHBOARD
Dedicated CITYPECHECK · JEST
⎋ ROADMAP (P1+)
Push notificationsDEVICE REGISTRY + FCM · P1
Endpoints + audit screensREAD-ONLY · P1
Customer portal modeP2
Store submissionEAS BUILD · P3
OIDC SSO + biometric unlockSTUBBED, NOT WIRED

See where the rest of it lives.

Join the waitlist See the platform