Overview
The Expo app is a cross-platform mobile application built with Expo 53 and React Native 0.79. It supports iOS and Android with a modern development workflow using EAS (Expo Application Services) for building, updating, and deploying. Key Information:- Framework: Expo 53.0.11
- React Native: 0.79.3
- React: 19.2.4
- Router: Expo Router 5.1.0
- UI Library: Tamagui 1.126.16
Tech Stack
Core Dependencies
- Expo: 53.0.11 - Mobile app framework
- React Native: 0.79.3 - Cross-platform mobile framework
- React: 19.2.4 - UI library
- Expo Router: 5.1.0 - File-based routing
- Expo Dev Client: 5.2.0 - Custom development builds
UI & Styling
- Tamagui: 1.126.16 - Universal UI kit for React Native and Web
- @tamagui/animations-moti: 1.126.16 - Animation support
- @tamagui/toast: 1.126.16 - Toast notifications
- Expo Image: 2.3.0 - Optimized image component
- @expo/vector-icons: 14.1.0 - Icon library
- @expo-google-fonts/space-grotesk: 0.3.0 - Custom fonts
Navigation
- @react-navigation/native: 7.1.14 - Navigation library
- react-native-screens: 4.11.1 - Native screen primitives
- react-native-safe-area-context: 5.4.0 - Safe area handling
- react-native-gesture-handler: 2.24.0 - Gesture support
Forms & Validation
- react-hook-form: 7.71.1 - Form state management
- @hookform/resolvers: 5.2.2 - Form validation resolvers
- Zod: 4.3.6 - Schema validation
State Management & Data
- Zustand: 5.0.11 - State management
- TanStack Query: 5.90.21 - Data fetching and caching
- react-native-mmkv: 3.2.0 - Fast key-value storage
Internationalization
- i18next: 25.8.7 - i18n framework
- react-i18next: 16.5.4 - React bindings for i18next
- expo-localization: 16.1.5 - Device locale detection
- intl-pluralrules: 2.0.1 - Polyfill for Intl.PluralRules
Data Fetching
- ky: 1.14.3 - HTTP client
- radashi: 12.7.1 - Utility library
Utilities
- date-fns: 4.1.0 - Date manipulation
- ts-pattern: 5.9.0 - Pattern matching
- react-native-keyboard-controller: 1.17.4 - Keyboard handling
- react-native-reanimated: 3.17.5 - Advanced animations
- burnt: 0.13.0 - Native toast notifications
Expo Modules
- expo-application: 6.1.4 - App metadata
- expo-constants: 17.1.6 - App constants
- expo-font: 13.3.1 - Font loading
- expo-linking: 7.1.5 - Deep linking
- expo-splash-screen: 0.30.9 - Splash screen
- expo-status-bar: 2.2.3 - Status bar
- expo-system-ui: 5.0.8 - System UI
- expo-updates: 0.28.14 - OTA updates
Developer Tools
- @dev-plugins/react-native-mmkv: 0.3.1
- @dev-plugins/react-navigation: 0.3.1
- @dev-plugins/react-query: 0.3.1
- expo-atlas: 0.4.0 - Bundle analysis
- react-native-logs: 5.3.0 - Logging
Prerequisites
EAS Setup
Environment Variables
Source of Truth: The EAS project environment is the source of truth. Always pull from EAS to update local environment files.
-
Set environment variables in EAS dashboard:
APP_VARIANT:development,preview, orproductionEXPO_PUBLIC_APP_VARIANT: Your API URL (e.g.,https://dummyjson.com)
- Pull to local environment:
.env.local.example- Example environment variables (not used)- Environment managed through EAS
Development
Available Scripts
Development Workflow
Every time you change
app.json or install native libraries, you must regenerate the native project.Icon Changes
When changing the app icon, clean rebuild:Building
Development Build
Development builds require a development server to be running.- EAS Cloud Build
- Local Build
Preview Build
Internal distribution for Google Play Beta and TestFlight.- EAS Cloud Build
- Local Build
Production Build
- Android: Produces
.aabfile for Google Play Store - iOS: Produces build for App Store Connect
- EAS Cloud Build
- Local Build
Bundle Analysis
OTA Updates
EAS Update provides over-the-air updates for non-native code (JS, styling, images).Submission
Requirements:
- Google Play Developer Account (Android)
- Apple Developer Account (iOS)
- Production build profile
- Google Service Account key (Android)
Testing
End-to-End Testing
The app uses Maestro for E2E testing.As of May 18, 2025, Maestro does not support physical iOS devices.
Project Structure
Configuration Files
EAS Configuration
File:eas.json
Defines build profiles:
development- Development builds for devicesdevelopment-simulator- Development builds for simulatorspreview- Internal distributionproduction- App store builds
Expo Configuration
File:app.json
App metadata, plugins, and configuration.
Metro Configuration
File:metro.config.js
Bundler configuration for React Native.
Babel Configuration
File:babel.config.js
Configured for:
- Expo preset
- React Native Reanimated
- Tamagui
Upgrade Guide
When upgrading to a new Expo SDK version:EAS Workflows
Automate builds with GitHub integration. Manual Run:Workspace Integration
The Expo app uses shared packages from the monorepo:@workspace/core- Shared utilities and components
Known Issues
Resolved Issues:- Invalid hook call in i18n provider (fixed by not preserving code in metro.config.js)
- CheckAuthWrapper TypeError (fixed by using Tamagui Spinner instead of BaseSpinner)
- React resolution error (fixed by removing node_modules in apps/expo)
Planned Improvements
Todo List:
- Use
@workspace/corei18n library instead of i18next - Use
expo-secure-storefor sensitive data (Android Keystore/iOS Keychain) - Integrate Rozenite devtools
- Implement EAS Insights
- Setup EAS Submit automation
- Configure EAS Metadata
- Explore Expo Launch
- Add OpenTelemetry with Embrace SDK
- Upgrade to Expo v54
- Create AGENTS.md documentation
Best Practices
Build Variants: Each environment (development, preview, production) requires different keystores as they count as separate app IDs.
