Mobile shipping is decomposed into 5 phases:
0. Deployment Foundation — Netralax brand on a runnable dev build.
1. Auth + Chat MVP — magic-link login, conversation list, text send.
2. Messaging Features — attachments, voice messages, reactions.
3. Voice/Video Calls — LiveKit RN + CallKit/ConnectionService.
4. Polish + Store Submission — TestFlight, Play, signing.
Phase 0 spec lays out the concrete file changes:
* app.json rename to Netralax + cloud.netralax.app bundle/package.
* New eas.json with development/preview/production profiles.
* SafeAreaProvider + GestureHandlerRootView + ErrorBoundary in the
root layout, Netralax landing screen with runtime app version.
* sharedSmoke.ts runtime import to verify Metro can resolve
@chat-app/shared (which already has CryptoBackend/SecretStore
interfaces designed for mobile adapters).
* README quickstart for `eas init` + first dev client build.
No code changes here — just the planning surface. Implementation plan
follows.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.8 KiB
Mobile Deployment Roadmap
Date: 2026-05-13
Scope: apps/mobile end-to-end ship to iOS App Store + Google Play
Status: Decomposition — each phase ships independently with its own spec.
Where we are today
apps/mobileis an Expo + React Native scaffold from the very first commit (f7cfd2a initial). It has the right deps (expo-router,react-native-libsodium,expo-secure-store,expo-sqlite,expo-notifications) but no real screens — just two placeholders ("ChatApp" landing, "Chats — placeholder").- Earlier mobile work (image attachments, voice messages, voice calls, reactions, profile editing, push wiring) lives on the archived
byGalax/chat-appGitHub repo. It targets a pre-Tauri→Electronpackages/sharedAPI and is not directly portable; we treat it as reference material, not a merge source. packages/sharedis platform-agnostic by design (CryptoBackendandSecretStoreinterfaces wait for mobile adapters), so the desktop's business logic is reusable verbatim once we plug in RN-flavoured implementations.- The desktop reached
v0.17.5with a Netralax rebrand, Discord-style call/chat UX, and an EAS-free electron-builder/electron-updater release pipeline pointed atupdate.netralax.cloud.
Goal
Ship the Netralax mobile app to iOS App Store + Google Play with the core Discord-style chat + voice/video calls of the desktop, working over the same self-hosted Supabase + LiveKit backend.
Decomposition
Five phases, each with its own design spec, plan, and ship gate. We brainstorm and execute one at a time; later phases only get fleshed out once their prerequisites land.
Phase 0 — Deployment Foundation
Spec: 2026-05-13-mobile-phase-0-foundation-design.md
Goal: prove the pipeline. After Phase 0, eas build (or expo run) produces a runnable Netralax-branded shell on a real iPhone + Android device. No features yet — but every later phase ships through this same build pipeline.
Phase 1 — Auth + Chat MVP
Why next: smallest end-to-end vertical slice that's actually useful. Users can log in, see conversations, send/receive text.
- Mobile
CryptoBackendadapter wrappingreact-native-libsodium. - Mobile
SecretStoreadapter wrappingexpo-secure-store. - Magic-link auth + device-key registration (reuse
packages/shared/auth). - Conversation list (DM + group) with last-message preview.
- Conversation view: decrypt + render text messages, send text.
- Push notifications via
expo-notifications+ the existingnotify-pushedge function. - Minimal profile + logout.
Phase 2 — Messaging Features
Why next: mobile users expect parity with desktop on day-to-day messaging.
- Image attachments (camera roll + camera capture).
- File attachments (document picker).
- Voice messages (record + play).
- Reactions, edit, delete, reply, forward.
- Read receipts + delivery state.
- Typing indicator.
- Polls (optional / stretch).
Phase 3 — Voice/Video Calls
Why now and not Phase 1: RN LiveKit + native call UX (CallKit / ConnectionService) is the heaviest single feature. Hard to scope without the basic chat working first, and not blocking for an early TestFlight.
- LiveKit React Native SDK (
@livekit/react-native+@livekit/react-native-webrtc). - Incoming call notifications wake the app via CallKit (iOS) + ConnectionService (Android).
- Outgoing call flow.
- Voice + video tracks, mute/hangup, speaker/earpiece switch, headset routing.
- Screen sharing is explicitly out of scope on mobile.
Phase 4 — Polish + Store Submission
Why last: can't submit until the features are in.
- Privacy policy + Terms surfaced inside the app.
- Store-listing assets: screenshots, descriptions, age rating.
- Code signing: Apple Developer Program enrolment + provisioning, Android upload keystore.
- TestFlight internal + external testing.
- Google Play internal track → closed test → production.
Cross-cutting decisions (locked in here, no per-phase relitigation)
| Topic | Decision | Rationale |
|---|---|---|
| Framework | Expo + React Native (existing scaffold) | Already set up; New Architecture enabled; managed-workflow gives EAS Build out of the box |
| Branding | Netralax everywhere | Matches the desktop rebrand released as v0.17.x |
| Bundle / package id | cloud.netralax.app (both iOS + Android) |
Matches the desktop's AppUserModelId cloud.netralax.desktop; com.meinname.chatapp is dev-placeholder |
| Shared business logic | Consume @chat-app/shared verbatim |
Designed for this; the only mobile-specific pieces are the CryptoBackend + SecretStore adapters |
| Old chat-app mobile sprints | Reference, do not merge | API drift since pre-Electron; cleaner to rewrite against current shared |
| Backend | Self-hosted Supabase at update.netralax.cloud + LiveKit |
Unchanged from desktop |
| Push delivery | Expo Push Service for development; native APNS + FCM after EAS submit | Avoids managing certs in Phase 1 |
| State management | React local state + tiny context, same as desktop | Avoid Redux/Zustand bloat for a chat app |
| Persistent local store | expo-sqlite (already in deps) |
Mirror desktop's better-sqlite3 schema |
Ship gates between phases
A phase only ends — and the next one begins — when:
- Manual verification of every spec'd flow passes on both an iOS device and an Android device.
- The previous phase's release build still runs (no regression).
- The phase's spec is reflected in the codebase (no straggling TODOs that were in scope).
Out of scope for the entire roadmap
- Web build of the mobile app (Expo can technically emit one — not worth the bundle-cost double-duty since the Electron app already covers desktop).
- macOS / Windows React Native targets.
- Watch / TV / wearable apps.
- iPad-specific UI tuning beyond
"supportsTablet": true(we ship the phone UI on tablet for now). - Resurrecting any code from the archived
chat-appmobile sprints.