# Expo Application Services (EAS) Documentation Expo Application Services (EAS) are deeply integrated cloud services for Expo and React Native apps, from the team behind Expo. --- modificationDate: February 25, 2026 title: Expo Application Services description: Learn about Expo Application Services (EAS) for Expo and React Native apps. --- # Expo Application Services Learn about Expo Application Services (EAS) for Expo and React Native apps. Expo Application Services (EAS) are deeply integrated cloud services for Expo and React Native apps, from the team behind Expo. Read the full pitch at [expo.dev/eas](https://expo.dev/eas), or follow the links below to learn how to get started. [EAS Workflows](/eas/workflows/introduction) — Automate your development and release workflows with CI/CD jobs. [EAS Build](/build/introduction) — Compile and sign Android/iOS apps with custom native code in the cloud. [EAS Submit](/submit/introduction) — Upload your app to the Google Play Store or Apple App Store from the cloud with one CLI command. [EAS Hosting](/eas/hosting/introduction) — Deploy Expo Router and React Native web apps and API routes. [EAS Update](/eas-update/introduction) — Address small bugs and push quick fixes directly to end users. [EAS Metadata (in preview)](/eas/metadata) — Upload all app store information required to get your app published. [EAS Insights (in preview)](/eas-insights/introduction) — View analytics about a project's performance, usage, and reach. --- --- modificationDate: February 25, 2026 title: Configuration with eas.json description: Learn about available properties for EAS Build and EAS Submit to configure and override their default behavior from within your project. --- # Configuration with eas.json Learn about available properties for EAS Build and EAS Submit to configure and override their default behavior from within your project. **eas.json** is the configuration file for EAS CLI and services. You can find the complete reference of all available schema properties for [EAS Build](/build/introduction) and [EAS Submit](/submit/introduction) on this page. > To learn more about how a project using EAS services is configured with **eas.json**, see [Configure EAS Build with eas.json](/build/eas-json) and [Configure EAS Submit with eas.json](/submit/eas-json). ## EAS Build The following properties are available in the schema for the `build` key in **eas.json**. Example schema of multiple build profiles ```json { "build": { "base": { "node": "12.13.0", "yarn": "1.22.5", "env": { "EXAMPLE_ENV": "example value" }, "android": { "image": "default", "env": { "PLATFORM": "android" } }, "ios": { "image": "latest", "env": { "PLATFORM": "ios" } } }, "development": { "extends": "base", "developmentClient": true, "env": { "ENVIRONMENT": "development" }, "android": { "distribution": "internal", "withoutCredentials": true }, "ios": { "simulator": true } }, "staging": { "extends": "base", "env": { "ENVIRONMENT": "staging" }, "distribution": "internal", "android": { "buildType": "apk" } }, "production": { "extends": "base", "env": { "ENVIRONMENT": "production" } } } } ``` ### Common properties for native platforms | Property | Description | | --- | --- | | `withoutCredentials` | **(boolean)** - When set to `true`, EAS CLI won't require you to configure credentials when building the app. This comes in handy when using EAS Build [custom builds](/custom-builds/get-started). Defaults to `false`. | | `extends` | **(string)** - The name of the build profile that the current one should inherit values from. This value can't be specified per platform. | | `credentialsSource` | **(enum: local, remote)** - The source of credentials used to sign the application archive. - `local` - if you want to provide your own [**credentials.json**](/app-signing/local-credentials). - `remote` - if you want to use the credentials managed by EAS (default option). | | `releaseChannel` | **(string)** - **Deprecated**: Name of the release channel for the Classic Updates service, which is only supported in SDK 49 and lower. If you do not specify a channel, your binary will pull releases from the `default` channel. EAS Update uses the [channel](#channel) field, so you can remove [`releaseChannel`](#releasechannel) after [migrating to EAS Update](/eas-update/migrate-from-classic-updates). | | `channel` | **(string)** - The EAS Update channel where this build will look for updates. [Learn more](/eas-update/how-it-works). Standalone builds will check for and download updates matching platform, native runtime, and channel. This field has no effect when [`developmentClient`](#developmentclient) is set to `true`, as development builds can run updates from any channel. If you have not yet migrated from Classic Updates to EAS Update, then continue to use the [`releaseChannel`](#releasechannel) field instead. | | `distribution` | **(enum: store, internal)** - The method of distributing your app. - `internal` - with this option you'll be able to share your build URLs with anyone, and they will be able to install the builds to their devices straight from the Expo website. When using `internal`, make sure the build produces a **.apk** or **ipa** file. Otherwise, the shareable URL will be not work. See [internal distribution](/build/internal-distribution) for more information. - `store` - produces builds for store uploads, your build URLs won't be shareable. | | `developmentClient` | **(boolean)** - If set to `true` (defaults to `false`), this field will produce a [development build](/workflow/overview#development-builds). For the build to be successful, the project must have [`expo-dev-client`](/versions/latest/sdk/dev-client) installed and configured. **Note**: this field is for setting the `gradleCommand` to `:app:assembleDebug` for Android and `buildConfiguration` to `Debug` for iOS . If these fields are provided for the same build profile, will take precedence over `developmentClient`. | | `resourceClass` | **(enum: default, medium, large)** - The resource class that will be used to run this build. To see mapping for each platform, see [Android-specific resource class field](#resourceclass-1) and [iOS-specific resource class field](#resourceclass-2). The `large` resource class is not available on the free plan. | | `prebuildCommand` | **(string)** - Optional override of the [prebuild](/more/expo-cli#prebuild) command used by EAS. For example, you can specify `prebuild --template example-template` to use a custom template. **Note**: `--platform` and `--non-interactive` will be added automatically by the build engine, so you do not need to specify them manually. | | `buildArtifactPaths` | **(string[])** - List of paths (or patterns) where EAS Build is going to look for the build artifacts. Use `applicationArchivePath` for specifying the path for uploading the application archive. Build artifacts are uploaded even if the build fails. EAS Build uses [glob patterns](https://github.com/isaacs/node-glob#glob-primer) for pattern matching. | | `node` | **(string)** - Version of Node.js used for build. | | `corepack` | **(boolean)** - If set to `true`, [corepack](https://nodejs.org/api/corepack.html) will be enabled at the beginning of build process. Defaults to `false`. | | `yarn` | **(string)** - Version of Yarn used for build. | | `pnpm` | **(string)** - Version of pnpm used for build. | | `bun` | **(string)** - Version of Bun used for build. You can also use a specific version. Learn [how to configure the exact version in eas.json](/guides/using-bun#customize-bun-version-on-eas). | | `expoCli` | **(string)** - **Deprecated**: Version of [`expo-cli`](https://www.npmjs.com/package/expo-cli) used to [prebuild](/more/expo-cli#prebuild) your app. It only affects managed projects on Expo SDK 45 and lower. For newer SDKs, EAS Build will use the versioned [Expo CLI](/more/expo-cli). It is included with `expo` library. You can opt out of using the versioned Expo CLI by setting the `EXPO_USE_LOCAL_CLI=0` environment variable in the build profile. | | `env` | **(object)** - [Environment variables](/guides/environment-variables) that should be set during the build process. It should only be used for values that you would commit to your git repository and not for passwords or [secrets](/build-reference/variables). | | `autoIncrement` | **(boolean)** - Controls how EAS CLI bumps your application build version. Defaults to `false`. When enabled, for Android, bumps `expo.android.versionCode` (for example, `3`to `4`). For iOS, bumps the last component of `expo.ios.buildNumber` (for example, `1.2.3.39` to `1.2.3.40`). | | `cache` | **(object)** - Cache configuration. This feature is intended for caching values that require a lot of computation. For example, compilation results (both final binaries and any intermediate files). However, it doesn't work well for **node_modules** because the cache is not local to the machine, so the download speed is similar to downloading from the npm registry. | | `disabled` | **(boolean)** - Disables caching. Defaults to `false`. | | `key` | **(string)** - Cache key. You can invalidate the cache by changing this value. | | `paths` | **(array)** - List of the paths that will be saved after a successful build and restored at the beginning of the next one. Both absolute and relative paths are supported, where relative paths are resolved from the directory with **eas.json**. | | `config` | **(string)** - Custom workflow file name that will be used to run this build. You can also specify this property on platform level for platform-specific workflows. [Learn more](/custom-builds/get-started). Example: `"config": "production.yml"` will use workflow from `.eas/build/production.yml`. | | `environment` | **(enum: development, preview, production)** - The environment used to apply environment variables for the build process. [Learn more](/eas/environment-variables). | ### Android-specific options | Property | Description | | --- | --- | | `withoutCredentials` | **(boolean)** - When set to `true`, EAS CLI won't require you to configure credentials when building the app. This comes in handy when you want to build debug binaries and the debug keystore is checked in to the repository. Defaults to `false`. | | `image` | **(string)** - [Image with build environment](/build-reference/infrastructure). | | `resourceClass` | **(enum: default, medium, large)** - The Android-specific resource class that will be used to run this build. Defaults to `medium`. For information on available build resources for each resource class, see [Android build server configurations](/build-reference/infrastructure#android-build-server-configurations). The `large` resource class is not available on the free plan. | | `ndk` | **(string)** - Version of Android NDK. | | `autoIncrement` | **(boolean | "version" | "versionCode")** - Controls how EAS CLI bumps your application build version. Defaults to `false`. Allowed values: - `"version"` - bumps the patch of `expo.version` (for example, `1.2.3` to `1.2.4`). - `"versionCode"` (or `true`) - bumps `expo.android.versionCode` (for example, `3` to `4`). - `false` - versions won't be bumped automatically (default). . Based on the value of [`cli.appVersionSource` in **eas.json**](/build-reference/app-versions), the values will be updated locally in your project or on EAS servers. | | `buildType` | **(enum: app-bundle, apk)** - Type of the artifact you want to build. It controls which Gradle task will be used to build the project. It can be overridden by `gradleCommand` or `developmentClient: true` option. - `app-bundle` - `:app:bundleRelease` (creates **.aab** artifact) - `apk` - `:app:assembleRelease` (creates **.apk** artifact) | | `gradleCommand` | **(string)** - Gradle task that will be used to build your project. For example, `:app:assembleDebug` to build a debug binary. It's not recommended unless you need to run a task that `buildType` does not support, it takes priority over [`buildType`](#buildtype) and [`developmentClient`](#developmentclient). | | `applicationArchivePath` | **(string)** - Path (or pattern) where EAS Build is going to look for the application archive. EAS Build uses [glob patterns](https://github.com/isaacs/node-glob#glob-primer) for pattern matching. The default value is `android/app/build/outputs/**/*.{apk,aab}`. | | `config` | **(string)** - Custom workflow file name that will be used to run this Android build. You can also specify this property on profile level for platform-agnostic workflows. [Learn more](/custom-builds/get-started). Example: `"config": "production-android.yml"` will use workflow from `.eas/build/production-android.yml`. | ### iOS-specific options | Property | Description | | --- | --- | | `withoutCredentials` | **(boolean)** - When set to `true`, EAS CLI won't require you to configure credentials when building the app. This comes in handy when using EAS Build [custom builds](/custom-builds/get-started). Defaults to `false`. | | `simulator` | **(boolean)** - If set to true, creates build for iOS Simulator. Defaults to `false`. | | `enterpriseProvisioning` | **(enum: universal, adhoc)** - Provisioning method used for `"distribution": "internal"` when you have an Apple account with Apple Developer Enterprise Program membership. You can choose if you want to use `adhoc` or `universal` provisioning. The latter is recommended as it does not require you to register each individual device. If you don't provide this option and you still authenticate with an enterprise team, you'll be prompted which provisioning method to use. | | `autoIncrement` | **(boolean | "version" | "buildNumber")** - Controls how EAS CLI bumps your application build version. Defaults to `false`. Allowed values: - `"version"` - bumps the patch of `expo.version` (for example, `1.2.3` to `1.2.4`). - `"buildNumber"` (or `true`) - bumps the last component of `expo.ios.buildNumber` (for example, `1.2.3.39` to `1.2.3.40`). - `false` - versions won't be bumped automatically (default) . Based on the value of [`cli.appVersionSource` in **eas.json**](/build-reference/app-versions), the values will be updated locally in your project or on EAS servers. | | `image` | **(string)** - [Image with build environment](/build-reference/infrastructure). | | `resourceClass` | **(enum: default, medium, large)** - The iOS-specific resource class that will be used to run this build. Defaults to `medium`. For information on available build resources for each resource class, see [iOS build server configurations](/build-reference/infrastructure#ios-build-server-configurations). The `large` resource class is not available on the free plan. | | `bundler` | **(string)** - Version of [bundler](https://bundler.io/). | | `fastlane` | **(string)** - Version of fastlane. | | `cocoapods` | **(string)** - Version of CocoaPods. | | `scheme` | **(string)** - Xcode project's scheme. If a project: - Has multiple schemes, you should set this value. - Has only one scheme, it will be detected automatically. - Have multiple schemes schemes and if this value is **not** set, EAS CLI will prompt you to select one of them. | | `buildConfiguration` | **(string)** - Xcode project's Build Configuration. - For an Expo project, the value is `"Release"` or `"Debug"`. Defaults to `"Release"`. - For a [bare React Native](/bare/overview) project, defaults to the value specified in the scheme. . It takes priority over [`developmentClient`](#developmentclient). | | `applicationArchivePath` | **(string)** - Path (or pattern) where EAS Build is going to look for the application archive. EAS Build uses [glob patterns](https://github.com/isaacs/node-glob#glob-primer) for pattern matching. You should modify that path only if you are using a custom **Gymfile**. The default is `ios/build/Build/Products/*-iphonesimulator/*.app` when building for simulator and `ios/build/*.ipa` in other cases. | | `config` | **(string)** - Custom workflow file name that will be used to run this iOS build. You can also specify this property on profile level for platform-agnostic workflows. [Learn more](/custom-builds/get-started). Example: `"config": "production-ios.yml"` will use workflow from `.eas/build/production-ios.yml`. | ## EAS Submit The following properties are available in the schema for the `submit` key in **eas.json**. Example schema of with production profile ```json { "cli": { "version": ">= 0.34.0" }, "submit": { "production": { "android": { "track": "internal" }, "ios": { "appleId": "john@turtle.com", "ascAppId": "1234567890", "appleTeamId": "AB12XYZ34S" } } } } ``` ### Android-specific options | Property | Description | | --- | --- | | `serviceAccountKeyPath` | **(string)** - Path to the JSON file with [Google Service Account Key](https://expo.fyi/creating-google-service-account) used to authenticate with Google Play. | | `track` | **(enum: production, beta, alpha, internal)** - The track of the application to use. | | `releaseStatus` | **(enum: completed, draft, halted, inProgress)** - The [status of a release](https://developers.google.com/android-publisher/api-ref/rest/v3/edits.tracks#status). | | `rollout` | **(number)** - The initial fraction of users who are eligible to receive the release. Should be a value from 0 (no users) to 1 (all users). Works only with `inProgress` [release status](https://developers.google.com/android-publisher/api-ref/rest/v3/edits.tracks#status). | | `changesNotSentForReview` | **(boolean)** - Indicates that the changes sent with this submission will not be reviewed until they are explicitly sent for review from the Google Play Console UI. Defaults to `false`. | | `applicationId` | **(string)** - The application ID that is used when accessing Service Account Key managed by Expo. It does not have any effect if you are using local credentials. In most cases this value will be autodetected. However, if you have multiple product flavors, this value might be necessary. | ### iOS-specific options | Property | Description | | --- | --- | | `appleId` | **(string)** - Your Apple ID username (you can also set the `EXPO_APPLE_ID` env variable). | | `ascAppId` | **(string)** - [App Store Connect unique application Apple ID number](https://expo.fyi/asc-app-id). When set, results in skipping the app creation step. | | `appleTeamId` | **(string)** - Your Apple Developer Team ID. | | `sku` | **(string)** - An unique ID for your app that is not visible on the App Store, will be generated unless provided. | | `language` | **(string)** - Primary language. Defaults to "en-US". | | `companyName` | **(string)** - The name of your company, needed only for the first submission of any app to the App Store. | | `appName` | **(string)** - The name of your app as it will appear on the App Store. Defaults to `expo.name` from the [app config](/workflow/configuration). | | `ascApiKeyPath` | **(string)** - The path to your [App Store Connect Api Key **.p8** file](https://expo.fyi/creating-asc-api-key). | | `ascApiKeyIssuerId` | **(string)** - The Issuer ID of your [App Store Connect Api Key](https://expo.fyi/creating-asc-api-key). | | `ascApiKeyId` | **(string)** - The Key ID of your [App Store Connect Api Key](https://expo.fyi/creating-asc-api-key). | | `bundleIdentifier` | **(string)** - The bundle identifier that will be used when accessing submit credentials managed by Expo. It does not have any effect if you are using local credentials. In most cases, this value will be autodetected. However, if you have multiple Xcode schemes and targets, this value might be necessary. | | `metadataPath` | **(string)** - The path to your [store configuration file](/eas/metadata). | | `groups` | **(array)** - An array of TestFlight internal group names to add the build to. Note: on top of the groups you provide here, the build will be automatically added to the groups that have been created with the "Enable automatic distribution" App Store Connect setting. | --- --- modificationDate: February 25, 2026 title: EAS CLI reference description: EAS CLI is a command-line tool that allows you to interact with Expo Application Services (EAS) from your terminal. cliVersion: 18.0.3 --- # EAS CLI reference EAS CLI is a command-line tool that allows you to interact with Expo Application Services (EAS) from your terminal. CLI version: 18.0.3 CLI version 18.0.3 You can use EAS Command-Line Interface (CLI) to build, update, submit, deploy or use workflows in your Expo and React Native project from a terminal window. ## Installation You need to install the EAS CLI globally on your machine. You do this by running the following command: ```sh # npm npm install --global eas-cli # yarn yarn global add eas-cli # pnpm pnpm add -g eas-cli # bun bun add -g eas-cli ``` Alternatively, you can use CLI tools provided by your package manager to run EAS CLI commands: ```sh # npm npx eas-cli@latest # yarn yarn dlx eas-cli@latest # pnpm pnpm dlx eas-cli@latest # bun bunx eas-cli@latest ``` ## Commands Use the EAS CLI by running one of the commands documented on this page, optionally followed by any flags or arguments. Flags customize the behavior of a command, and arguments are specific to the command. ### `eas account:login` Log in with your Expo account. #### Usage ```sh eas account:login [-s] [-b] ``` #### Flags - `-b, --browser` Login with your browser. - `-s, --sso` Login with SSO. #### Alias ```sh eas login ``` ### `eas account:logout` Log out. #### Usage ```sh eas account:logout ``` #### Alias ```sh eas logout ``` ### `eas account:usage [ACCOUNT_NAME]` View account usage and billing for the current cycle. #### Usage ```sh eas account:usage [ACCOUNT_NAME] [--json] [--non-interactive] ``` #### Argument - `ACCOUNT_NAME` Account name to view usage for. If not provided, the account will be selected interactively (or defaults to the only account if there is just one). #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas account:view` Show the username you are logged in as. #### Usage ```sh eas account:view ``` #### Alias ```sh eas whoami ``` ### `eas analytics [STATUS]` Display or change analytics settings. #### Usage ```sh eas analytics [STATUS] ``` ### `eas autocomplete [SHELL]` Display autocomplete installation instructions. #### Usage ```sh eas autocomplete [SHELL] [-r] ``` #### Argument - `SHELL` (zsh|bash|powershell) Shell type. #### Flag - `-r, --refresh-cache` Refresh cache (ignores displaying instructions). #### Examples ```sh eas autocomplete eas autocomplete bash eas autocomplete zsh eas autocomplete powershell eas autocomplete --refresh-cache ``` ### `eas branch:create [NAME]` Create a branch. #### Usage ```sh eas branch:create [NAME] [--json --non-interactive] ``` #### Argument - `NAME` Name of the branch to create. #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas branch:delete [NAME]` Delete a branch. #### Usage ```sh eas branch:delete [NAME] [--json --non-interactive] ``` #### Argument - `NAME` Name of the branch to delete. #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas branch:list` List all branches. #### Usage ```sh eas branch:list [--offset ] [--limit ] [--json --non-interactive] ``` #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--limit=` The number of items to fetch each query. Defaults to 50 and is capped at 100. - `--non-interactive` Run the command in non-interactive mode. - `--offset=` Start queries from specified index. Use for paginating results. Defaults to 0. ### `eas branch:rename` Rename a branch. #### Usage ```sh eas branch:rename [--from ] [--to ] [--json --non-interactive] ``` #### Flags - `--from=` Current name of the branch. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--to=` New name of the branch. ### `eas branch:view [NAME]` View a branch. #### Usage ```sh eas branch:view [NAME] [--offset ] [--limit ] [--json --non-interactive] ``` #### Argument - `NAME` Name of the branch to view. #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--limit=` The number of items to fetch each query. Defaults to 25 and is capped at 50. - `--non-interactive` Run the command in non-interactive mode. - `--offset=` Start queries from specified index. Use for paginating results. Defaults to 0. ### `eas build` Start a build. #### Usage ```sh eas build [-p android|ios|all] [-e ] [--local] [--output ] [--wait] [--clear-cache] [-s | --auto-submit-with-profile ] [--what-to-test ] [-m ] [--build-logger-level trace|debug|info|warn|error|fatal] [--freeze-credentials] [--verbose-logs] [--json --non-interactive] ``` #### Flags - `-e, --profile=PROFILE_NAME` Name of the build profile from **eas.json.** Defaults to "production" if defined in **eas.json.** - `-m, --message=` A short message describing the build. - `-p, --platform=(android|ios|all)` - `-s, --auto-submit` Submit on build complete using the submit profile with the same name as the build profile. - `--auto-submit-with-profile=PROFILE_NAME` Submit on build complete using the submit profile with provided name. - `--build-logger-level=(trace|debug|info|warn|error|fatal)` The level of logs to output during the build process. Defaults to "info". - `--clear-cache` Clear cache before the build. - `--freeze-credentials` Prevent the build from updating credentials in non-interactive mode. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--local` Run build locally [experimental]. - `--non-interactive` Run the command in non-interactive mode. - `--output=` Output path for local build. - `--verbose-logs` Use verbose logs for the build process. - `--[no-]wait` Wait for build(s) to complete. - `--what-to-test=` Specify the "What to Test" information for the build in TestFlight (iOS-only). To be used with the `auto-submit` flag. ### `eas build:cancel [BUILD_ID]` Cancel a build. #### Usage ```sh eas build:cancel [BUILD_ID] [--non-interactive] [-p android|ios|all] [-e ] ``` #### Flags - `-e, --profile=PROFILE_NAME` Filter builds by build profile if build ID is not provided. - `-p, --platform=(android|ios|all)` Filter builds by the platform if build ID is not provided. - `--non-interactive` Run the command in non-interactive mode. ### `eas build:configure` Configure the project to support EAS Build. #### Usage ```sh eas build:configure [-p android|ios|all] ``` #### Flag - `-p, --platform=(android|ios|all)` Platform to configure. ### `eas build:delete [BUILD_ID]` Delete a build. #### Usage ```sh eas build:delete [BUILD_ID] [--non-interactive] [-p android|ios|all] [-e ] ``` #### Flags - `-e, --profile=PROFILE_NAME` Filter builds by build profile if build ID is not provided. - `-p, --platform=(android|ios|all)` Filter builds by the platform if build ID is not provided. - `--non-interactive` Run the command in non-interactive mode. ### `eas build:dev` Run dev client simulator/emulator build with matching fingerprint or create a new one. #### Usage ```sh eas build:dev [-p ios|android] [-e ] ``` #### Flags - `-e, --profile=PROFILE_NAME` Name of the build profile from **eas.json.** It must be a profile allowing to create emulator/simulator internal distribution dev client builds. The "development-simulator" build profile will be selected by default. - `-p, --platform=(ios|android)` ### `eas build:download` Download simulator/emulator builds for a given fingerprint hash. #### Usage ```sh eas build:download --fingerprint [-p ios|android] [--dev-client] [--json --non-interactive] ``` #### Flags - `-p, --platform=(ios|android)` - `--[no-]dev-client` Filter only dev-client builds. - `--fingerprint=` (required) Fingerprint hash of the build to download. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas build:inspect` Inspect the state of the project at specific build stages, useful for troubleshooting. #### Usage ```sh eas build:inspect -p android|ios -s archive|pre-build|post-build -o [-e ] [--force] [-v] ``` #### Flags - `-e, --profile=PROFILE_NAME` Name of the build profile from **eas.json.** Defaults to "production" if defined in **eas.json.** - `-o, --output=OUTPUT_DIRECTORY` (required) Output directory. - `-p, --platform=(android|ios)` (required). - `-s, --stage=(archive|pre-build|post-build)` (required) Stage of the build you want to inspect. - `archive` Builds the project archive that would be uploaded to EAS when building. - `pre-build` Prepares the project to be built with Gradle/Xcode. Does not run the native build. - `post-build` Builds the native project and leaves the output directory for inspection. - `-v, --verbose` - `--force` Delete OUTPUT_DIRECTORY if it already exists. ### `eas build:list` List all builds for your project. #### Usage ```sh eas build:list [-p android|ios|all] [--status new|in-queue|in-progress|pending-cancel|errored|finished|canceled] [--distribution store|internal|simulator] [--channel ] [--app-version ] [--app-build-version ] [--sdk-version ] [--runtime-version ] [--app-identifier ] [-e ] [--git-commit-hash ] [--fingerprint-hash ] [--offset ] [--limit ] [--json --non-interactive] [--simulator] ``` #### Flags - `-e, --build-profile=` Filter only builds created with the specified build profile. - `-p, --platform=(android|ios|all)` - `--app-build-version=` Filter only builds created with the specified app build version. - `--app-identifier=` Filter only builds created with the specified app identifier. - `--app-version=` Filter only builds created with the specified main app version. - `--channel=` - `--distribution=(store|internal|simulator)` Filter only builds with the specified distribution type. - `--fingerprint-hash=` Filter only builds with the specified fingerprint hash. - `--git-commit-hash=` Filter only builds created with the specified git commit hash. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--limit=` The number of items to fetch each query. Defaults to 10 and is capped at 50. - `--non-interactive` Run the command in non-interactive mode. - `--offset=` Start queries from specified index. Use for paginating results. Defaults to 0. - `--runtime-version=` Filter only builds created with the specified runtime version. - `--sdk-version=` Filter only builds created with the specified Expo SDK version. - `--simulator` Filter only iOS simulator builds. Can only be used with `--platform` flag set to "ios". - `--status=(new|in-queue|in-progress|pending-cancel|errored|finished|canceled)` Filter only builds with the specified status. ### `eas build:resign` Re-sign a build archive. #### Usage ```sh eas build:resign [-p android|ios] [-e ] [--source-profile ] [--wait] [--id ] [--offset ] [--limit ] [--json --non-interactive] ``` #### Flags - `-e, --target-profile=PROFILE_NAME` Name of the target build profile from **eas.json.** Credentials and environment variables from this profile will be used when re-signing. Defaults to "production" if defined in **eas.json.** - `-p, --platform=(android|ios)` - `--id=` ID of the build to re-sign. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--limit=` The number of items to fetch each query. Defaults to 50 and is capped at 100. - `--non-interactive` Run the command in non-interactive mode. - `--offset=` Start queries from specified index. Use for paginating results. Defaults to 0. - `--source-profile=PROFILE_NAME` Name of the source build profile from **eas.json.** Used to filter builds eligible for re-signing. - `--[no-]wait` Wait for build(s) to complete. ### `eas build:run` Run simulator/emulator builds from eas-cli. #### Usage ```sh eas build:run [--latest | --id | --path | --url ] [-p android|ios] [-e ] [--offset ] [--limit ] ``` #### Flags - `-e, --profile=PROFILE_NAME` Name of the build profile used to create the build to run. When specified, only builds created with the specified build profile will be queried. - `-p, --platform=(android|ios)` - `--id=` ID of the simulator/emulator build to run. - `--latest` Run the latest simulator/emulator build for specified platform. - `--limit=` The number of items to fetch each query. Defaults to 50 and is capped at 100. - `--offset=` Start queries from specified index. Use for paginating results. Defaults to 0. - `--path=` Path to the simulator/emulator build archive or app. - `--url=` Simulator/Emulator build archive url. ### `eas build:submit` Submit app binary to App Store and/or Play Store. #### Usage ```sh eas build:submit [-p android|ios|all] [-e ] [--latest | --id | --path | --url ] [--what-to-test ] [--verbose] [--wait] [--verbose-fastlane] [-g ] [--non-interactive] ``` #### Flags - `-e, --profile=` Name of the submit profile from **eas.json.** Defaults to "production" if defined in **eas.json.** - `-g, --groups=...` Internal TestFlight testing groups to add the build to (iOS only). Learn more: [https://developer.apple.com/help/app-store-connect/test-a-beta-version/add-internal-testers](https://developer.apple.com/help/app-store-connect/test-a-beta-version/add-internal-testers). - `-p, --platform=(android|ios|all)` - `--id=` ID of the build to submit. - `--latest` Submit the latest build for specified platform. - `--non-interactive` Run command in non-interactive mode. - `--path=` Path to the **.apk**/**.aab**/**.ipa** file. - `--url=` App archive url. - `--verbose` Always print logs from EAS Submit. - `--verbose-fastlane` Enable verbose logging for the submission process. - `--[no-]wait` Wait for submission to complete. - `--what-to-test=` Sets the "What to test" information in TestFlight (iOS only). #### Alias ```sh eas build:submit ``` ### `eas build:version:get` Get the latest version from EAS servers. #### Usage ```sh eas build:version:get [-p android|ios|all] [-e ] [--json --non-interactive] ``` #### Flags - `-e, --profile=PROFILE_NAME` Name of the build profile from **eas.json.** Defaults to "production" if defined in **eas.json.** - `-p, --platform=(android|ios|all)` - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas build:version:set` Update version of an app. #### Usage ```sh eas build:version:set [-p android|ios] [-e ] ``` #### Flags - `-e, --profile=PROFILE_NAME` Name of the build profile from **eas.json.** Defaults to "production" if defined in **eas.json.** - `-p, --platform=(android|ios)` ### `eas build:version:sync` Update a version in native code with a value stored on EAS servers. #### Usage ```sh eas build:version:sync [-p android|ios|all] [-e ] ``` #### Flags - `-e, --profile=PROFILE_NAME` Name of the build profile from **eas.json.** Defaults to "production" if defined in **eas.json.** - `-p, --platform=(android|ios|all)` ### `eas build:view [BUILD_ID]` View a build for your project. #### Usage ```sh eas build:view [BUILD_ID] [--json] ``` #### Flag - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. ### `eas channel:create [NAME]` Create a channel. #### Usage ```sh eas channel:create [NAME] [--json --non-interactive] ``` #### Argument - `NAME` Name of the channel to create. #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas channel:delete [NAME]` Delete a channel. #### Usage ```sh eas channel:delete [NAME] [--json --non-interactive] ``` #### Argument - `NAME` Name of the channel to delete. #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas channel:edit [NAME]` Point a channel at a new branch. #### Usage ```sh eas channel:edit [NAME] [--branch ] [--json --non-interactive] ``` #### Argument - `NAME` Name of the channel to edit. #### Flags - `--branch=` Name of the branch to point to. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas channel:list` List all channels. #### Usage ```sh eas channel:list [--offset ] [--limit ] [--json --non-interactive] ``` #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--limit=` The number of items to fetch each query. Defaults to 10 and is capped at 25. - `--non-interactive` Run the command in non-interactive mode. - `--offset=` Start queries from specified index. Use for paginating results. Defaults to 0. ### `eas channel:pause [NAME]` Pause a channel to stop it from sending updates. #### Usage ```sh eas channel:pause [NAME] [--branch ] [--json --non-interactive] ``` #### Argument - `NAME` Name of the channel to edit. #### Flags - `--branch=` Name of the branch to point to. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas channel:resume [NAME]` Resume a channel to start sending updates. #### Usage ```sh eas channel:resume [NAME] [--branch ] [--json --non-interactive] ``` #### Argument - `NAME` Name of the channel to edit. #### Flags - `--branch=` Name of the branch to point to. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas channel:rollout [CHANNEL]` Roll a new branch out on a channel incrementally. #### Usage ```sh eas channel:rollout [CHANNEL] [--action create|edit|end|view] [--percent ] [--outcome republish-and-revert|revert] [--branch ] [--runtime-version ] [--private-key-path ] [--json --non-interactive] ``` #### Argument - `CHANNEL` Channel on which the rollout should be done. #### Flags - `--action=(create|edit|end|view)` Rollout action to perform. - `--branch=` Branch to roll out. Use with `--action=create`. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--outcome=(republish-and-revert|revert)` End outcome of rollout. Use with `--action=end`. - `--percent=` Percent of users to send to the new branch. Use with `--action=edit` or `--action=create`. - `--private-key-path=` File containing the PEM-encoded private key corresponding to the certificate in expo-updates' configuration. Defaults to a file named "**private-key.pem**" in the certificate's directory. Only relevant if you are using code signing: [https://docs.expo.dev/eas-update/code-signing/](https://docs.expo.dev/eas-update/code-signing/). - `--runtime-version=` Runtime version to target. Use with `--action=create`. ### `eas channel:view [NAME]` View a channel. #### Usage ```sh eas channel:view [NAME] [--json --non-interactive] [--offset ] [--limit ] ``` #### Argument - `NAME` Name of the channel to view. #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--limit=` The number of items to fetch each query. Defaults to 50 and is capped at 100. - `--non-interactive` Run the command in non-interactive mode. - `--offset=` Start queries from specified index. Use for paginating results. Defaults to 0. ### `eas config` Display project configuration (**app.json** + **eas.json**). #### Usage ```sh eas config [-p android|ios] [-e ] [--json --non-interactive] ``` #### Flags - `-e, --profile=PROFILE_NAME` Name of the build profile from **eas.json.** Defaults to "production" if defined in **eas.json.** - `-p, --platform=(android|ios)` - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas credentials` Manage credentials. #### Usage ```sh eas credentials [-p android|ios] ``` #### Flag - `-p, --platform=(android|ios)` ### `eas credentials:configure-build` Set up credentials for building your project. #### Usage ```sh eas credentials:configure-build [-p android|ios] [-e ] ``` #### Flags - `-e, --profile=PROFILE_NAME` The name of the build profile in **eas.json.** - `-p, --platform=(android|ios)` ### `eas deploy [options]` Deploy your Expo Router web build and API Routes. #### Usage ```sh eas deploy [options] eas deploy --prod ``` #### Flags - `--alias=name` Custom alias to assign to the new deployment. - `--dry-run` Outputs a tarball of the new deployment instead of uploading it. - `--environment=` Environment variable's environment, for example, 'production', 'preview', 'development'. - `--export-dir=dir` [default: dist] Directory where the Expo project was exported. - `--id=xyz123` Custom unique identifier for the new deployment. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--prod` Create a new production deployment. #### Alias ```sh eas worker:deploy ``` ### `eas deploy:alias` Assign deployment aliases. #### Usage ```sh eas deploy:alias [--prod] [--alias ] [--id ] [--json --non-interactive] ``` #### Flags - `--alias=name` Custom alias to assign to the existing deployment. - `--id=xyz123` Unique identifier of an existing deployment. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--prod` Promote an existing deployment to production. #### Aliases ```sh eas worker:alias eas deploy:promote ``` ### `eas deploy:alias:delete [ALIAS_NAME]` Delete deployment aliases. #### Usage ```sh eas deploy:alias:delete [ALIAS_NAME] [--json --non-interactive] ``` #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. #### Alias ```sh eas worker:alias:delete ``` ### `eas deploy:delete [DEPLOYMENT_ID]` Delete a deployment. #### Usage ```sh eas deploy:delete [DEPLOYMENT_ID] [--json --non-interactive] ``` #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. #### Alias ```sh eas worker:delete ``` ### `eas deploy:promote` Assign deployment aliases. #### Usage ```sh eas deploy:promote [--prod] [--alias ] [--id ] [--json --non-interactive] ``` #### Flags - `--alias=name` Custom alias to assign to the existing deployment. - `--id=xyz123` Unique identifier of an existing deployment. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--prod` Promote an existing deployment to production. #### Aliases ```sh eas worker:alias eas deploy:promote ``` ### `eas device:create` Register new Apple Devices to use for internal distribution. #### Usage ```sh eas device:create ``` ### `eas device:delete` Remove a registered device from your account. #### Usage ```sh eas device:delete [--apple-team-id ] [--udid ] [--json --non-interactive] ``` #### Flags - `--apple-team-id=` The Apple team ID on which to find the device. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--udid=` The Apple device ID to disable. ### `eas device:list` List all registered devices for your account. #### Usage ```sh eas device:list [--apple-team-id ] [--offset ] [--limit ] [--json --non-interactive] ``` #### Flags - `--apple-team-id=` - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--limit=` The number of items to fetch each query. Defaults to 50 and is capped at 100. - `--non-interactive` Run the command in non-interactive mode. - `--offset=` Start queries from specified index. Use for paginating results. Defaults to 0. ### `eas device:rename` Rename a registered device. #### Usage ```sh eas device:rename [--apple-team-id ] [--udid ] [--name ] [--json --non-interactive] ``` #### Flags - `--apple-team-id=` The Apple team ID on which to find the device. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--name=` The new name for the device. - `--non-interactive` Run the command in non-interactive mode. - `--udid=` The Apple device ID to rename. ### `eas device:view [UDID]` View a device for your project. #### Usage ```sh eas device:view [UDID] ``` ### `eas diagnostics` Display environment info. #### Usage ```sh eas diagnostics ``` ### `eas env:create [ENVIRONMENT]` Create an environment variable for the current project or account. #### Usage ```sh eas env:create [ENVIRONMENT] [--name ] [--value ] [--force] [--type string|file] [--visibility plaintext|sensitive|secret] [--scope project|account] [--environment ] [--non-interactive] ``` #### Argument - `ENVIRONMENT` Environment to create the variable in. Default environments are 'production', 'preview', and 'development'. #### Flags - `--environment=...` Environment variable's environment, for example, 'production', 'preview', 'development'. - `--force` Overwrite existing variable. - `--name=` Name of the variable. - `--non-interactive` Run the command in non-interactive mode. - `--scope=(project|account)` [default: project] Scope for the variable. - `--type=(string|file)` The type of variable. - `--value=` Text value or the variable. - `--visibility=(plaintext|sensitive|secret)` Visibility of the variable. ### `eas env:delete [ENVIRONMENT]` Delete an environment variable for the current project or account. #### Usage ```sh eas env:delete [ENVIRONMENT] [--variable-name ] [--variable-environment ] [--scope project|account] [--non-interactive] ``` #### Argument - `ENVIRONMENT` Current environment of the variable to delete. Default environments are 'production', 'preview', and 'development'. #### Flags - `--non-interactive` Run the command in non-interactive mode. - `--scope=(project|account)` [default: project] Scope for the variable. - `--variable-environment=` Current environment of the variable to delete. - `--variable-name=` Name of the variable to delete. ### `eas env:exec ENVIRONMENT BASH_COMMAND` Execute a command with environment variables from the selected environment. #### Usage ```sh eas env:exec ENVIRONMENT BASH_COMMAND [--non-interactive] ``` #### Arguments - `ENVIRONMENT` Environment to execute the command in. Default environments are 'production', 'preview', and 'development'. - `BASH_COMMAND` Bash command to execute with the environment variables from the environment. #### Flag - `--non-interactive` Run the command in non-interactive mode. ### `eas env:get [ENVIRONMENT]` View an environment variable for the current project or account. #### Usage ```sh eas env:get [ENVIRONMENT] [--variable-name ] [--variable-environment ] [--format long|short] [--scope project|account] [--non-interactive] ``` #### Argument - `ENVIRONMENT` Current environment of the variable. Default environments are 'production', 'preview', and 'development'. #### Flags - `--format=(long|short)` [default: short] Output format. - `--non-interactive` Run the command in non-interactive mode. - `--scope=(project|account)` [default: project] Scope for the variable. - `--variable-environment=` Current environment of the variable. - `--variable-name=` Name of the variable. ### `eas env:list [ENVIRONMENT]` List environment variables for the current project or account. #### Usage ```sh eas env:list [ENVIRONMENT] [--include-sensitive] [--include-file-content] [--environment ] [--format long|short] [--scope project|account] ``` #### Argument - `ENVIRONMENT` Environment to list the variables from. Default environments are 'production', 'preview', and 'development'. #### Flags - `--environment=...` Environment variable's environment, for example, 'production', 'preview', 'development'. - `--format=(long|short)` [default: short] Output format. - `--include-file-content` Display files content in the output. - `--include-sensitive` Display sensitive values in the output. - `--scope=(project|account)` [default: project] Scope for the variable. ### `eas env:pull [ENVIRONMENT]` Pull environment variables for the selected environment to **.env** file. #### Usage ```sh eas env:pull [ENVIRONMENT] [--non-interactive] [--environment ] [--path ] ``` #### Argument - `ENVIRONMENT` Environment to pull variables from. Default environments are 'production', 'preview', and 'development'. #### Flags - `--environment=` Environment variable's environment, for example, 'production', 'preview', 'development'. - `--non-interactive` Run the command in non-interactive mode. - `--path=` [default: **.env.local**] Path to the result `.env` file. ### `eas env:push [ENVIRONMENT]` Push environment variables from **.env** file to the selected environment. #### Usage ```sh eas env:push [ENVIRONMENT] [--environment ] [--path ] [--force] ``` #### Argument - `ENVIRONMENT` Environment to push variables to. Default environments are 'production', 'preview', and 'development'. #### Flags - `--environment=...` Environment variable's environment, for example, 'production', 'preview', 'development'. - `--force` Skip confirmation and automatically override existing variables. - `--path=` [default: **.env.local**] Path to the input `.env` file. ### `eas env:update [ENVIRONMENT]` Update an environment variable on the current project or account. #### Usage ```sh eas env:update [ENVIRONMENT] [--variable-name ] [--variable-environment ] [--name ] [--value ] [--type string|file] [--visibility plaintext|sensitive|secret] [--scope project|account] [--environment ] [--non-interactive] ``` #### Argument - `ENVIRONMENT` Current environment of the variable to update. Default environments are 'production', 'preview', and 'development'. #### Flags - `--environment=...` Environment variable's environment, for example, 'production', 'preview', 'development'. - `--name=` New name of the variable. - `--non-interactive` Run the command in non-interactive mode. - `--scope=(project|account)` [default: project] Scope for the variable. - `--type=(string|file)` The type of variable. - `--value=` New value or the variable. - `--variable-environment=` Current environment of the variable to update. - `--variable-name=` Current name of the variable. - `--visibility=(plaintext|sensitive|secret)` Visibility of the variable. ### `eas fingerprint:compare [HASH1] [HASH2]` Compare fingerprints of the current project, builds, and updates. #### Usage ```sh eas fingerprint:compare [HASH1] [HASH2] [--build-id ] [--update-id ] [--open] [--environment ] [--json --non-interactive] ``` #### Arguments - `HASH1` If provided alone, HASH1 is compared against the current project's fingerprint. - `HASH2` If two hashes are provided, HASH1 is compared against HASH2. #### Flags - `--build-id=...` Compare the fingerprint with the build with the specified ID. - `--environment=` If generating a fingerprint from the local directory, use the specified environment. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--open` Open the fingerprint comparison in the browser. - `--update-id=...` Compare the fingerprint with the update with the specified ID. #### Examples ```sh eas fingerprint:compare # Compare fingerprints in interactive mode eas fingerprint:compare # Compare fingerprint against local directory eas fingerprint:compare # Compare provided fingerprints eas fingerprint:compare --build-id # Compare fingerprint from build against local directory eas fingerprint:compare --build-id --environment production # Compare fingerprint from build against local directory with the "production" environment eas fingerprint:compare --build-id --build-id # Compare fingerprint from a build against another build eas fingerprint:compare --build-id --update-id # Compare fingerprint from build against fingerprint from update eas fingerprint:compare --update-id # Compare fingerprint from update against provided fingerprint ``` ### `eas fingerprint:generate` Generate fingerprints from the current project. #### Usage ```sh eas fingerprint:generate [-p android|ios] [--environment | -e ] [--json --non-interactive] ``` #### Flags - `-e, --build-profile=` Name of the build profile from **eas.json.** - `-p, --platform=(android|ios)` - `--environment=` Environment variable's environment, for example, 'production', 'preview', 'development'. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. #### Examples ```sh eas fingerprint:generate # Generate fingerprint in interactive mode eas fingerprint:generate --build-profile preview # Generate a fingerprint using the "preview" build profile eas fingerprint:generate --environment preview # Generate a fingerprint using the "preview" environment eas fingerprint:generate --json --non-interactive --platform android # Output fingerprint json to stdout ``` ### `eas help [COMMAND]` Display help for eas. #### Usage ```sh eas help [COMMAND] [-n] ``` #### Argument - `COMMAND` Command to show help for. #### Flag - `-n, --nested-commands` Include all nested commands in the output. ### `eas init` Create or link an EAS project. #### Usage ```sh eas init [--id ] [--force] [--non-interactive] ``` #### Flags - `--force` Whether to create a new project/link an existing project without additional prompts or overwrite any existing project ID when running with `--id` flag. - `--id=` ID of the EAS project to link. - `--non-interactive` Run the command in non-interactive mode. #### Alias ```sh eas init ``` ### `eas init:onboarding [TARGET_PROJECT_DIRECTORY]` Continue onboarding process started on the [https://expo.new](https://expo.new) website. #### Usage ```sh eas init:onboarding [TARGET_PROJECT_DIRECTORY] ``` #### Aliases ```sh eas init:onboarding eas onboarding ``` ### `eas login` Log in with your Expo account. #### Usage ```sh eas login [-s] [-b] ``` #### Flags - `-b, --browser` Login with your browser. - `-s, --sso` Login with SSO. #### Alias ```sh eas login ``` ### `eas logout` Log out. #### Usage ```sh eas logout ``` #### Alias ```sh eas logout ``` ### `eas metadata:lint` Validate the local store configuration. #### Usage ```sh eas metadata:lint [--json] [--profile ] ``` #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--profile=` Name of the submit profile from **eas.json.** Defaults to "production" if defined in **eas.json.** ### `eas metadata:pull` Generate the local store configuration from the app stores. #### Usage ```sh eas metadata:pull [-e ] ``` #### Flag - `-e, --profile=` Name of the submit profile from **eas.json.** Defaults to "production" if defined in **eas.json.** ### `eas metadata:push` Sync the local store configuration to the app stores. #### Usage ```sh eas metadata:push [-e ] ``` #### Flag - `-e, --profile=` Name of the submit profile from **eas.json.** Defaults to "production" if defined in **eas.json.** ### `eas new [PATH]` Create a new project configured with Expo Application Services (EAS). #### Usage ```sh eas new [PATH] [-p bun|npm|pnpm|yarn] ``` #### Argument - `PATH` Path to create the project (defaults to current directory). #### Flag - `-p, --package-manager=(bun|npm|pnpm|yarn)` [default: npm] Package manager to use for installing dependencies. #### Alias ```sh eas new ``` ### `eas onboarding [TARGET_PROJECT_DIRECTORY]` Continue onboarding process started on the [https://expo.new](https://expo.new) website. #### Usage ```sh eas onboarding [TARGET_PROJECT_DIRECTORY] ``` #### Aliases ```sh eas init:onboarding eas onboarding ``` ### `eas open` Open the project page in a web browser. #### Usage ```sh eas open ``` ### `eas project:info` Information about the current project. #### Usage ```sh eas project:info ``` ### `eas project:init` Create or link an EAS project. #### Usage ```sh eas project:init [--id ] [--force] [--non-interactive] ``` #### Flags - `--force` Whether to create a new project/link an existing project without additional prompts or overwrite any existing project ID when running with `--id` flag. - `--id=` ID of the EAS project to link. - `--non-interactive` Run the command in non-interactive mode. #### Alias ```sh eas init ``` ### `eas project:new [PATH]` Create a new project configured with Expo Application Services (EAS). #### Usage ```sh eas project:new [PATH] [-p bun|npm|pnpm|yarn] ``` #### Argument - `PATH` Path to create the project (defaults to current directory). #### Flag - `-p, --package-manager=(bun|npm|pnpm|yarn)` [default: npm] Package manager to use for installing dependencies. #### Alias ```sh eas new ``` ### `eas project:onboarding [TARGET_PROJECT_DIRECTORY]` Continue onboarding process started on the [https://expo.new](https://expo.new) website. #### Usage ```sh eas project:onboarding [TARGET_PROJECT_DIRECTORY] ``` #### Aliases ```sh eas init:onboarding eas onboarding ``` ### `eas submit` Submit app binary to App Store and/or Play Store. #### Usage ```sh eas submit [-p android|ios|all] [-e ] [--latest | --id | --path | --url ] [--what-to-test ] [--verbose] [--wait] [--verbose-fastlane] [-g ] [--non-interactive] ``` #### Flags - `-e, --profile=` Name of the submit profile from **eas.json.** Defaults to "production" if defined in **eas.json.** - `-g, --groups=...` Internal TestFlight testing groups to add the build to (iOS only). Learn more: [https://developer.apple.com/help/app-store-connect/test-a-beta-version/add-internal-testers](https://developer.apple.com/help/app-store-connect/test-a-beta-version/add-internal-testers). - `-p, --platform=(android|ios|all)` - `--id=` ID of the build to submit. - `--latest` Submit the latest build for specified platform. - `--non-interactive` Run command in non-interactive mode. - `--path=` Path to the **.apk**/**.aab**/**.ipa** file. - `--url=` App archive url. - `--verbose` Always print logs from EAS Submit. - `--verbose-fastlane` Enable verbose logging for the submission process. - `--[no-]wait` Wait for submission to complete. - `--what-to-test=` Sets the "What to test" information in TestFlight (iOS only). #### Alias ```sh eas build:submit ``` ### `eas update` Publish an update group. #### Usage ```sh eas update [--branch ] [--channel ] [-m ] [--input-dir ] [--skip-bundler] [--clear-cache] [--emit-metadata] [--rollout-percentage ] [-p android|ios|all] [--auto] [--private-key-path ] [--environment ] [--json --non-interactive] ``` #### Flags - `-m, --message=` A short message describing the update. - `-p, --platform=(android|ios|all)` [default: all]. - `--auto` Use the current git branch and commit message for the EAS branch and update message. - `--branch=` Branch to publish the update group on. - `--channel=` Channel that the published update should affect. - `--clear-cache` Clear the bundler cache before publishing. - `--emit-metadata` Emit "**eas-update-metadata.json**" in the bundle folder with detailed information about the generated updates. - `--environment=` Environment to use for the server-side defined EAS environment variables during command execution, for example, "production", "preview", "development". - `--input-dir=` [default: dist] Location of the bundle. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--private-key-path=` File containing the PEM-encoded private key corresponding to the certificate in expo-updates' configuration. Defaults to a file named "**private-key.pem**" in the certificate's directory. Only relevant if you are using code signing: [https://docs.expo.dev/eas-update/code-signing/](https://docs.expo.dev/eas-update/code-signing/). - `--rollout-percentage=` Percentage of users this update should be immediately available to. Users not in the rollout will be served the previous latest update on the branch, even if that update is itself being rolled out. The specified number must be an integer between 1 and 100. When not specified, this defaults to 100. - `--skip-bundler` Skip running Expo CLI to bundle the app before publishing. ### `eas update:configure` Configure the project to support EAS Update. #### Usage ```sh eas update:configure [-p android|ios|all] [--environment ] [--non-interactive] ``` #### Flags - `-p, --platform=(android|ios|all)` [default: all] Platform to configure. - `--environment=` Environment to use for the server-side defined EAS environment variables during command execution, for example, "production", "preview", "development". - `--non-interactive` Run the command in non-interactive mode. ### `eas update:delete GROUPID` Delete all the updates in an update group. #### Usage ```sh eas update:delete GROUPID [--json --non-interactive] ``` #### Argument - `GROUPID` The ID of an update group to delete. #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas update:edit [GROUPID]` Edit all the updates in an update group. #### Usage ```sh eas update:edit [GROUPID] [--rollout-percentage ] [--branch ] [--json --non-interactive] ``` #### Argument - `GROUPID` The ID of an update group to edit. #### Flags - `--branch=` Branch for which to list updates to select from. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--rollout-percentage=` Rollout percentage to set for a rollout update. The specified number must be an integer between 1 and 100. ### `eas update:list` View the recent updates. #### Usage ```sh eas update:list [--branch | --all] [-p android|ios|all] [--runtime-version ] [--offset ] [--limit ] [--json --non-interactive] ``` #### Flags - `-p, --platform=(android|ios|all)` Filter updates by platform. - `--all` List updates on all branches. - `--branch=` List updates only on this branch. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--limit=` The number of items to fetch each query. Defaults to 25 and is capped at 50. - `--non-interactive` Run the command in non-interactive mode. - `--offset=` Start queries from specified index. Use for paginating results. Defaults to 0. - `--runtime-version=` Filter updates by runtime version. ### `eas update:republish` Roll back to an existing update. #### Usage ```sh eas update:republish [--channel | --branch | --group ] [--destination-channel | --destination-branch ] [-m ] [-p android|ios|all] [--private-key-path ] [--rollout-percentage ] [--json --non-interactive] ``` #### Flags - `-m, --message=` Short message describing the republished update group. - `-p, --platform=(android|ios|all)` [default: all]. - `--branch=` Branch name to select an update group to republish from. - `--channel=` Channel name to select an update group to republish from. - `--destination-branch=` Branch name to republish to if republishing to a different branch. - `--destination-channel=` Channel name to select a branch to republish to if republishing to a different branch. - `--group=` Update group ID to republish. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--private-key-path=` File containing the PEM-encoded private key corresponding to the certificate in expo-updates' configuration. Defaults to a file named "**private-key.pem**" in the certificate's directory. Only relevant if you are using code signing: [https://docs.expo.dev/eas-update/code-signing/](https://docs.expo.dev/eas-update/code-signing/). - `--rollout-percentage=` Percentage of users this update should be immediately available to. Users not in the rollout will be served the previous latest update on the branch, even if that update is itself being rolled out. The specified number must be an integer between 1 and 100. When not specified, this defaults to 100. ### `eas update:revert-update-rollout` Revert a rollout update for a project. #### Usage ```sh eas update:revert-update-rollout [--channel | --branch | --group ] [-m ] [--private-key-path ] [--json --non-interactive] ``` #### Flags - `-m, --message=` Short message describing the revert. - `--branch=` Branch name to select an update group to revert the rollout update from. - `--channel=` Channel name to select an update group to revert the rollout update from. - `--group=` Rollout update group ID to revert. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--private-key-path=` File containing the PEM-encoded private key corresponding to the certificate in expo-updates' configuration. Defaults to a file named "**private-key.pem**" in the certificate's directory. Only relevant if you are using code signing: [https://docs.expo.dev/eas-update/code-signing/](https://docs.expo.dev/eas-update/code-signing/). ### `eas update:roll-back-to-embedded` Roll back to the embedded update. #### Usage ```sh eas update:roll-back-to-embedded [--branch ] [--channel ] [--runtime-version ] [--message ] [-p android|ios|all] [--private-key-path ] [--json --non-interactive] ``` #### Flags - `-p, --platform=(android|ios|all)` [default: all]. - `--branch=` Branch to publish the rollback to embedded update group on. - `--channel=` Channel that the published rollback to embedded update should affect. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--message=` A short message describing the rollback to embedded update. - `--non-interactive` Run the command in non-interactive mode. - `--private-key-path=` File containing the PEM-encoded private key corresponding to the certificate in expo-updates' configuration. Defaults to a file named "**private-key.pem**" in the certificate's directory. Only relevant if you are using code signing: [https://docs.expo.dev/eas-update/code-signing/](https://docs.expo.dev/eas-update/code-signing/). - `--runtime-version=` Runtime version that the rollback to embedded update should target. ### `eas update:rollback` Roll back to an embedded update or an existing update. Users wishing to run this command non-interactively should instead execute "eas update:republish" or "eas update:roll-back-to-embedded". #### Usage ```sh eas update:rollback [--private-key-path ] ``` #### Flag - `--private-key-path=` File containing the PEM-encoded private key corresponding to the certificate in expo-updates' configuration. Defaults to a file named "**private-key.pem**" in the certificate's directory. Only relevant if you are using code signing: [https://docs.expo.dev/eas-update/code-signing/](https://docs.expo.dev/eas-update/code-signing/). ### `eas update:view GROUPID` Update group details. #### Usage ```sh eas update:view GROUPID [--json] ``` #### Argument - `GROUPID` The ID of an update group. #### Flag - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. ### `eas upload` Upload a local build and generate a sharable link. #### Usage ```sh eas upload [-p ios|android] [--build-path ] [--fingerprint ] [--json --non-interactive] ``` #### Flags - `-p, --platform=(ios|android)` - `--build-path=` Path for the local build. - `--fingerprint=` Fingerprint hash of the local build. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas webhook:create` Create a webhook. #### Usage ```sh eas webhook:create [--event BUILD|SUBMIT] [--url ] [--secret ] [--non-interactive] ``` #### Flags - `--event=(BUILD|SUBMIT)` Event type that triggers the webhook. - `--non-interactive` Run the command in non-interactive mode. - `--secret=` Secret used to create a hash signature of the request payload, provided in the 'Expo-Signature' header. - `--url=` Webhook URL. ### `eas webhook:delete [ID]` Delete a webhook. #### Usage ```sh eas webhook:delete [ID] [--non-interactive] ``` #### Argument - `ID` ID of the webhook to delete. #### Flag - `--non-interactive` Run the command in non-interactive mode. ### `eas webhook:list` List webhooks. #### Usage ```sh eas webhook:list [--event BUILD|SUBMIT] [--json] ``` #### Flags - `--event=(BUILD|SUBMIT)` Event type that triggers the webhook. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. ### `eas webhook:update` Update a webhook. #### Usage ```sh eas webhook:update --id [--event BUILD|SUBMIT] [--url ] [--secret ] [--non-interactive] ``` #### Flags - `--event=(BUILD|SUBMIT)` Event type that triggers the webhook. - `--id=` (required) Webhook ID. - `--non-interactive` Run the command in non-interactive mode. - `--secret=` Secret used to create a hash signature of the request payload, provided in the 'Expo-Signature' header. - `--url=` Webhook URL. ### `eas webhook:view ID` View a webhook. #### Usage ```sh eas webhook:view ID ``` #### Argument - `ID` ID of the webhook to view. ### `eas whoami` Show the username you are logged in as. #### Usage ```sh eas whoami ``` #### Alias ```sh eas whoami ``` ### `eas worker:alias` Assign deployment aliases. #### Usage ```sh eas worker:alias [--prod] [--alias ] [--id ] [--json --non-interactive] ``` #### Flags - `--alias=name` Custom alias to assign to the existing deployment. - `--id=xyz123` Unique identifier of an existing deployment. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--prod` Promote an existing deployment to production. #### Aliases ```sh eas worker:alias eas deploy:promote ``` ### `eas worker:alias:delete [ALIAS_NAME]` Delete deployment aliases. #### Usage ```sh eas worker:alias:delete [ALIAS_NAME] [--json --non-interactive] ``` #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. #### Alias ```sh eas worker:alias:delete ``` ### `eas worker:delete [DEPLOYMENT_ID]` Delete a deployment. #### Usage ```sh eas worker:delete [DEPLOYMENT_ID] [--json --non-interactive] ``` #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. #### Alias ```sh eas worker:delete ``` ### `eas workflow:cancel` Cancel one or more workflow runs. If no workflow run IDs are provided, you will be prompted to select IN_PROGRESS runs to cancel. #### Usage ```sh eas workflow:cancel [--non-interactive] ``` #### Flag - `--non-interactive` Run the command in non-interactive mode. ### `eas workflow:create [NAME]` Create a new workflow configuration YAML file. #### Usage ```sh eas workflow:create [NAME] [--skip-validation] ``` #### Argument - `NAME` Name of the workflow file (must end with **.yml** or **.yaml**). #### Flag - `--skip-validation` If set, the workflow file will not be validated before being created. ### `eas workflow:logs [ID]` View logs for a workflow run, selecting a job and step to view. You can pass in either a workflow run ID or a job ID. If no ID is passed in, you will be prompted to select from recent workflow runs for the current project. #### Usage ```sh eas workflow:logs [ID] [--json] [--non-interactive] [--all-steps] ``` #### Argument - `ID` ID of the workflow run or workflow job to view logs for. #### Flags - `--all-steps` Print all logs, rather than prompting for a specific step. This will be automatically set when in non-interactive mode. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. ### `eas workflow:run [FILE]` Run an EAS workflow. The entire local project directory will be packaged and uploaded to EAS servers for the workflow run, unless the `--ref` flag is used. #### Usage ```sh eas workflow:run [FILE] [--non-interactive] [--wait] [-F ] [--ref ] [--json] ``` #### Argument - `FILE` Path to the workflow file to run. #### Flags - `-F, --input=...` Set workflow inputs. - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--ref=` Git reference to run the workflow on. - `--[no-]wait` Wait for workflow run to complete. Defaults to false. ### `eas workflow:runs` List recent workflow runs for this project, with their IDs, statuses, and timestamps. #### Usage ```sh eas workflow:runs [--workflow ] [--status ACTION_REQUIRED|CANCELED|FAILURE|IN_PROGRESS|NEW|SUCCESS] [--json] [--limit ] ``` #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--limit=` The number of items to fetch each query. Defaults to 10 and is capped at 100. - `--status=(ACTION_REQUIRED|CANCELED|FAILURE|IN_PROGRESS|NEW|SUCCESS)` If present, filter the returned runs to select those with the specified status. - `--workflow=` If present, the query will only return runs for the specified workflow file name. ### `eas workflow:status [WORKFLOW_RUN_ID]` Show the status of an existing workflow run. If no run ID is provided, you will be prompted to select from recent workflow runs for the current project. #### Usage ```sh eas workflow:status [WORKFLOW_RUN_ID] [--non-interactive] [--wait] [--json] ``` #### Argument - `WORKFLOW_RUN_ID` A workflow run ID. #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. - `--[no-]wait` Wait for workflow run to complete. Defaults to false. ### `eas workflow:validate PATH` Validate a workflow configuration yaml file. #### Usage ```sh eas workflow:validate PATH [--non-interactive] ``` #### Argument - `PATH` Path to the workflow configuration YAML file (must end with **.yml** or **.yaml**). #### Flag - `--non-interactive` Run the command in non-interactive mode. ### `eas workflow:view [ID]` View details for a workflow run, including jobs. If no run ID is provided, you will be prompted to select from recent workflow runs for the current project. #### Usage ```sh eas workflow:view [ID] [--json] [--non-interactive] ``` #### Argument - `ID` ID of the workflow run to view. #### Flags - `--json` Enable JSON output, non-JSON messages will be printed to `stderr`. - `--non-interactive` Run the command in non-interactive mode. --- --- modificationDate: February 25, 2026 title: Environment variables in EAS description: An overview of how to use Expo Application Services (EAS) environment variables across builds, updates, and workflows. --- # Environment variables in EAS An overview of how to use Expo Application Services (EAS) environment variables across builds, updates, and workflows. This guide explains how to use Environment Variables in Expo Application Services (EAS): Build, Updates, Workflows, and Hosting. For general information on how environment variables work with the Expo framework, refer to [Environment variables in Expo](/guides/environment-variables). During local development, environment variables are loaded from your local **.env** or **.env.local** files. These files are generally excluded from the project's version control (that is, if they are listed in the **.gitignore** file or not committed) so they are not available for jobs that run on a remote server, for example, EAS Build and EAS Workflows. Additionally, most projects have multiple app variants and require multiple sets of environment variables (for instance Development and Production). ## Why use EAS environment variables You might want to use EAS Environment variables if you need to: - Keep configuration in one place for cloud builds, updates, and workflows without committing **.env** files. - Separate values by environment (`development`, `preview`, `production`) while reusing names. - Control visibility (plain text, sensitive, secret) so only the right surfaces can read each value. - Apply the same set locally with [`eas env:pull`](/eas/environment-variables/manage#pull-variables-for-local-development) or inside CI/CD. These are the problems that EAS Environment variables are built to solve. With EAS Environment variables, the variables are configured in EAS via the EAS CLI or directly on the [expo.dev](https://expo.dev) dashboard, and can be accessed by EAS Build and EAS Workflows as well as your local machine via the EAS CLI. ## Quick start To create a new environment variable, use the EAS CLI and run the following command inside your project directory. The following command creates a new environment variable with the name `EXPO_PUBLIC_API_URL` and the value `https://api.example.com` for the `production` environment. ```sh eas env:create --name EXPO_PUBLIC_API_URL --value https://api.example.com --environment production --visibility plaintext ``` Verify if the environment variable is created successfully by confirming it appears with the **production** badge in the [Environment variables](https://expo.dev/accounts/%5Baccount%5D/projects/%5Bproject%5D/environment-variables) in your project settings. Environment variables can also be managed directly on [expo.dev](https://expo.dev). To use the environment variable in EAS Build, add the `environment` field to the `production` build profile: ```json { "build": { "production": { "environment": "production" } } } ``` Now, any environment variables created for the `production` build profile will be available during the build process. To use the environment variable with EAS Update, run the `eas update` command with the `--environment` flag specified: ```sh eas update --environment production ``` The `--environment` flag is used to specify the environment to use for the update job. Only the environment variables from the specified environment will be used during the update process. To use the environment variable with EAS Hosting, run the `eas deploy` command with the `--environment` flag specified. If you need both client and server side environment variables, run the commands below in the order they are listed (client-side variables must be plain text or sensitive, not secret) and see [client-side environment variables](/eas/environment-variables/usage#client-side-environment-variables) for more information. ```sh eas env:pull --environment production npx expo export --platform web eas deploy --environment production ``` The `--environment` flag is used to specify the environment to use for the deploy job. Only the environment variables from the specified environment will be used during the deploy process. ## Key concepts ### Available environments By default, EAS supports three environments for environment variables: `development`, `preview`, and `production` environments. Custom environment names are available on Enterprise and Production plans. Each environment is an independent set of variables that can be used to customize your app in different contexts. For example, you can use different API keys for development and production, or use different bundle identifiers for app store releases. Every EAS Build and Workflows job runs using environment variables from one of the available environments. You can also use environments for updates, allowing you to use the same set of environment variables for your build jobs. You can do this when publishing an update by providing the `--environment` flag. Environment variables can be assigned to multiple environments and have the same value across all of them, or be created for a single environment. ### Scope - **Project-wide**: Specific to a single EAS project. You can create, view, and manage them by navigating to the [Environment variables](https://expo.dev/accounts/%5Baccount%5D/projects/%5Bproject%5D/environment-variables) page in your project's dashboard. These environment variables are available in any jobs that run on EAS servers and updates for this project. They can also be pulled locally for development if their visibility setting allows it. - **Account-wide**: Available across all projects in your EAS account. You can create, view, and manage them by navigating to the [Environment variables](https://expo.dev/accounts/%5Baccount%5D/settings/environment-variables) page in your account's dashboard. These environment variables are available in jobs that run on EAS servers and updates, together with project-wide variables for a project. You can pull them locally or read outside of EAS servers if their [visibility setting](/eas/environment-variables#visibility-settings-for-environment-variables) allows it. ### Variable types - **Strings**: Standard key/value pairs that can be used across builds, updates, workflows, and hosting. - **Files**: Values uploaded as files (for example, `google-services.json` or a certificate) that are made available to jobs as file paths on the build runner. ## Visibility settings for environment variables There are three different visibility settings available for each environment variable: | Visibility | Description | | --- | --- | | Plain text | Visible on the website, in EAS CLI, and in logs. | | Sensitive | Obfuscated in EAS Build and Workflows job logs. You can use a toggle to make them visible on the website. They are also readable in EAS CLI. | | Secret | Not readable outside of the EAS servers, including on the website and in EAS CLI. They are obfuscated in EAS Build and Workflows job logs. | > Note that **anything that is included in your client-side code should be considered public and readable to any individual that can run your app**. > **Secret type environment variables** are intended to provide values to an EAS Build or Workflows job so that they may be used to alter how a job runs. For example, setting an `NPM_TOKEN` to install private packages from npm, or a setting a Sentry API key to create a release and upload your source maps. Secrets do not provide any additional security for values that you end up embedding in your application itself. ## Where to go next [Create and manage environment variables in EAS](/eas/environment-variables/manage) — Learn how to create, scope, and consume environment variables with EAS dashboard and EAS CLI. [Using environment variables in EAS](/eas/environment-variables/usage) — Learn how to use environment variables in EAS builds, updates, hosting, and workflow jobs. [Using environment variables without EAS](/eas/environment-variables/without-eas) — Learn about non-EAS ways to manage environment variables in Expo and React Native projects. [FAQ](/eas/environment-variables/faq) — Frequently asked questions about environment variables in EAS. --- --- modificationDate: February 25, 2026 title: Create and manage environment variables in EAS description: Learn how to create, scope, and consume environment variables with EAS dashboard and EAS CLI. --- # Create and manage environment variables in EAS Learn how to create, scope, and consume environment variables with EAS dashboard and EAS CLI. The following sections cover how to create, scope, and consume environment variables with EAS dashboard and EAS CLI. ## Create environment variables - [**Choose an environment or multiple environments**](/eas/environment-variables#available-environments): `development`, `preview`, and `production` are available by default. A variable can be reused across them or customized per environment. - [**Choose scope**](/eas/environment-variables#scope): Project-wide variables apply to one project. Account-wide variables can be reused across projects and are merged with project variables at build time. - [**Choose visibility**](/eas/environment-variables#visibility-settings-for-environment-variables): Use **secret** for values that should never leave EAS servers, **sensitive** for values that may be revealed locally, and **plain text** for non-sensitive values. ### Create variables in the dashboard To create a new environment variable on EAS servers, in your project dashboard, you can navigate to the **Project settings** > [**Environment variables**](https://expo.dev/accounts/%5Baccount%5D/projects/%5Bproject%5D/environment-variables) and then click on the **Add Variables** button. Use the [environment variables creation form](https://expo.dev/accounts/%5Baccount%5D/projects/%5Bproject%5D/environment-variables) page to set the name, value, environment(s), visibility, and optional description. Created variables appear in the list with their scope, visibility, and environment tags. Based on the environment variables in this example, the list may look like this: In the above example list: - The `SENTRY_AUTH_TOKEN` variable is a sensitive environment variable. It is used to authenticate Sentry to upload source maps after builds and updates, and has to be accessible outside of EAS servers. - The `GOOGLE_SERVICES_JSON` variable is a secret environment variable and uses an uploaded file. It is used to authenticate Google to access the Google Services JSON file, and has to be stored securely on EAS servers. This uploaded JSON file is typically added to your project's **.gitignore**. - All other variables, such as `APP_VARIANT` and `EXPO_PUBLIC_API_URL`, are plain text environment variables. ### Create variables with EAS CLI Use `eas env:create` to add variables and `eas env:list` to verify what is set. ```sh eas env:create --name EXPO_PUBLIC_API_URL --value https://example.app/staging --environment preview --visibility plaintext eas env:list --environment preview ``` ## Using environment variables in your code ### Client-side values The environment variables with the [`EXPO_PUBLIC_`](/guides/environment-variables) prefix are available as `process.env` variables in your app's code. You can use them dynamically to configure your app behavior based on their values: ```tsx import { Button } from 'react-native'; function Post() { const apiUrl = process.env.EXPO_PUBLIC_API_URL; async function onPress() { await fetch(apiUrl, { ... }); } return