Skip to content
← Blog
Technicalby Goodspeed Team

Expo vs Bare React Native: The 2026 Decision Guide

When should you use Expo and when does bare React Native make more sense? A practical guide based on building dozens of production apps.

## The Short Answer

Use Expo. Unless you have a very specific reason not to, Expo is the right choice for React Native development in 2026. This wasn't always true, but the framework has evolved to the point where bare React Native is the exception, not the rule.

Now let me explain why, and cover the cases where bare React Native still makes sense.

## What Expo Actually Is in 2026

Expo isn't what it was in 2021. Back then, "Expo" meant the managed workflow with a limited set of APIs and no escape hatch for native code. If you needed a custom native module, you ejected and lost all the benefits.

Today, Expo is three things:

1. **Expo SDK** - A curated set of high-quality native modules (camera, notifications, file system, etc.) 2. **Expo CLI + Dev Tools** - Development server, debugging, testing tools 3. **EAS (Expo Application Services)** - Cloud builds, OTA updates, app store submissions

You can use any combination of these. You can use the SDK without EAS. You can use EAS with bare React Native. The pieces are modular.

### The Development Build Approach

The old Expo Go app was limiting. You could only use pre-included native modules. Development builds changed everything. You create a custom build of your app that includes whatever native modules you need, then iterate with hot reloading just like Expo Go.

This means you get the development speed of the managed workflow with the flexibility of bare React Native. It's the best of both worlds.

## Why Expo Wins for Most Apps

### OTA Updates

This is the single biggest advantage. With EAS Update, you can push JavaScript and asset changes directly to users without going through app store review. Bug fix at 2 AM? Push an update. Your users get it within minutes.

We use OTA updates on every app we ship. The workflow is simple: run your tests, then publish. Users get the update on their next app launch.

For traditional bare React Native, you'd need to set up CodePush (now deprecated by Microsoft) or build your own update infrastructure. Expo handles it natively.

### Cloud Builds

Building iOS apps requires a Mac. Or it did, until EAS Build. Submit your code and EAS builds it in the cloud on Apple silicon. You get an IPA file back, ready for TestFlight or the App Store.

This is transformative for teams that don't have Mac hardware or for CI/CD pipelines. One command:

```bash eas build --platform ios --profile production ```

Your build runs in the cloud, and you get notified when it's done. No Xcode maintenance, no macOS updates breaking your build, no certificate management headaches (EAS handles that too).

### Consistent Module Quality

Expo SDK modules are maintained by a dedicated team. They follow consistent APIs, handle edge cases, and work together without conflicts. In bare React Native, you might combine five different community packages that each handle permissions differently, have conflicting native dependencies, or haven't been updated in months.

`expo-camera`, `expo-notifications`, `expo-file-system`, `expo-location`: these all work. They're tested together. They update together. The maintenance burden drops significantly.

## When Bare React Native Still Makes Sense

### Heavy Native Code

If your app is 70% native code with a React Native UI layer, Expo adds overhead without much benefit. Think: apps with custom video processing pipelines, complex Bluetooth interactions, or proprietary SDKs that need deep native integration.

### Existing Native Apps

If you're adding React Native to an existing iOS or Android app (the "brownfield" approach), bare React Native gives you more control over the integration. Expo's project structure assumes React Native is the primary framework.

### Specific Native Module Requirements

Some enterprise SDKs or specialized hardware integrations don't play nicely with Expo's build system. If you need a native module that requires custom build steps, Gradle plugin modifications, or specific Xcode project configurations, bare React Native gives you direct access to the native projects.

### Team Expertise

If your team has deep iOS and Android expertise and prefers working directly with Xcode and Android Studio, bare React Native lets them stay in familiar territory. Expo abstracts away the native projects, which is great for JavaScript developers but can feel constraining for native developers.

## The Migration Path

Starting with Expo doesn't lock you in. You can:

1. **Eject to bare workflow** - Run `npx expo prebuild` to generate the native projects. You keep all the Expo modules but gain direct access to native code. 2. **Add custom native modules** - Use Expo Modules API to write native code that integrates cleanly with the Expo ecosystem. 3. **Use config plugins** - Modify native project settings without ejecting, through JavaScript configuration.

Going the other direction (bare to Expo) is harder but possible. The key dependencies are compatible, but restructuring an existing native project to match Expo's expectations takes effort.

## Our Setup

Every app built through [our pipeline](/features/building) uses Expo with EAS. The configuration lives in `app.config.js` (dynamic, driven by a central config file) and `eas.json` (build profiles for development, preview, and production).

We run development builds on physical devices for testing, preview builds for internal review, and production builds for app store submission. OTA updates go to the preview channel for testing, then production for users.

The tooling around [EAS builds](/tech/eas-build) handles certificate management, environment variables, and build caching. A clean build takes about 15 minutes. Cached builds are faster.

## Making Your Decision

Ask yourself these questions:

1. **Does your app need custom native code?** If no, use Expo. If yes, can it be done through a config plugin or Expo module? If yes, still use Expo. 2. **Do you want OTA updates?** If yes, Expo makes this trivial. 3. **Do you have a Mac for iOS builds?** If no, EAS Build solves this. 4. **Are you integrating into an existing native app?** If yes, bare React Native is probably better.

For 90% of new mobile app projects in 2026, Expo is the right starting point. You can always add complexity later. You can't easily simplify a bare React Native project after the fact.

Want to see how we wire up Expo with Supabase and TypeScript for production apps? Check out our [tech stack breakdown](/tech/expo) or explore the [full build pipeline](/how-it-works).

Ready to build?

Score your first idea free. See the pipeline in action.