Skip to main content

Expo vs React Native CLI

Start on Expo. Leave only when you can name the reason.

Choose Expo for a new React Native app. It handles builds, signing, native configuration, and over-the-air updates, and you can still write custom native code. Choose the React Native Community CLI when you are adding React Native to an existing native app or your team wants to own every native file by hand. Our three React Native apps all run on Expo.

Updated · Acasa Labs

At a glance

Expo and React Native CLI, side by side.

What it isExpoA framework and toolchain on top of React NativeReact Native CLIThe community command line tool for a bare React Native project
Native foldersExpoGenerated from config by prebuild, usually not committedReact Native CLICommitted and edited by hand
Native configurationExpoConfig plugins change Info.plist, manifests, and Gradle for youReact Native CLIYou edit Xcode and Gradle projects directly
Custom native codeExpoYes, through Expo Modules or any native libraryReact Native CLIYes, directly in the native projects
BuildsExpoLocally with npx expo run, or in the cloud with EAS BuildReact Native CLILocally with Xcode and Gradle, or your own CI
UpgradesExpoSDK releases bundle tested library versionsReact Native CLIUpgrade Helper diffs applied to native files by hand
Over-the-air updatesExpoEAS Update, or a self-hosted update serverReact Native CLIAdd a third-party or self-hosted solution
RoutingExpoExpo Router, file-based, with deep linksReact Native CLIYour choice, usually React Navigation
CostExpoOpen source; EAS cloud services have a free tier and paid plansReact Native CLIOpen source; you pay for your own CI and build machines

01

This is no longer the choice it was

A few years ago, Expo meant a managed sandbox. You could not add arbitrary native code, and serious apps "ejected" to bare React Native sooner or later. That is out of date. Expo apps today can include any native library and any custom Swift or Kotlin code, and the React Native documentation now recommends starting new apps with a framework, naming Expo.

The real difference is who manages the native projects. With Expo's Continuous Native Generation, the ios and android folders are generated from your app config and config plugins whenever you need them. With a bare project from the React Native Community CLI, those folders are source code you own and edit by hand.

02

When Expo is the better choice

Pick Expo for almost every new app. Prebuild and config plugins mean native settings live in a few lines of config instead of scattered across Xcode and Gradle files, which makes upgrades far less painful: you bump the SDK and regenerate, rather than merging diffs into native projects.

Pick it when you want over-the-air updates. EAS Update ships JavaScript fixes to users without a store release, within the app store rules, and you can self-host an update server if you would rather not use Expo's service.

And pick it when the team is small. Expo Router, development builds, the SDK's native modules, and EAS Build and Submit remove a lot of toolchain work, so the hours go into the app.

03

When the React Native CLI is the better choice

Pick a bare React Native project when you are adding React Native screens into an existing native iOS or Android app, and the native projects are already the source of truth. Expo has brownfield support too, but in an established native codebase many teams prefer to integrate React Native directly.

Pick it when your team has strong native engineers who want full, direct control of the Xcode and Gradle projects and are happy to own upgrades by hand.

And pick it when a library you depend on needs native project changes that no config plugin covers and you would rather not write one. That case is rarer every year, but it exists.

04

Two myths worth clearing up

"Expo means paying for EAS." It does not. Expo itself is open source, and you can build locally with npx expo run or in your own CI. EAS Build, Submit, and Update are hosted services with a free tier and paid plans, and they are worth it for many teams, but they are optional.

"Expo apps cannot use native code." They can. Expo Modules gives you a Swift and Kotlin API for writing your own native modules, and community native libraries work in development builds. Expo Go, the sandbox app, is only for quick prototypes and is not how production Expo apps run.

From production

Every React Native app we ship runs on Expo.

  • Three apps from one monorepo

    GymFast

    GymFast's staff, member, and trainer apps are Expo apps in a Turborepo monorepo, with RevenueCat for subscriptions. An in-progress workout is saved on the device, so a dropped connection in the gym does not lose a session.

  • Subscriptions in agreement across platforms

    NoteTube

    NoteTube's Expo app for iOS and Android bills through RevenueCat, the web through Stripe, and a scheduled job reconciles subscriptions between them. The app never holds a model key.

  • A companion studio app

    Kraftr

    Kraftr's Expo app for iOS and Android gives brands the same studio as the web, on one Next.js and Postgres backend.

How we choose

The four questions we ask before choosing

A new app, a small team, or a need for fast fixes points to Expo. React Native inside an established native app, or a team that wants the native projects by hand, points to a bare CLI project.

  1. 01Is this a new app, or React Native inside an existing native app?
  2. 02Does any dependency need native changes no config plugin can make?
  3. 03Who on the team will own native upgrades, and how often?
  4. 04Do you need over-the-air updates for fixes between store releases?

Questions

Expo vs React Native CLI, asked often.

Can we add custom native code to an Expo app?

Yes. Write it with Expo Modules in Swift and Kotlin, or use any community native library in a development build. Native project changes go through config plugins.

Do we have to pay for Expo?

No. Expo is open source and you can build locally or in your own CI. EAS Build, Submit, and Update are optional hosted services with a free tier and paid plans.

Can we move our bare React Native app to Expo?

Usually, yes. You install the expo package, move native settings into config plugins, and adopt prebuild when you are ready. We do it in steps so the app keeps shipping.

Have you shipped bare React Native CLI apps?

Not on our work page. GymFast, NoteTube, and Kraftr all run on Expo. We can work in a bare project, but our production experience is with Expo.

Is Expo Go what users install?

No. Expo Go is a sandbox for trying things quickly. Production apps are your own builds, with your app's name, icon, and native code, published to the stores.

Expo vs React Native CLI

Starting an app, or stuck on an old setup?

Tell us what the app does and how it is built today. We will tell you what we would keep and what we would change.

Ask which one fits

No pitch deck. You own the code from day one.

contact@acasalabs.com