Skip to main content


VSCode plugin 'Expo Tools':

app.json / app.config.js / app.config.ts

Configuration with app.json / app.config.js:



Info.plist can also be modified with a config plugin:


"expo": {
"ios": {
"infoPlist": {
"LSApplicationQueriesSchemes": ["comgooglemaps"],
"NSCameraUsageDescription": "This app uses the camera to scan barcodes on event tickets.",
"CFBundleAllowMixedLocalizations": true,
"ITSAppUsesNonExemptEncryption": false


New local CLI for SDK >= 46:

Old, deprecated, global CLI for SDK < 46:

Local CLI (introduced in SDK 46)

SDK 46 (released August 2022) removes the global npm install expo-cli.

The New Expo CLI (2022-08) -

  • A new “Local Expo CLI” replaces the “Global Expo CLI”
  • In the new Local Expo CLI, expo eject is no longer available, it’s been fully replaced by npx expo prebuild

Beta: Local Expo CLI (2022-04) -

Use expo install instead of yarn add/npm install because it picks the library versions compatible with the Expo SDK


Prefer expo install over npm install to add Expo SDK packages This will ensure that you get a version of the package that is compatible with the SDK version in your app. If you use npm install directly instead, you may end up with a newer version of the package that isn't supported in Expo Go yet.

This is also explained at

Create app

expo init <appname> --yarn
expo init <appname> -t expo-template-blank-typescript
expo init --template bare-minimum # warning: does not add react-navigation!

See expo init options at

Note that option --name is deprecated, if you use it says "Use expo init [name] instead of --name [name]".

Available templates:

Use TypeScript:

Validate package versions compatibility and install compatible versions

npx expo install --check # Check which installed packages need to be updated
npx expo install --fix # Automatically update any invalid package versions

You can check/fix specific packages, eg npx expo install expo-camera --check.

Eg doing npx expo install --check will output:

Some dependencies are incompatible with the installed expo version:
@react-native-community/slider@4.4.3 - expected version: 4.4.2
Your project may not work correctly until you install the correct versions of the packages.
Install individual packages by running npx expo install @react-native-community/slider@4.4.2
✔ Fix dependencies? (Y/n)

Shift+i allows you to choose in which simulator to run the app on


Expo Dev Client

Replaces Expo Go, which contains a fixed collection of native modules and does not allow custom native code.

It’s a React Native library that gives you the same experience as Expo Go, but with your own custom runtime. source

Expo Go app is a standard client containing a preset collection of modules. As your project moves toward release, you may find that you need to customize your project, either to reduce your bundle size, to use a module offered by developers in the React Native community, or even to add your own custom native code.

Development builds of your app are Debug builds containing the expo-dev-client package.

(managed workflow) If you add or change the version of any modules in your project that includes native code or make most changes to your app.json, you’ll need to generate a new custom client to be able to run your app.

More information:

expo-dev-client setup


You need to have "developmentClient": true eas.json:

"build": {
"development": {
"developmentClient": true,
"distribution": "internal"

This creates a 'Development build', a Debug build of your project that includes the expo-dev-client. See and

To install run expo install expo-dev-client, then npx pod-install.

To create a development build do:

eas build -p ios --profile development
eas build -p android --profile development

After the build is created, install it on your device. Afterwards, to run the app do expo start --dev-client and click 'i' or 'a', or scan the QR code.

Now you won't have to wait for the native build process again until you change the underlying native code that powers your app.

In addition to expo eject, now there is also expo prebuild

See the 2 images in

Now to get our managed project into a state where we can build it on EAS Build, we can repurpose the “eject” command to generate and configure the native iOS and Android projects based on the JavaScript app. We call this new command “prebuild”.

Info about prebuild:

you might need to use a library that doesn't have a config plugin yet, or maybe you need to write some custom native code yourself. For these cases you'll have to manually modify the ios and android folders, doing this means you'll no longer be able to safely rerun expo prebuild.

Eject moves from manged to bare, and it's run once ever.

expo prebuild is very similar to expo eject, the core difference being that eject is intended to be run once, and prebuild can be used multiple times. The eject command assumes that your ios and android folders are modified by hand (bare workflow) and will warn you if they might be overwritten, whereas the prebuild command should only be used when your ios and android folders are completely generated and can be regenerated any time (kinda like the node_modules folder).

More info about prebuild in 'Adding custom native code':


Expo Application Services. A cloud build service capable of building projects with arbitrary native code.

Install the CLI: npm install -g eas-cli (npm is recommended instead of yarn)

Login: eas login

Check the current user: eas whoami

eas.json properties

EAS Build

Replaces expo build:ios and expo build:android (classic build, which uses a 'shell app').


expo build’s Final Year: (part 1) (part 2)

eas build:configure -> Generates eas.json. Learn more at

To install an app to an iPhone, first register the device UDID at To register any iOS devices you would like to develop on to your ad hoc provisioning profile use eas device:create.

Android build:

iOS build:

Android and iOS build: eas build -p all

Build locally (eg to generate an aab file to upload to Google Play):

Download a simulator build from EAS servers and run it directly on your emulator/simulator in a snap:


Signing Android

From the Expo build process's perspective, there is no difference whether an app is signed with an upload certificate or an app signing key. Either way, eas build will generate an APK or AAB signed with the keystore currently associated with your application. If you want to generate an upload keystore manually, you can do that the same way you created your original keystore.

EAS Submit

App store submissions.

The very first Android build must be uploaded manually to Google Play - see This is not required on App Store (iOS).

After building with eas build we can do eas submit -p ios to publish to the App Store. There is also the option --auto-submit, so we can do both build and submit, eg: eas build -p ios --profile production --auto-submit.

To publish to Google Play we need the service account key, which gives API access: Note that the API access menu item appears at the main Google Play console page, not the app-specific page.

EAS Update

Deliver small updates of the non-native parts of your app (JS, styling, image assets...) to your users in between build and submit cycles

EAS Update also doubles as a workflow efficiency tool, streamlining feedback loops by allowing teams to share previews of their projects during PR review. We love being able to push to GitHub, trigger a GitHub action to publish an update, then see it immediately inside of a development build.

Using Expo OTA Updates in your React Native app - Eric Samelson at @ReactEurope 2020:

Run the production app

See There is also a switch in http://localhost:19002/.

expo start --no-dev --minify
# or if we've done a prebuild
expo start --no-dev --minify --dev-client

Environment variables and configuration

Configuration with app.json / app.config.js:

Environment variables in Expo:

Environment variables and secrets:

Also see

According to expo start does not pick variables defined in eas.json:

When you define environment variables on build profiles in eas.json, they will not be available for local development when you run expo start (and expo publish).

SDK Versions


Unimodules -> Expo modules

Using Expo modules in a standard React Native app (created with npx react-native init):

For module authors:

Expo (Native) Modules API


With plugin: