/library / template-expo-mobile-app
templateMobile

Expo React Native mobile app (iOS + Android + Web)

A cross-platform Expo app with Expo Router (file-based), Tamagui for theming, EAS Build for releases, and Sentry for crash reporting. Single codebase ships to App Store, Play Store, and the web.

use whenMobile-first product that also needs a web fallback. You don't want native Swift or Kotlin and you want OTA updates.

May 10, 20262,470 bytesexporeact-nativetamaguieasmobile

[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 production then eas 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 group
  • app/_layout.tsx root layout
  • components/ Tamagui-themed components
  • lib/api.ts API client
  • lib/auth.ts Expo SecureStore + refresh
  • stores/ Zustand
  • tamagui.config.ts theme tokens
  • eas.json build profiles (dev / preview / production)
  • app.config.ts Expo config (versionCode, name, icon)

.env keys

  • EXPO_PUBLIC_API_BASE_URL
  • SENTRY_AUTH_TOKEN (set in EAS secrets, not committed)
  • EAS_PROJECT_ID

Hard rules

  • Secrets via Expo SecureStore, never AsyncStorage.
  • Every screen uses <SafeAreaView> or useSafeAreaInsets. iOS notch + Android display cutouts.
  • Tamagui tokens for every color, space, font size. No magic numbers in StyleSheet.
  • eas update is 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

  1. Create EAS project. Save EAS_PROJECT_ID.
  2. Set bundle identifiers (iOS) + applicationId (Android) in app.config.ts.
  3. Set up App Store Connect + Google Play Console for eas submit.
  4. Install on a real device with eas build --profile development -> sideload.
  5. Configure OTA channels: dev, preview, production.

Get the next CLAUDE.md in your inbox.

One new template every week, plus occasional case studies.