Expo Core
Shared model for the expo cluster. The Expo spokes all sit on these concepts — keep them
consistent here. For the React Native runtime beneath Expo (New Architecture, Reanimated,
navigation), see react-native-core.
1. EAS — the cloud backbone
- EAS Build — cloud native builds (iOS/Android) without local Xcode/Android Studio. →
expo-cicd-workflows - EAS Submit — upload builds to App Store / Play Console. Needs store credentials.
- EAS Update — OTA JS/asset updates to installed apps, keyed to a runtime version. Only JS — native changes still need a new build. →
expo-deployment - EAS Hosting — host Expo Router API routes / web. →
expo-api-routes
2. App config & config plugins
- Config lives in
app.json/app.config.js/app.config.ts(the.tsform allows dynamic/env-driven config). - Config plugins modify native project files at prebuild time — prefer them over hand-editing
ios//android/so the native side stays reproducible. expo-tailwind-setupand many libraries ship plugins; register them inplugins: [].
3. The managed ↔ bare spectrum (know where you are)
| Mode | Native dirs | Use |
|---|---|---|
| Expo Go | none | Fastest start; only Expo SDK modules, no custom native. |
| Dev client | generated | Custom native modules while keeping the Expo workflow. → expo-dev-client |
| Prebuild / CNG | generated from config | "Continuous Native Generation" — ios//android/ are build artifacts, regenerated from config + plugins. The recommended default. |
| Bare | committed & hand-edited | Full control; you own native upgrades. One-way from managed. |
Reach for a dev client the moment you need a native module Expo Go lacks.
4. SDK version is the source of truth
- An Expo SDK version pins a specific React Native version and a matched set of native deps. Don't mix versions across that boundary.
- Upgrade via
upgrading-expo(theexpo install --fix/ upgrade flow), not ad-hocnpm install. - Runtime version governs which OTA updates a build will accept — bump it when native changes.
5. Expo Router (app structure)
File-based routing under app/; layouts via _layout.tsx, native tabs/stacks, typed routes,
and server API routes (+api.ts). UI patterns → building-native-ui; server → expo-api-routes.
6. Native modules
Author native modules/views with the Expo Modules API (Swift / Kotlin / TS DSL) → expo-module.
This is the supported path to native code while staying in the Expo/CNG workflow.
7. Shared guardrails
- SDK version is canonical — it pins RN + native deps; upgrade through the official flow.
- Prefer config plugins over manual native edits (keeps prebuild reproducible).
- EAS Update ships JS only; native changes require a new build + runtime-version bump.
- Confirm store credentials/identifiers before EAS Submit.
- Managed → bare is effectively one-way — state it before ejecting.
- For RN-runtime concerns (Reanimated, gestures, New Architecture, navigation internals), defer to
react-native-core.