Shipnative
ShipnativeShipnative
Sign in
ExpoJuly 2026 · 8 min read

Expo Go vs Development Build

Almost every Expo project starts in Expo Go, and almost every serious one leaves. The confusing part is that nothing announces the moment you have outgrown it — you install a library, the app crashes on launch with an error about a missing native module, and you spend an hour assuming you wrote a bug. You did not. You just asked a fixed binary to run code it was never compiled with. Here is the actual difference, the specific triggers that force the switch, and the five commands that make it.

What each one actually is

Expo Go is one app, published by Expo, that you install from the App Store or Play Store. It contains a React Native runtime plus a fixed, precompiled set of Expo SDK native modules. When you scan a QR code, it downloads your JavaScript bundle and runs it against those modules. Your project never gets compiled — which is exactly why it starts in seconds, and exactly why it cannot run native code Expo did not anticipate.

A development build is the same idea with the binary swapped for yours. You add expo-dev-client, build once, and install the result on your device. It still connects to Metro, still hot-reloads, still has a dev menu — but the native side is compiled from your project, so every dependency and config plugin you declared is really in there.

The mental model that helps: Expo Go is someone else’s app running your JavaScript. A development build is your app, in development mode.

Side by side

CapabilityExpo GoDevelopment build
Time to first runSeconds — scan a QR codeOne cloud or local build (5–20 min)
Hot reload✅✅ Identical
Expo SDK modules✅ The set Expo bundled✅ Any of them
Third-party native libraries❌✅
Config plugins that touch native files❌✅
Custom bundle ID / icon / splash on device❌ Shows as Expo Go✅ Your app
Remote push notifications (Android)❌ Removed in SDK 53✅
Native debugging in Xcode / Android Studio❌✅
Share with a non-technical tester⚠️ They install Expo Go first✅ Internal distribution link
Rebuild needed when JS changesNoNo
Rebuild needed when native deps changeN/AYes

The five triggers that end Expo Go

  1. A native dependency. Payments, health data, Bluetooth, maps with a vendor SDK, a native video player, most analytics SDKs. If the package ships iOS or Android source, Expo Go cannot load it.
  2. A config plugin. Anything that edits Info.plist, the Android manifest, entitlements, or build settings. Expo Go runs a binary that was compiled before your plugin existed.
  3. Android push notifications. Remote push in Expo Go on Android was removed in SDK 53. If notifications are core to your product, you need a development build from day one.
  4. Real testers. Handing a beta to someone who has to install Expo Go, make an account, and scan a code loses you most of the testers. Internal distribution of a development build is a link and an install.
  5. Anything identity-shaped. Custom bundle identifier, app icon, deep-link scheme, associated domains. In Expo Go the app on the home screen is Expo Go, so none of it is testable — including deep links.

Making the switch

It is a one-time cost of about twenty minutes, most of which is a build queue:

npx expo install expo-dev-client

# eas.json → add a development profile:
#   "development": {
#     "developmentClient": true,
#     "distribution": "internal"
#   }

npx eas build --profile development --platform ios
# or build locally, no EAS account needed:
npx expo run:ios

npx expo start   # opens in your dev build, not Expo Go

After that, day-to-day work is identical to Expo Go. You only rebuild when the native layer changes, which is rarer than people expect — adding a screen, changing state management, restyling everything, and rewriting your API layer are all pure JavaScript.

One habit worth adopting: rebuild the development client deliberately, right after adding a native dependency, rather than the next time something breaks. Half of “Expo is flaky” complaints are a stale dev client running new JavaScript.

So which should you use?

Use Expo Go for the first few days of a project, for learning, and for throwaway prototypes where the entire app is Expo SDK modules and JavaScript.

Use a development build for anything you intend to ship. If you already know the app will take payments or send notifications, skip Expo Go entirely — the twenty minutes you save is repaid with interest the first time you debug a phantom crash.

Skipping the setup entirely

If you would rather not hand-configure any of this, ShipNative generates a complete Expo project from a description, runs it live on your phone while you iterate, and exports the source with EAS configuration already in place — so the first time you touch eas.json is when you want to change something, not to get started.

Frequently Asked Questions

What is the difference between Expo Go and a development build?

Expo Go is a single prebuilt app from the App Store and Play Store that can run any JavaScript project using the native modules Expo compiled into it. A development build is that same developer experience, except the native binary is yours — built from your project, with your native dependencies and config plugins included.

When do I have to stop using Expo Go?

The moment you add a library with native code that Expo Go does not bundle, use a config plugin that changes native project files, need a custom app icon or bundle identifier on device, or need remote push notifications on Android. In practice most real apps hit one of these within a few weeks.

Is a development build the same as a production build?

No. A development build includes the dev client, so it still connects to Metro, hot-reloads, and shows the dev menu. A production build strips all of that. You develop against a development build and ship a production build.

Do I need a paid EAS plan for a development build?

No. You can run eas build with the free tier (queued cloud builds), or build locally with expo run:ios / expo run:android if you have Xcode and Android Studio installed. Paid tiers buy you build priority, not capability.

How often do I have to rebuild the development build?

Only when the native layer changes — adding a native dependency, changing a config plugin, bumping the SDK. JavaScript and React changes still hot-reload instantly. Teams routinely go weeks between rebuilds.

Can I still use Expo Go after switching?

Yes, they coexist, but do not develop against both. Once a native dependency is in the project, Expo Go will crash or silently no-op on that feature — and you will waste an afternoon debugging a bug that does not exist in your real app.

→

Expo vs React Native in 2026

The higher-level choice, if you are still deciding on a stack.

Read comparison →
→

Expo EAS Submission Checklist

What to verify before your first production build goes to review.

See checklist →

Ship a real React Native app today

Describe, preview, and export Expo code — free to start.

Build with ShipNative →
ShipNative logoShipnative

Build mobile apps with AI. Describe, preview, and ship to iOS & Android in minutes.

Features

Text to App AIApp Generator from ScreenshotPRD to Mobile App

Tools

All free toolsApp Cost CalculatorApp Name GeneratorApp Store Keyword ToolReact Native Components

Blog

All blog postsHow to Build an App Without CodingBest AI Tools for Real Mobile AppsExpo EAS App Store ChecklistLovable, Cursor & v0 for MobileBest AI App Builders in 2026React Native AI App Builder Guide

Legal

FAQTerms of ServicePrivacy Policy

© 2026 ShipNative. All rights reserved.