Quick verdict
Expo is a React Native framework with routing, a native module library, generated native projects and optional cloud services for builds, submissions and updates. React Native CLI is the community command-line tool for apps that manage their own iOS and Android projects directly. The React Native docs now recommend starting new apps with a framework such as Expo; choose the CLI when you need full manual control.
The official React Native documentation now recommends using a framework for new apps and points to Expo, which reflects how far Expo has moved from its early, restrictive reputation. Custom native code, config plugins and development builds are all supported. The CLI path still matters for teams with existing native code, unusual build pipelines or a preference for managing every native detail by hand.
Expo vs React Native CLI, side by side
| Criterion | Expo | React Native CLI |
|---|---|---|
| What it is | Full React Native framework with tooling and optional cloud services | Community command-line tool for a self-managed React Native project |
| Official guidance | Recommended framework in the React Native docs | Supported for teams that prefer no framework |
| Native projects | Generated from configuration with prebuild, or committed if preferred | Committed and edited directly in Xcode and Android Studio |
| Custom native code | Supported through Expo Modules API, config plugins and development builds | Supported directly in native folders |
| Routing | Expo Router, file-based, built in | Choose your own, commonly React Navigation |
| Builds and submission | EAS Build and Submit, or local builds | Local builds or your own CI pipeline |
| Over-the-air updates | EAS Update or self-hosted update server | Set up your own solution |
| Upgrades | SDK releases bundle tested module versions | Manual native changes guided by the upgrade helper |
| Best fit | Most new apps, startups and product teams | Brownfield apps and teams needing full manual native control |
Choose Expo when
- You are starting a new app and want the officially recommended path.
- You want routing, common native modules and builds set up quickly.
- Over-the-air updates for JavaScript changes are valuable to you.
- Your team is stronger in React than in Xcode and Gradle.
- You prefer upgrades handled through tested SDK releases.
Choose React Native CLI when
- You are adding React Native screens to an existing native app.
- Your build process has strict in-house CI or security requirements.
- You want to edit native projects directly without generation steps.
- Experienced iOS and Android engineers will own the native layers.
Why Expo became the default
Early Expo limited which native code apps could use, so many teams moved to the CLI as soon as they needed a custom SDK. That limitation is gone. Development builds work like a custom version of the Expo Go app with your own native code, config plugins modify native projects during prebuild, and the Expo Modules API makes writing Swift and Kotlin modules straightforward. As a result, the React Native docs now steer new projects toward a framework.
Expo's cloud services are optional. EAS Build, Submit and Update are convenient, especially for teams without macOS build machines, but apps can also be built locally or in any CI system. Since Microsoft retired App Center and CodePush, EAS Update has become a common choice for over-the-air updates, though self-hosted options exist.
When the plain CLI still makes sense
The CLI path shines when native code is the center of gravity. Brownfield projects that embed React Native inside an existing Swift or Kotlin app, companies with locked-down build pipelines, and teams that want every Gradle and Xcode setting under direct version control often prefer it. You can still adopt individual Expo modules in these projects without using the full framework.
The trade-off is maintenance. Without a framework, upgrades require applying native changes by hand, and routing, updates and build automation must be assembled from separate tools. Our React Native development team typically starts new apps on Expo and uses a bare setup only when a clear constraint calls for it.
Final verdict
For most new React Native apps, Expo is the better starting point: it is the framework the React Native docs recommend, it supports custom native code, and it removes much of the build, routing and upgrade work. Choose React Native CLI when you are integrating into an existing native app, must control every native file directly, or have build requirements that a framework would complicate. Both paths produce the same kind of native app.