Technology·14 min read

Expo vs Bare React Native: Which Approach in 2026?

The React Native ecosystem shifted significantly when the official docs made Expo the recommended starting point. But does that mean bare React Native is dead? Not quite. Here is what actually matters when choosing between them in 2026.

N

Nate Laquis

Founder & CEO ·

The Landscape Has Changed

If you have not looked at the React Native ecosystem in a couple of years, you might be surprised by what you find. The official React Native documentation now points developers toward Expo as the recommended way to start a new project. That is not a minor footnote. That is the React Native core team saying, in plain terms, that Expo has become the default path.

This shift has been building for a while, but by 2026 it is effectively complete. Expo is no longer the training-wheels version of React Native that you outgrow once your app gets serious. It is a mature, production-grade platform that handles CI/CD, over-the-air updates, native module integration, and app store submissions. Plenty of large-scale apps run on it without limitation.

That said, bare React Native still has a place. There are specific scenarios where the overhead of the Expo layer creates friction rather than removing it. The answer to which approach you should choose depends on your project, your team, and your native module requirements. This article breaks all of that down.

Mobile app development on a smartphone screen showing React Native code

Understanding the Expo Spectrum

One of the most common sources of confusion is treating Expo as a single thing. It is not. In 2026, Expo actually offers three distinct modes, and picking the right one changes the tradeoffs significantly.

Managed Workflow

The managed workflow is the fully abstracted Expo experience. You write JavaScript and TypeScript, Expo handles the native layers, and you never touch an Xcode project or Android Studio configuration. This is ideal for apps that stay within the boundaries of what Expo's SDK covers, which at this point is quite expansive: cameras, sensors, notifications, payments, biometrics, location, media libraries, and much more.

The limitation is that you cannot add arbitrary native code. If you need a SDK or library that requires custom native modules and no Expo-compatible version exists, you will hit a wall in pure managed mode.

Development Builds

Development builds are the sweet spot that most serious Expo apps use in 2026. You generate a custom native build using EAS Build that includes your specific native dependencies, but you retain the Expo toolchain, file structure, and developer experience on top of it. This gives you the convenience of managed workflow while unlocking the native module flexibility of bare.

Think of development builds as managed workflow with an escape hatch. You get fast refresh, Expo Go-style iteration on the JS layer, and you can still run EAS Update for OTA deployments, but you are not boxed in by the managed SDK boundary.

Bare Workflow

The bare workflow is essentially React Native with the Expo SDK available as a set of optional libraries. You own the iOS and Android directories. You can modify native code directly. You manage your own build pipeline, though you can still opt in to EAS Build and EAS Submit if you want to.

This is the right choice when your project involves deep native integration, brownfield apps (embedding React Native into an existing native app), or teams that already have mobile engineers who are comfortable working directly in Xcode and Android Studio.

EAS Build and EAS Submit: The Infrastructure Advantage

Before EAS (Expo Application Services), one of the strongest arguments for sticking with bare React Native was build infrastructure. Managing signing certificates, provisioning profiles, Fastlane configurations, and CI pipelines for both iOS and Android was genuinely painful. Teams spent days getting this right and more days maintaining it.

EAS Build changed the equation. It is a cloud build service that abstracts almost all of that complexity. You define a build profile in eas.json, run eas build, and Expo's servers handle the compilation, signing, and packaging. The managed and development build workflows benefit most from this, but bare projects can use it too.

EAS Submit takes the next step, automating submission to the Apple App Store and Google Play Store. Combined with EAS Build, you get a complete pipeline from code to published app without standing up your own CI infrastructure.

This matters operationally for teams that do not have dedicated DevOps resources. A two-person startup should not be spending engineering time maintaining a Fastlane setup. EAS Build is worth the subscription cost just for the time it saves.

Developer working on a laptop with mobile development tools and CI pipeline running

The one caveat is build times. EAS Build uses shared infrastructure, and during peak hours or for complex projects, queues can add meaningful time to your build cycle. Teams with demanding CI requirements sometimes supplement EAS Build with self-hosted runners or their own CI pipelines for faster iteration, while still using EAS Submit for the distribution side.

Native Modules in 2026: The Gap Has Narrowed

The historic knock on Expo managed workflow was native module support. If a library needed to drop into native code, you were out of luck. That was a real limitation in 2020. By 2026, it is a much smaller concern.

The Expo Modules API

Expo introduced its own native module API several years ago as a replacement for the deprecated React Native bridge. The Expo Modules API is written in Swift and Kotlin and generates a strongly-typed JavaScript interface from native code automatically. Writing a custom native module that works with Expo managed and development builds is now significantly easier than it used to be. Many library authors have adopted it, which means the ecosystem of Expo-compatible native modules is much broader than it was.

Config Plugins

Config plugins let you modify the native project files during the managed workflow's prebuild step without permanently ejecting from managed mode. A config plugin can modify AndroidManifest.xml, Info.plist, Podfiles, Gradle files, and more. This means that many native SDK integrations that previously required bare workflow can now be handled via config plugins while staying in managed or development build mode.

The Stripe React Native SDK, for example, ships with an Expo config plugin. So does the Firebase SDK, Branch, Sentry, and most of the major third-party integrations you are likely to need. When you do need a custom integration that does not have an existing plugin, writing one is documented and straightforward.

What Still Requires Bare

There are cases where bare is still the right call from a native module perspective. If you are integrating with a proprietary SDK that ships as a pre-compiled binary and has no JavaScript wrapper or Expo integration, you will need direct native access. If your app requires a custom rendering engine, tightly integrated audio processing, or real-time native camera pipelines, the abstraction layer in managed or development builds can add complexity rather than removing it.

The honest test is this: does the native SDK you need have an Expo config plugin or Expo Modules-compatible wrapper? If yes, development builds will handle it cleanly. If the answer is no and there is no clear path to making it work, that is a signal toward bare.

OTA Updates with EAS Update

Over-the-air updates are one of the most compelling features of the Expo ecosystem. EAS Update lets you push JavaScript and asset changes to users without going through an app store review cycle. For bug fixes, content updates, and non-breaking feature changes, this is a significant operational advantage.

The mechanics work through update channels. You can target a specific channel (production, staging, beta) with a new update, and devices on that channel will pull it the next time the app launches or on the interval you configure. Rollbacks work the same way. If an update causes problems, you can push a fix or roll back to a previous update within minutes rather than waiting for app store approval.

It is worth being precise about what OTA updates can and cannot do. They apply to the JavaScript bundle and static assets only. If an update requires a new native binary (a new native module, a change to the native build configuration, a React Native version bump), it still needs to go through a full app store release. This distinction matters for planning your release strategy.

Bare React Native projects can use EAS Update too, but the integration requires more setup. The managed and development build workflows have it baked in. If OTA update velocity is important to your product (and for most consumer apps, it should be), this is a concrete advantage in the Expo column.

Performance: Separating Fact from Folklore

The performance debate between Expo and bare React Native generates a lot of heat and not much light. Let's be direct about what is actually true.

At runtime, there is no meaningful performance difference between an Expo app and a bare React Native app, assuming they are running the same business logic and the same native modules. The JavaScript engine is the same (Hermes by default in both). The bridge architecture is the same. The rendering layer is the same. Expo does not add overhead at runtime.

Where Expo managed workflow previously had a performance disadvantage was in bundle size. The original Expo Go client bundled every SDK module whether you used them or not, which inflated the app size. That model is obsolete. Development builds and standalone production builds only include the Expo SDK modules you actually import. A production Expo app in 2026 has comparable binary size to a bare React Native app with the same dependencies.

Laptop screen with performance monitoring graphs for a mobile application

There is one area where bare workflow can offer a genuine edge: startup time for extremely performance-sensitive apps. If you need sub-100ms cold start times and are willing to do deep optimization work on the native layer, owning the native code directly gives you more control. This matters for a small subset of applications. For most apps, the difference is imperceptible to users and not worth the additional complexity.

If someone tells you that Expo is slower than bare React Native as a general rule in 2026, they are working from outdated assumptions. Ask them to show you benchmarks. You will not find meaningful ones.

When Expo Is Not the Right Tool

There are legitimate scenarios where starting with Expo creates more friction than it removes. Being honest about these cases is more useful than reflexive advocacy for either approach.

Brownfield Integration

If you are embedding React Native into an existing iOS or Android application rather than building a greenfield app, bare workflow is almost certainly the right choice. Brownfield integration requires direct control over how the React Native runtime initializes within your native app container. The Expo architecture is designed for apps where React Native is the primary framework, not a module within a larger native app.

Heavy Proprietary Native SDKs

Some enterprise environments require integration with proprietary SDKs that have no Expo-compatible wrappers and are not candidates for open-source config plugins. Think legacy hardware SDKs, specialized payment terminals, or industry-specific biometric systems. In these cases, bare workflow or a fully native app may be the only viable path.

Teams with Deep Native Expertise

If your team includes experienced iOS and Android engineers who are comfortable in Xcode and Android Studio, the abstraction that Expo provides may actually slow them down rather than help them. Engineers who know native development well often find the Expo layer adds indirection without benefit. Bare workflow keeps them in familiar territory.

Highly Custom Build Pipelines

Organizations with established mobile CI/CD infrastructure, existing code signing workflows, and internal distribution systems may find EAS Build integration more disruptive than helpful. If you already have a mature Fastlane setup that your team trusts, the case for migrating to EAS is weaker than it is for a team starting fresh.

Developer Experience: Day-to-Day Realities

The developer experience gap between Expo and bare React Native has become one of the most practically important factors in the decision. Let's walk through what the day-to-day actually looks like.

Onboarding New Developers

With Expo managed or development builds, a new developer can clone the repository, run npx expo install, and be running the app on a physical device in under ten minutes, assuming they have already set up Node. No Xcode project configuration, no CocoaPods troubleshooting, no Android SDK path issues. This is not a marginal improvement. For teams that frequently onboard contractors or rotate engineers, the time savings compound significantly.

Bare React Native onboarding requires setting up the full native environment. The React Native CLI documentation covers this, but in practice it involves Xcode command line tools, CocoaPods, Java, the Android SDK, environment variable configuration, and a first build that can take 20 to 40 minutes and frequently surfaces environment-specific errors. Experienced mobile developers get through this smoothly. Developers coming from a web background often do not.

Debugging and Hot Reload

Both approaches support fast refresh for JavaScript changes. Where Expo development builds have an edge is in the native development cycle. The Expo development server maintains a connection to your running development build, which means you can swap JavaScript bundles rapidly without rebuilding the native layer. When you do need to rebuild native, EAS Build handles it in the cloud rather than tying up your local machine for 10 to 15 minutes.

Dependency Management

The npx expo install command, rather than plain npm install, checks compatibility between the package you are installing and your current Expo SDK version. This prevents a class of version conflict bugs that are genuinely common in bare React Native projects. It does not eliminate all dependency issues, but it catches the most common ones before they cause problems.

In bare workflow, managing native dependency compatibility falls entirely on you. React Native has improved its dependency model considerably, but version conflicts between native modules and React Native core still happen and can be time-consuming to diagnose.

Migration Paths in Both Directions

One of the underappreciated aspects of this decision is that it is not irreversible. Understanding the migration paths in both directions should inform how much weight you put on the initial choice.

From Managed to Bare (Ejecting)

Expo provides a prebuild command that generates the native iOS and Android directories from your managed project configuration. Once those directories exist, you are in bare workflow territory and can modify native code directly. The generated code is clean and well-organized. This path is well-documented and used regularly in production projects that started managed and grew into native requirements.

The cost of ejecting is that you now own the native layer. Future React Native version upgrades require manual migration work in the native directories. The Expo team no longer manages that for you. Teams that eject sometimes find themselves inheriting maintenance work they were not expecting.

From Bare to Expo

Moving from bare to Expo development builds is also possible, though it requires more discipline. You need to ensure your native modifications are expressible as config plugins or Expo Modules-compatible modules, and you need to reconcile your native directory state with what Expo's prebuild would generate. For projects with modest native customization, this migration is tractable. For projects with deep native modifications, it may not be worth the effort.

The practical implication of this is that starting with Expo development builds and migrating toward bare if needed is lower-risk than starting bare and trying to migrate into Expo later. Default to Expo development builds for new projects, and only go bare from the start if you have a concrete reason that cannot be addressed by config plugins or the Expo Modules API.

The Recommendation

After working through the tradeoffs across many production mobile applications, the answer in 2026 is clear for most projects: start with Expo development builds.

Not managed workflow, which is better suited for simple apps or rapid prototypes. Not bare workflow by default. Expo development builds give you the full Expo toolchain, EAS Build, EAS Update, and the developer experience advantages while removing the native module ceiling that made managed workflow limiting in earlier years.

The cases where bare React Native is the better starting point are real but specific. Brownfield integration into an existing native app. Teams with deep native expertise who find the abstraction counterproductive. Projects with known requirements for proprietary native SDKs that have no Expo path. Outside of those scenarios, the overhead of managing bare React Native buys you capabilities you probably do not need and costs you time that compounds across your entire development lifecycle.

A practical checklist before choosing bare over Expo development builds:

  • Does your project require brownfield integration into an existing native app? If yes, bare is likely the right choice.
  • Do you have a specific native SDK requirement with no Expo config plugin or Expo Modules wrapper? Check the Expo ecosystem first. If there is genuinely no path, bare may be necessary.
  • Does your team have experienced native mobile engineers who prefer direct Xcode and Android Studio access? Factor this into the decision but weigh it against onboarding overhead for other team members.
  • Do you have an existing CI/CD pipeline you are not willing to migrate away from? You can use EAS Submit with your own build system, but evaluate whether EAS Build fits your constraints.

If none of those apply, Expo development builds with EAS Build and EAS Update is the right foundation for a React Native project in 2026. The React Native team's own recommendation reflects years of watching where the ecosystem friction actually lives. They are right to point new projects toward Expo.

If you are planning a mobile application and want to talk through the architecture before committing to an approach, we work through exactly these decisions with clients every week. Book a free strategy call and we will give you a straight answer based on your specific requirements.

Need help building this?

Our team has launched 50+ products for startups and ambitious brands. Let's talk about your project.

ExpoReact Nativemobile developmentExpo vs bare workflowcross-platform mobile

Ready to build your product?

Book a free 15-minute strategy call. No pitch, just clarity on your next steps.

Get Started