[App Name]
A cross-platform mobile app. iOS, Android, and a passable web fallback all from one codebase.
Source of truth
The git main branch is the source for the JS bundle. App Store and Play Store builds are versioned releases off main, built via EAS. OTA updates ship via eas update --branch production.
Tech stack
Expo SDK 53 + React Native 0.78 + TypeScript. Expo Router (file-based, like Next App Router). Tamagui for theme + components (works on web too). React Query for server state. Zustand for local. EAS Build for app store binaries. EAS Update for OTA. Sentry for crashes.
Deploy
- Web:
eas deploy-> Vercel-style hosting on EAS Hosting - iOS / Android:
eas build --profile productiontheneas submit - OTA:
eas update --branch production(JS-only changes ship in under a minute)
File map
app/Expo Router routes (mirrors Next.js App Router)app/(tabs)/tab navigator groupapp/_layout.tsxroot layoutcomponents/Tamagui-themed componentslib/api.tsAPI clientlib/auth.tsExpo SecureStore + refreshstores/Zustandtamagui.config.tstheme tokenseas.jsonbuild profiles (dev / preview / production)app.config.tsExpo config (versionCode, name, icon)
.env keys
EXPO_PUBLIC_API_BASE_URLSENTRY_AUTH_TOKEN(set in EAS secrets, not committed)EAS_PROJECT_ID
Hard rules
- Secrets via Expo SecureStore, never AsyncStorage.
- Every screen uses
<SafeAreaView>oruseSafeAreaInsets. iOS notch + Android display cutouts. - Tamagui tokens for every color, space, font size. No magic numbers in StyleSheet.
eas updateis for JS-only. Native changes need a new build.- Test on a real iPhone and a real Android device before every release. Simulators lie about gestures.
- Sentry source maps uploaded automatically via
expo-cli sentry:upload.
Recent significant changes
- 2026-05-10: Scaffolded. Locked: Expo Router over React Navigation alone, Tamagui over NativeBase (web parity matters), EAS over bare Xcode.
Next session: start here
- Create EAS project. Save
EAS_PROJECT_ID. - Set bundle identifiers (iOS) + applicationId (Android) in
app.config.ts. - Set up App Store Connect + Google Play Console for
eas submit. - Install on a real device with
eas build --profile development-> sideload. - Configure OTA channels:
dev,preview,production.