Expo

Get Started
Guides

Expo CLI

Expo CLI is a command line app that is the main interface between a developer and Expo tools. You'll use it for a variety of tasks, such as:
  • Creating new projects
  • Developing your app: running the project server, viewing logs, opening your app in a simulator
  • Publishing your app JavaScript and other assets and managing releasing them over the air
  • Building binaries (apk and ipa files) to be uploaded to the App Store and Play Store
  • Managing Apple Credentials and Google Keystores
You may use the CLI in your terminal or use the web based interface (it opens automatically by default, or you can press d from the CLI to open it on demand). The web interface enables you to use some of the most often used features from a quick-to-use graphical interface. We’ve only scratched the surface of what expo-cli can do so far. Be sure to check out all the possible commands below!

Installation

npm install -g expo-cli

Run expo --version to determine what version you are currently working with.

The commands listed below are derived from the latest version of Expo CLI. You can view the list of commands available with your version in your terminal using expo --help. To learn more about a specific command and its options use expo [command] --help.
# Usage: expo [command] [options]

Login to an Expo account
Alias: expo signin
OptionDescription
-u, --username [string]Username
-p, --password [string]Password
--otp [string]One-time password from your 2FA device

Logout of an Expo account
This command does not take any options.

Sign up for a new Expo account
This command does not take any options.

Return the currently authenticated account
Alias: expo w
This command does not take any options.

Export the static files of the app for hosting it on a web server
OptionDescription
-p, --public-url [url]The public url that will host the static files. (Required)
--output-dir [dir]The directory to export the static files to. Default directory is dist
-a, --asset-url [url]The absolute or relative url that will host the asset files. Default is './assets', which will be resolved against the public-url.
-d, --dump-assetmapDump the asset map for further processing.
--devConfigure static files for developing locally using a non-https server
-f, --forceOverwrite files in output directory without prompting for confirmation
-s, --dump-sourcemapDump the source map for debugging the JS bundle.
-q, --quietSuppress verbose output.
-t, --target [env]Target environment for which this export is intended. Options are managed or bare.
--merge-src-dir [dir]A repeatable source dir to merge in.
--merge-src-url [url]A repeatable source tar.gz file URL to merge in.
--max-workers [num]Maximum number of tasks to allow Metro to spawn.
--config [file]Specify a path to app.json or app.config.js

Create a new Expo project
Alias: expo i
OptionDescription
-t, --template [name]Specify which template to use. Valid options are "blank", "tabs", "bare-minimum" or a package on npm (e.g. "expo-template-bare-typescript") that includes an Expo project template.
--npmUse npm to install dependencies. (default when Yarn is not installed)
--yarnUse Yarn to install dependencies. (default when Yarn is installed)
--no-installSkip installing npm packages or CocoaPods.
--name [name]The name of your app visible on the home screen.
--yesUse default options. Same as "expo init . --template blank

Install a unimodule or other package to a project
Alias: expo add
OptionDescription
--npmUse npm to install dependencies. (default when package-lock.json exists)
--yarnUse Yarn to install dependencies. (default when yarn.lock exists)

Deploy a project to Expo hosting
Alias: expo p
OptionDescription
-q, --quietSuppress verbose output from the Metro bundler.
-s, --send-to [dest]A phone number or email address to send a link to
-c, --clearClear the Metro bundler cache
-t, --target [env]Target environment for which this publish is intended. Options are managed or bare.
--max-workers [num]Maximum number of tasks to allow Metro to spawn.
--release-channel [release channel]The release channel to publish to. Default is 'default'.
--config [file]Specify a path to app.json or app.config.js

Share the project's URL to an email address
OptionDescription
-s, --send-to [dest]Email address to send the URL to
--dev-clientExperimental: Starts the bundler for use with the expo-development-client
--scheme [scheme]Custom URI protocol to use with a dev client
-a, --androidOpens your app in Expo client on a connected Android device
-i, --iosOpens your app in Expo client in a currently running iOS simulator on your computer
-w, --webOpens your app in a web browser
-m, --host [mode]lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks
--tunnelSame as --host tunnel
--lanSame as --host lan
--localhostSame as --host localhost
--config [file]Specify a path to app.json or app.config.js

Start a local dev server for the app
Alias: expo r
OptionDescription
-s, --send-to [dest]An email address to send a link to
-c, --clearClear the Metro bundler cache
--max-workers [num]Maximum number of tasks to allow Metro to spawn.
--devTurn development mode on
--no-devTurn development mode off
--minifyMinify code
--no-minifyDo not minify code
--httpsTo start webpack with https protocol
--no-httpsTo start webpack with http protocol
--dev-clientExperimental: Starts the bundler for use with the expo-development-client
--scheme [scheme]Custom URI protocol to use with a dev client
-a, --androidOpens your app in Expo client on a connected Android device
-i, --iosOpens your app in Expo client in a currently running iOS simulator on your computer
-w, --webOpens your app in a web browser
-m, --host [mode]lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks
--tunnelSame as --host tunnel
--lanSame as --host lan
--localhostSame as --host localhost
--offlineAllows this command to run while offline
--config [file]Specify a path to app.json or app.config.js

Start a Webpack dev server for the web app
Alias: expo web
OptionDescription
--devTurn development mode on
--no-devTurn development mode off
--minifyMinify code
--no-minifyDo not minify code
--httpsTo start webpack with https protocol
--no-httpsTo start webpack with http protocol
--dev-clientExperimental: Starts the bundler for use with the expo-development-client
--scheme [scheme]Custom URI protocol to use with a dev client
-a, --androidOpens your app in Expo client on a connected Android device
-i, --iosOpens your app in Expo client in a currently running iOS simulator on your computer
-w, --webOpens your app in a web browser
-m, --host [mode]lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks
--tunnelSame as --host tunnel
--lanSame as --host lan
--localhostSame as --host localhost
--offlineAllows this command to run while offline
--config [file]Specify a path to app.json or app.config.js

Install the Expo client for iOS on the simulator
OptionDescription
--latestInstall the latest version of Expo client, ignoring the current project version.

Install the Expo client for Android on a connected device or emulator
OptionDescription
--latestInstall the latest version of Expo client, ignore the current project version.

Log environment info to the console
This command does not take any options.

Diagnose issues with the project
OptionDescription
--config [file]Specify a path to app.json or app.config.js

Upgrade the project packages and config for the given SDK version
Alias: expo update
OptionDescription
--npmUse npm to install dependencies. (default when package-lock.json exists)
--yarnUse Yarn to install dependencies. (default when yarn.lock exists)

Log the project's releases
Alias: expo ph
OptionDescription
-c, --release-channel [channel-name]Filter by release channel. If this flag is not included, the most recent publications will be shown.
--count [number-of-logs]Number of logs to view, maximum 100, default 5.
`-p, --platform [iosandroid]`
-s, --sdk-version [version]Filter by SDK version e.g. 35.0.0
-r, --rawProduce some raw output.
--config [file]Specify a path to app.json or app.config.js

Log details of a published release
Alias: expo pd
OptionDescription
--publish-id [publish-id]Publication id. (Required)
-r, --rawProduce some raw output.
--config [file]Specify a path to app.json or app.config.js

Specify the channel to serve a published release
Alias: expo ps
OptionDescription
-c, --release-channel [channel-name]The channel to set the published release. (Required)
-p, --publish-id [publish-id]The id of the published release to serve from the channel. (Required)
--config [file]Specify a path to app.json or app.config.js

Undo an update to a channel
Alias: expo pr
OptionDescription
--channel-id [channel-id]This flag is deprecated.
-c, --release-channel [channel-name]The channel to rollback from. (Required)
-s, --sdk-version [version]The sdk version to rollback. (Required)
`-p, --platform [iosandroid]`
--config [file]Specify a path to app.json or app.config.js

Build and sign a standalone IPA for the Apple App Store
Alias: expo bi
OptionDescription
-c, --clear-credentialsClear all credentials stored on Expo servers.
--clear-dist-certRemove Distribution Certificate stored on Expo servers.
--clear-push-keyRemove Push Notifications Key stored on Expo servers.
--clear-push-certRemove Push Notifications Certificate stored on Expo servers. Use of Push Notifications Certificates is deprecated.
--clear-provisioning-profileRemove Provisioning Profile stored on Expo servers.
-r --revoke-credentialsRevoke credentials on developer.apple.com, select appropriate using --clear-* options.
--apple-id [login]Apple ID username (please also set the Apple ID password as EXPO_APPLE_PASSWORD environment variable).
-t --type [build]Type of build: [archive
--release-channel [channel-name]Pull from specified release channel.
--no-publishDisable automatic publishing before building.
--no-waitExit immediately after scheduling build.
--team-id [apple-teamId]Apple Team ID.
--dist-p12-path [dist.p12]Path to your Distribution Certificate P12 (set password as EXPO_IOS_DIST_P12_PASSWORD environment variable).
--push-id [push-id]Push Key ID (ex: 123AB4C56D).
--push-p8-path [push.p8]Path to your Push Key .p8 file.
--provisioning-profile-path [.mobileprovision]Path to your Provisioning Profile.
--public-url [url]The URL of an externally hosted manifest (for self-hosted apps).
--skip-credentials-checkSkip checking credentials.
--skip-workflow-checkSkip warning about build service bare workflow limitations.
--config [file]Specify a path to app.json or app.config.js

Build and sign a standalone APK or App Bundle for the Google Play Store
Alias: expo ba
OptionDescription
-c, --clear-credentialsClear stored credentials.
--release-channel [channel-name]Pull from specified release channel.
--no-publishDisable automatic publishing before building.
--no-waitExit immediately after triggering build.
--keystore-path [app.jks]Path to your Keystore.
--keystore-alias [alias]Keystore Alias
--generate-keystore[deprecated] Generate Keystore if one does not exist
--public-url [url]The URL of an externally hosted manifest (for self-hosted apps)
--skip-workflow-checkSkip warning about build service bare workflow limitations.
-t --type [build]Type of build: [app-bundle
--config [file]Specify a path to app.json or app.config.js

Build the web app for production
OptionDescription
-c, --clearClear all cached build files and assets.
--no-pwaPrevent webpack from generating the manifest.json and injecting meta into the index.html head.
-d, --devTurns dev flag on before bundling
--config [file]Specify a path to app.json or app.config.js

Get the status of the latest build for the project
Alias: expo bs
OptionDescription
--public-url [url]The URL of an externally hosted manifest (for self-hosted apps).
--config [file]Specify a path to app.json or app.config.js

Manage your credentials
OptionDescription
-p --platform [platform]Platform: [android
--config [file]Specify a path to app.json or app.config.js

Download the project's iOS standalone app signing credentials
OptionDescription
--config [file]Specify a path to app.json or app.config.js

Download the project's Android keystore
OptionDescription
--config [file]Specify a path to app.json or app.config.js

Compute and log the project's Android key hashes
OptionDescription
--config [file]Specify a path to app.json or app.config.js

Download the project's Android keystore
OptionDescription
--config [file]Specify a path to app.json or app.config.js

Upload an FCM key for Android push notifications
OptionDescription
--api-key [api-key]Server API key for FCM.
--config [file]Specify a path to app.json or app.config.js

Log the value currently in use for FCM notifications for this project
OptionDescription
--config [file]Specify a path to app.json or app.config.js

Delete a previously uploaded FCM credential
OptionDescription
--config [file]Specify a path to app.json or app.config.js

Log a URL for opening the project in the Expo client
Alias: expo u
OptionDescription
-w, --webReturn the URL of the web app
--dev-clientExperimental: Starts the bundler for use with the expo-development-client
--scheme [scheme]Custom URI protocol to use with a dev client
-a, --androidOpens your app in Expo client on a connected Android device
-i, --iosOpens your app in Expo client in a currently running iOS simulator on your computer
-w, --webOpens your app in a web browser
-m, --host [mode]lan (default), tunnel, localhost. Type of host to use. "tunnel" allows you to view your link on other networks
--tunnelSame as --host tunnel
--lanSame as --host lan
--localhostSame as --host localhost
--offlineAllows this command to run while offline
--config [file]Specify a path to app.json or app.config.js

Log the download URL for the standalone iOS binary
OptionDescription
--public-url [url]The URL of an externally hosted manifest (for self-hosted apps)
--config [file]Specify a path to app.json or app.config.js

Log the download URL for the standalone Android binary
OptionDescription
--public-url [url]The URL of an externally hosted manifest (for self-hosted apps)
--config [file]Specify a path to app.json or app.config.js

List all webhooks for a project
OptionDescription
--config [file]Specify a path to app.json or app.config.js

Add a webhook to a project
OptionDescription
--url [url]URL to request. (Required)
--event [event-type]Event type that triggers the webhook. [build] (Required)
--secret [secret]Secret used to create a hash signature of the request payload, provided in the 'Expo-Signature' header.
--config [file]Specify a path to app.json or app.config.js

Delete a webhook
OptionDescription
--id [id]ID of the webhook to remove.
--config [file]Specify a path to app.json or app.config.js

Update an existing webhook
OptionDescription
--id [id]ID of the webhook to update.
--url [url]URL the webhook will request.
--event [event-type]Event type that triggers the webhook. [build]
--secret [secret]Secret used to create a hash signature of the request payload, provided in the 'Expo-Signature' header.
--config [file]Specify a path to app.json or app.config.js

Upload an Android binary to the Google Play Store
Alias: expo ua
OptionDescription
--latestupload the latest build
--id [id]id of the build to upload
--path [path]path to the .apk/.aab file
--url [url]app archive url
--key [key]path to the JSON key used to authenticate with Google Play
--android-package [android-package]Android package name (using expo.android.package from app.json by default)
--type [archive-type]archive type: apk, aab
--track [track]the track of the application to use, choose from: production, beta, alpha, internal, rollout
--release-status [release-status]release status (used when uploading new apks/aabs), choose from: completed, draft, halted, inProgress
--use-submission-serviceExperimental: Use Submission Service for uploading your app. The upload process will happen on Expo servers.
--verboseAlways print logs from Submission Service
--config [file]Specify a path to app.json or app.config.js

macOS only: Upload an iOS binary to Apple. An alternative to Transporter.app
Alias: expo ui
OptionDescription
--latestupload the latest build (default)
--id [id]id of the build to upload
--path [path]path to the .ipa file
--url [url]app archive url
--apple-id [apple-id]your Apple ID username (you can also set EXPO_APPLE_ID env variable)
--itc-team-id [itc-team-id]App Store Connect Team ID - this option is deprecated, the proper ID is resolved automatically
--apple-id-password [apple-id-password]your Apple ID password (you can also set EXPO_APPLE_PASSWORD env variable)
--app-name [app-name]the name of your app as it will appear on the App Store, this can't be longer than 30 characters (default: expo.name from app.json)
--company-name [company-name]the name of your company, needed only for the first upload of any app to App Store
--sku [sku]a unique ID for your app that is not visible on the App Store, will be generated unless provided
--language [language]primary language (e.g. English, German; run expo upload:ios --help to see the list of available languages)
--public-url [url]The URL of an externally hosted manifest (for self-hosted apps)
--config [file]Specify a path to app.json or app.config.js

Eject the default web files for customization
OptionDescription
-f, --forceAllows replacing existing files
--offlineAllows this command to run while offline

Create native iOS and Android project files. Learn more: https://docs.expo.io/bare/customizing/
OptionDescription
--forceSkip legacy eject warnings.
--no-installSkip installing npm packages and CocoaPods.
--npmUse npm to install dependencies. (default when Yarn is not installed)
--config [file]Specify a path to app.json or app.config.js

Experimental: build a custom version of the Expo client for iOS using your own Apple credentials
OptionDescription
--apple-id [login]Apple ID username (please also set the Apple ID password as EXPO_APPLE_PASSWORD environment variable).
--config [file]Specify a path to app.json or app.config.js

These options will work with any command, eg: expo build:ios --help will provide help information relevant to the expo build:ios command.
OptionDescription
--help, -hReveals usage information.
-o, --output [format]The output format [pretty or raw]. The default is pretty.
--non-interactiveFails the command if an interactive prompt would be required to continue. Enabled by default if stdin is not a TTY.