# 06 — Mobile App (React Native) Map > Surface: `apps/mobile-rn` (ACTIVE product mobile app) > Stack: React Native 0.85 + React 19 (CLI) + Supabase + Google Play Billing + AdMob > The Expo legacy skeleton (`apps/mobile`) was **removed 2026-09-13**; `apps/mobile-rn` is the only mobile runtime. > Authoritative checklist: `docs/v3/MOBILE_APP_COMPLETION_SSOT.md` --- ## 1. Navigation structure Root stack (`App.tsx` `RootNavigator`) branches on auth/onboarding: - `recovery` → `UpdatePassword` - `onboarding` → Onboarding + InviteAccept + Login - unauthenticated → Login, SignUp, ForgotPassword, InviteAccept - authenticated → `Main` (`TabNavigator`) + ~22 stack screens Bottom tabs (`TabNavigator.tsx`): **Dash / Works / Record (center raised FAB) / Talk / Settings**. Deep links: `d3ro-voice://` and `https://d3ro.chanpaca.net` (`accept-invite`). Provider stack: `GestureHandlerRootView → SafeAreaProvider → AuthProvider → EntitlementProvider → BillingProvider → MobileAdsProvider → MobilePreferencesProvider → DeviceProvider → LocalizedApplication (I18n + StatusBar)`. --- ## 2. Screens (`src/screens/`, 30) | Screen | Feature | |---|---| | `RecordScreen` | Recording + local-whisper/cloud transcription, import audio, share | | `DashScreen` | Dashboard: usage stats, tier, streaks, trends | | `WorksHubScreen` | WORKS hub: pinned feature drill-down (desktop-parity) | | `TalkScreen` | Voice/text AI chat: STT, LLM streaming, TTS | | `HistoryScreen` / `HistoryDetailScreen` | History list/detail: sync, search, filters, audio playback, edit/share/favorite/delete | | `MeetingsScreen` / `MeetingDetailScreen` | Meeting workspaces: create/rename/delete, transcript, memos, documents, export, content report | | `MemosScreen` | Memos: list, tags, search, share | | `TemplatesScreen` | Dictation/meeting document templates CRUD | | `KnowledgeScreen` | Knowledge docs: create/import/index/merge/delete/search | | `CommandsScreen` | Custom instruction CRUD/reorder/activate/execute | | `ActionsScreen` | Voice-action parse/confirm/execute + history | | `DictionaryScreen` | Dictionary CRUD/search/filters | | `TeamsScreen` / `TeamDetailScreen` | Teams: create, members, invites, rename, leave, meetings, activity feed/comments | | `DevicesScreen` | Registered devices, revoke/remove | | `NotificationsScreen` | Notification list, permission, deep-link nav | | `AccountScreen` | Profile, identities, data export/delete, logout | | `DataPortabilityScreen` | Export/import archive, dictionary, history, meeting docs | | `AdminScreen` / `AdminUserDetailScreen` | Role-gated admin: users, subscriptions, audit, role/tier edits | | `ProPaywallScreen` | Pro/Pro+ paywall: Play IAP, restore, rewarded ads | | `OnboardingScreen` | First-run audience/theme/locale | | `SettingsScreen` | Preferences, locale/theme, privacy links, logout | | `LoginScreen` / `SignUpScreen` / `ForgotPasswordScreen` / `UpdatePasswordScreen` / `InviteAcceptScreen` | Auth flows | --- ## 3. Features (`src/features/`, 20 modules) | Module | Purpose | |---|---| | `recording/` | Durable offline recording queue, retry processing, language handling | | `import/` | Audio pick/decode/validate, local Whisper fallback, resumable multipart upload, Android share-intent intake | | `history/` | History service + local cache + sync hook | | `meetings/` | Meeting workspace CRUD, realtime channels, processing jobs, transcripts/memos/docs | | `memos/` | Memo CRUD, tags, search, realtime, share | | `talk/` | Streaming LLM, transcription, TTS playback | | `teams/` | Team CRUD/members/invites/realtime, pending invite, `listTeamActivities`/`createTeamActivity` (activity feed) | | `knowledge/` | Knowledge docs CRUD/index/merge/search + file picker | | `commands/` | Custom command client | | `actions/` | Voice-action parse/execute + side effects | | `dictionary/` | Dictionary CRUD/pagination/search | | `devices/` | Device registration/list/revoke | | `dashboard/` | Dashboard stats + recent entries | | `templates/` | Templates + generation idempotency | | `auth/` | OAuth sign-in (in-app browser, PKCE) + identity linking | | `admin/` | Admin user/subscription/audit APIs + session/role | | `data-portability/` | Canonical JSON export/import, schema validation, legacy import, meeting export, file sharing | | `chat/` | Chat LLM normalization/streaming, reportable generation IDs | | `notifications/` | Notification contract/native registration/service/runtime hook | | `reporting/` | AI content reporting (reason codes, Edge calls, idempotency) | Core libs (`src/lib/`): `auth-context`, `auth-redirect`, `auth-capabilities`, `secure-auth-storage` (Keychain + legacy migration), `logout`, `account-exit`, `account-local-data` (central purge), `supabase`, `billing-context` (Play/App Store IAP), `entitlement-context`, `device-context`, `preferences-context`, `mobile-ads-context` (UMP consent + rewarded), `native-config`, `pkce-s256`, `random-id`, `audio-recorder`, `e2e-runtime-bootstrap`. --- ## 4. Mobile status summary Source of truth for status is `docs/v3/MOBILE_APP_COMPLETION_SSOT.md` sections 0.1, 2.1, 4. Current condensed state: | Area | Status | |---|---| | Auth / account | `[~]` Implemented + Jest GREEN; external OAuth consent→callback and logout/delete/provider device E2E pending | | Onboarding / theme / accessibility | `[x]` device journey GREEN (some checklist rows still `[ ]` for a11y specifics) | | Recording / transcription / Talk | `[x]` core path GREEN on API 34 (FGS, recovery, local Whisper, cloud fail-closed, TTS) | | Data portability | `[x]` export/restore + share E2E GREEN | | History / meetings | `[x]` real data + meeting creation contract GREEN; audio timestamp/speaker + cross-app E2E pending | | Teams / push | `[~]` teams GREEN; real FCM delivery needs Firebase/FCM credentials | | Billing / ads | `[~]` test ads + Google Play verification code GREEN; live store purchase/restore/settlement and production AdMob serving **RED (external)** | | Admin | `[x]` mobile admin role E2E GREEN (ordinary/manager/admin/super_admin, stale JWT) | | Quality / distribution | `[~]` lint/typecheck/Jest GREEN; production signed AAB + Play submission **RED (external gates)** | **External blockers (do not treat as code gaps):** production Firebase project, AdMob live serving, Play Billing license tester, CI secret injection, signed production AAB, Play closed test (0/12, 14 days), production access approval. See SSOT §0, §6. --- ## 5. Legacy removal The Expo skeleton (`apps/mobile`) was deleted on 2026-09-13: it duplicated auth/data logic, shipped a dev-bypass login, and was outside the workspace and CI. `scripts/ci/sync-version.mjs` and `package-lock.json` no longer reference it. `apps/mobile-rn` is the sole mobile runtime; git history retains the old app. --- ## 6. Tests & evidence - Jest: `apps/mobile-rn/__tests__/` — per SSOT 57 suites / 353 tests (auth, privacy purge, admin, billing, recording language, generation idempotency, templates/memos, STT quota integration). - Maestro E2E: `apps/mobile-rn/.maestro/` + evidence in `.maestro-output/`. - Android instrumentation: `apps/mobile-rn/android/app/src/androidTest` (CSPRNG + incoming share). - Build verifiers: `scripts/ci/verify-android-artifact.mjs`, `verify-android-app-links.mjs`, `verify-mobile-build-config.mjs`, `verify-mobile-release-boundary.mjs`.