Expo
Expo is a toolkit and platform that makes building React Native apps dramatically faster. Its managed workflow handles most native configuration for you, and its cloud services — EAS Build, EAS Submit, and over-the-air (OTA) updates — cover building, distributing, and updating apps without wrestling Xcode and Android Studio directly.
The old "Expo can't do native code" objection is outdated: with config plugins and development builds, modern Expo supports most native modules while keeping the managed convenience. For the vast majority of apps, starting with Expo is the fastest, lowest-friction path.
TL;DR
- The fastest way to start a React Native app.
- Use Expo Go for development, EAS for builds and distribution.
- OTA updates ship JS changes without a full store release (with care).
- Custom native code is still possible via config plugins / dev builds.
Quick Example
One command scaffolds a runnable app:
Key Concepts
- Managed workflow — Expo handles most native configuration.
- Expo Go — a dev app for instantly running projects on a device.
- EAS Build — cloud builds for iOS/Android (no local native toolchain needed).
- EAS Submit — submit builds to the App Store / Play Store.
- OTA updates — ship JavaScript/asset changes without a full store release.
Best Practices
- Treat OTA updates like production deploys — test and stage them; they reach users instantly.
- Keep native dependencies intentional — avoid dependency sprawl that complicates builds.
- Separate dev/stage/prod environment configs and secrets.
- Use development builds (not just Expo Go) once you add custom native modules.
When Expo Is a Great Fit
A great fit when you want rapid iteration, you're building a typical app (network + UI), and you don't need deep custom native platform work. Reconsider a bare/custom setup only when you need a native capability Expo's plugins can't accommodate.
Common Mistakes
Expecting OTA to ship native changes
Environment variable drift
FAQ
Expo or bare React Native?
Start with Expo unless you have a specific reason not to — it removes enormous setup and maintenance friction, and modern Expo (config plugins, development builds, EAS) handles most native needs. Choose bare only when you require a native integration Expo can't support or need full control over the native projects. You can also start managed and adopt a development build or eject later if requirements grow.
What are over-the-air (OTA) updates and what are their limits?
OTA updates let you push JavaScript and asset changes directly to installed apps without going through app-store review — great for quick fixes and content updates. The limit is fundamental: OTA cannot change native code, native dependencies, or anything requiring a rebuild. Those still need a new EAS Build and store submission. Treat OTA like a production deploy with testing and staged rollout, since it reaches users immediately.
Do I still need a Mac or Xcode with Expo?
Largely no — EAS Build compiles iOS and Android apps in the cloud, so you can build and ship an iOS app without a local Mac/Xcode setup. You'll still interact with Apple's developer account for credentials and store submission (which EAS can help automate). This is one of Expo's biggest practical advantages for cross-platform teams.
What's the difference between Expo Go and a development build?
Expo Go is a prebuilt sandbox app for running standard Expo projects instantly — perfect for getting started, but it only includes the native modules Expo bundles. A development build is your own app binary (via EAS) that includes your specific native dependencies and config plugins, giving you Expo's developer experience with custom native code. Move from Expo Go to a dev build once you add native modules.
Related Topics
- React Native — What Expo builds on
- Mobile Development — The hub
- Flutter — Cross-platform alternative
- Push Notifications — Expo has a notifications API
- Mobile Navigation — Expo Router