The two approaches to building applications with Expo tools are called the "managed" and "bare" workflows.
- In the bare workflow you have full control over every aspect of the native project, and Expo tools and services are a little more limited.
If you've used React Native without any Expo tools
then you have used the "bare workflow", but the name probably doesn't sound familiar. It's easier to talk about something when it has a name, so we call this "bare" – somewhat in jest, and because of the existing term "bare metal". If you have direct access to the native code it's a bare
project. The "Already used React Native?"
page might be useful for you to quickly understand where Expo fits in.
Apps are built with the managed workflow using the expo-cli
, the Expo Go app on your mobile device, and our various services: push notifications
, the build service
, and over-the-air (OTA) updates
. Expo tries to manage as much of the complexity of building apps for you as we can, which is why we call it the managed workflow
. The Expo SDK exposes an increasingly comprehensive set of APIs that give you the power to access device capabilities like the camera, biometric authentication, file system, haptics, and so on.
While you can do a lot with the managed workflow, you can't do everything
with it, so what are your options when you encounter a limitation
We will discuss the limitations more in depth soon, for now let's just look at what will happen if it turns out one applies to your application.
If you get to the point where you need to have full control over the native code in your app, you can "eject" (run
expo eject in your project) and expo-cli will expose all of the underlying native projects and configuration. You'll then be using the bare workflow.
In the bare workflow the developer has complete control, along with the complexity that comes with that. You can use most APIs in the Expo SDK, but the build service and easy Configuration with app.json / app.config.js are not yet supported. You can refer to tutorials and guides that are oriented towards native iOS and Android apps and React Native for alternatives.
|Feature||Managed workflow||Bare workflow|
|Use Expo build service to create your iOS and Android builds||✅||✅ (with EAS Build)|
|Use Expo's push notification service||✅||✅|
|Use Expo's over the air updates features||✅||✅|
|Develop with the Expo Go app||✅||✅ (if you follow these guidlines)|
|Access to Expo SDK||✅||✅|
|Add custom native code and manage native dependencies||✅|
|Develop in Xcode and Android Studio||✅|
- 🚫🔒Expo never locks you in, you can "eject" at any time and your project will just be a typical native project with the React Native and Expo SDK packages that your app is using installed and configured.
- 🆕If you are new to mobile development or new to development in general we recommend that you use the managed workflow. There is a huge amount of complexity that comes along with the native development toolchain and the managed workflow allows you to deal with that complexity only when absolutely necessary.
- 🧠 If you are more experienced it also doesn't hurt to start every new project with the managed workflow and only "eject" if you need to.
In summary, use the bare workflow when you need it due to limitations, otherwise use the managed workflow, and you most likely want to start with the managed workflow.