Ship an iOS + Android app from one TypeScript codebase, with store builds you can produce on demand.
Recommended stack
- Expo + Expo Router - framework. File-based native navigation, OTA updates, and the best RN developer loop.
- EAS Build & Submit - release pipeline. Store-ready builds in CI without a local Xcode setup.
- Supabase - backend. Auth, Postgres, and realtime with a first-class RN client.
- react-native-reanimated - animation. 60fps gestures and transitions on the UI thread.
Build steps
- Start with
npx create-expo-app(router template); set the bundle id/package name on day one. - Build navigation skeleton: tabs + one stack per tab; deep links from the start.
- Implement auth/session persistence with secure storage before any feature work.
- Use FlatList (or FlashList) for anything scrollable; measure with the perf monitor.
- Cut a TestFlight/internal-track build via EAS in week one - store config errors surface early.
Watch out for
- Ejecting for a native module Expo config plugins already cover.
- Testing only on the simulator; gestures and keyboards behave differently on hardware.
- Shipping screens that don't handle offline/slow network.
Definition of done
- Cold start to interactive < 2s on a mid-range Android phone
- Auth survives app kill + relaunch
- An EAS build installs from TestFlight/internal track