You've decided to build a mobile app with React Native. You're excited, you've got your ideas, and you open the official documentation. You're immediately faced with a choice that will define your entire development experience:
Do you start with Expo or the Bare React Native CLI?
This isn't just a minor tooling preference. It's a fundamental decision that impacts how you write code, add features, and ultimately ship your app. Think of it like this:
-
Bare React Native is like building a custom house. You get the raw land and the blueprints. You have ultimate control over every material and every wire, but you're also responsible for the plumbing, electricity, and foundation.
-
Expo is like buying a high-end, move-in-ready house. The foundation is solid, the utilities are connected, and it comes with premium appliances. You can start living in it immediately, but you might not be able to change the core plumbing without a specialist.
Let's break down what this means for you, the developer.
What is the "Bare" React Native Workflow?
This is the traditional, "original" way of building with React Native. You run a command like npx react-native init MyApp, and it generates a project for you.
When you look inside the project folder, you'll see your JavaScript code alongside two very important folders: /ios and /android.
These are real, native project folders. You can open the /ios folder in Xcode and the /android folder in Android Studio.
Key Characteristics of the Bare Workflow:
-
Full Native Control: You have direct access to the native code. Need to write a custom module in Swift or Kotlin? You can do it right here. Need to tweak the build settings in Xcode? Go for it.
-
Unlimited Flexibility: Any third-party React Native library, whether it's pure JavaScript or requires linking native code, will work. There are no restrictions.
-
Complexity: This control comes at a price. You are now responsible for managing native dependencies, configuring signing credentials, and dealing with native build errors in both Xcode and Android Studio. This can be a significant source of frustration, especially for developers without native mobile experience.
What is Expo? The "Managed" Workflow
Expo is a framework and a platform built on top of React Native. Its goal is to simplify the development process by abstracting away the native complexities.
When you start a project with npx create-expo-app my-app, you get a clean project folder with just your JavaScript/TypeScript code. There are no /ios or /android folders to worry about.
Key Characteristics of the Expo "Managed" Workflow:
-
Simplicity and Speed: You can get an app running on your physical device in minutes using the Expo Go app. Just scan a QR code. You don't need to install Xcode or Android Studio to get started.
-
Curated APIs: Expo provides a rich SDK of pre-built modules for common needs like the camera, filesystem, location, authentication, and push notifications. These APIs are reliable and work seamlessly across both iOS and Android.
-
Over-the-Air (OTA) Updates: Ship bug fixes and small features to your users instantly without going through the lengthy app store review process. This is a killer feature for rapid iteration.
The Modern Game-Changer: Expo Development Builds & EAS
In the past, the big limitation of Expo was that if you needed a native module that wasn't in the Expo SDK, you were stuck. You had to "eject," which converted your project to the Bare workflow and lost you all the benefits of Expo.
This is no longer the case.
With Expo Application Services (EAS) and Development Builds, the lines have blurred. You can now:
-
Start with the simple managed workflow.
-
If you need a custom native library, you can create a "development build" of your app.
-
EAS will build a custom version of the Expo Go app for you in the cloud, with your specific native modules included.
-
You can then install this custom app on your device and continue developing with all the benefits of Expo's fast refresh and tooling.
This gives you the best of both worlds: a simple, managed starting point with a clear path to including custom native code when you need it.
Head-to-Head Comparison: Expo vs. Bare RN
Feature |
Expo (with EAS) |
Bare React Native CLI |
Setup & Getting Started |
Extremely fast. No native tooling needed initially. |
Slower. Requires Xcode and/or Android Studio setup from day one. |
Development Experience |
Excellent. Fast refresh, Expo Go app, helpful error messages. |
Good, but you're responsible for running the app from Xcode/Android Studio. |
Adding Native Libraries |
Add any library. Use EAS to build it into your development client. |
Add any library. Requires manual linking and potential native configuration. |
Native Code Access |
Possible via Expo Modules and config plugins. More abstract. |
Direct and complete access to /ios and /android folders. |
Build & Deployment |
Simplified via EAS (Expo Application Services) for builds, submissions, and updates. |
Manual. You must configure and run builds in Xcode and Android Studio. |
Learning Curve |
Much gentler, especially for web developers. |
Steeper. Requires learning the basics of native build systems. |
Flexibility |
Highly flexible, with an escape hatch for almost any native need. |
Maximum flexibility and fine-grained control. |
The Verdict: Which One Should You Choose?
This used to be a tough question, but today the answer is much clearer.
You should start with Expo for 95% of new projects.
Why?
-
The Best Starting Point: It provides the fastest path from idea to working app.
-
Lower Barrier to Entry: Perfect for solo developers, web developers moving to mobile, and teams who want to iterate quickly.
-
No Longer a "Trap": With Development Builds and EAS, you are no longer locked in. You have a clear, well-supported path to add custom native code if and when you need it. You get the developer convenience without sacrificing future flexibility.
When should you still choose the Bare Workflow?
There are a few specific scenarios where starting with the Bare workflow makes sense:
-
Integrating into an Existing Native App: If you have a large, existing iOS or Android app and want to add a few React Native screens to it, the Bare workflow is the way to go.
-
Complex Native Requirements from Day One: If your app's core feature is a highly custom, performance-critical native module (e.g., real-time audio processing, a custom Bluetooth protocol), and you have developers with native experience, starting Bare gives you that immediate, low-level control.
Conclusion
The debate between Expo and Bare React Native has evolved. Thanks to the incredible progress of the Expo platform, it's no longer a question of "simplicity vs. power."
For modern React Native development, the question is: "Do I want an amazing, fast, and simple development experience that can scale to include native code, or do I have a niche reason to manage the native projects myself from the very beginning?"
For almost everyone, the answer is clear. Start with Expo. Stop worrying about native build configs and start building the app you've been dreaming of.