---
schema_version: 1
route: /t/eas.md
tool: "eas"
---

# sincecutoff.com /t/eas — EAS CLI (Expo)

- name: EAS CLI (Expo)
- kind: cli
- children: none
- homepage: <https://github.com/expo/eas-cli>

Changes to the tools coding agents drive, since a model's training cutoff, each linked to its first-party source. Check installed versions and limitations before acting; a cutoff date does not establish what a model knows.
Original editorial content: [Apache 2.0](https://sincecutoff.com/v1/data-license.txt), by [0xPatrick](https://0xpatrick.dev). Preserve applicable license and [NOTICE](https://sincecutoff.com/notice.txt) attribution when redistributing. Third-party source text and examples retain their own rights. [License scope and attribution](https://sincecutoff.com/v1/license.json).
To stay current, read the changes feed: [`/v1/changes.md?tool=eas`](https://sincecutoff.com/v1/changes.md?tool=eas) (or `.json`), adding `since=YYYY-MM-DD` for your training cutoff. Entries for registered children are included; the registry itself is `/v1/tools.json`. How to page and save your place: [llms.txt](https://sincecutoff.com/llms.txt).

### build-tools starts expo-device-hub for Android simulator sessions (2026-10-15)
- slug: build-tools-starts-expo-device-hub-for-android-simulator-sessions-228bd607817f
- score: 0.91

How to use it:

For an EAS Android simulator session, start `expo-device-hub` with token authentication and the required website origins. Read and report the session token from the Hub state file after it starts.

Examples:

```
npx expo-device-hub --require-token --port <port> --platform android --cors-origin https://expo.dev --frame-ancestor https://expo.dev
```

- why_it_matters: Start an Android simulator session that requires a token and website origins.
- before: EAS started Android sessions without these flags, leaving website requests blocked and the Hub on the public ngrok tunnel without a token.
- sources: <https://github.com/expo/eas-cli/releases/tag/v25.0.0>, <https://github.com/expo/expo-device-hub/pull/292>, <https://github.com/expo/expo-device-hub/pull/294>, <https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/deviceSessionHost.ts>, <https://github.com/expo/eas-cli/pull/4578>, <https://github.com/expo/expo-device-hub>
- gotchas: "Version: v25.0.0"; "--require-token: Require a session token; with this flag the Hub records the token in its state file."; "--port <port>: Select the Hub's listening port; the EAS worker chooses an available port."; "--platform android: Select the Android platform; this is what the EAS worker passes."; "--cors-origin <origin>: Repeatable; allow a website origin to use the Hub. Values must be origins or subdomain wildcards, without paths or credentials."; "--frame-ancestor <origin>: EAS passes the website origin as a frame ancestor; whether this option accepts multiple values or has additional constraints was not found in the consulted documentation."; "EXPO_DEVICE_HUB_STATE_DIR: Override the directory for `server-<port>.json`; otherwise it is under `$TMPDIR/expo-device-hub`. The file contains the token when `--require-token` is set."; "Prerequisite: Use an `expo-device-hub` release that supports `--cors-origin`; EAS CLI v25.0.0's release PR requires at least 0.17.0."; "Prerequisite: Android emulators require the Android SDK, including `emulator` and `adb`."

### eas simulator sessions default to authenticated preview links (2026-10-15)
- slug: eas-simulator-sessions-default-to-authenticated-preview-links-bd43746a409a
- score: 0.94

How to use it:

When a simulator preview must be public, start the session with `eas simulator:start --public-link`. To retrieve a session, run `eas simulator:get`; preview links follow the session’s saved sharing preference.

Examples:

```
eas simulator:start --public-link
```

```
eas simulator:get [--id <session-id>]
```

- why_it_matters: Share an iOS simulator preview publicly or retrieve the preview using its saved sharing preference.
- before: New simulator sessions used a different default, and public sharing did not use the `--public-link` option.
- sources: <https://github.com/expo/eas-cli/releases/tag/v25.0.0>, <https://github.com/expo/eas-cli/blob/v25.0.0/packages/eas-cli/src/commands/simulator/get.ts>
- gotchas: "Version: v25.0.0"; "--public-link: Select public preview sharing when starting a session."; "--id <session-id>: Simulator session ID; defaults to the ID saved in `.env.eas-simulator`."; "Prerequisite: `simulator:get` requires a logged-in EAS CLI context and project directory."; "Prerequisite: For `simulator:get` without `--id`, a prior `simulator:start` must have written `.env.eas-simulator`."

### eas workflow:insights:maestro accepts --platform (2026-10-14)
- slug: eas-workflow-insights-maestro-accepts-platform-de528c0a7873
- score: 0.93

How to use it:

When you need Maestro insights for selected platforms, run `eas workflow:insights:maestro` with one or more `--platform` values. It lists Maestro runs and flows filtered by platform.

Examples:

```
eas workflow:insights:maestro --platform ios
```

```
eas workflow:insights:maestro --platform android
```

- why_it_matters: Inspect Maestro workflow runs and flows for a specific platform in an Expo project.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.14.0>, <https://github.com/expo/eas-cli/blob/v24.14.0/packages/eas-cli/src/commands/workflow/insights/maestro.ts>
- gotchas: "Version: v24.14.0"; "--platform <ios|android>: Filter flow runs by platform; may be specified multiple times. Allowed values: `ios`, `android`."; "Prerequisite: Requires a logged-in EAS account and project context; `--project-id <value>` can select the EAS project. Insights are subject to plan gating."

### eas-cli submission key prompt supports individual App Store Connect API keys (2026-10-12)
- slug: eas-cli-submission-key-prompt-supports-individual-app-store-connect-api-keys-925fa2052018
- score: 0.96

How to use it:

When submitting an iOS app interactively, run `eas submit --platform ios`; in the submission key prompt choose the individual App Store Connect API key type, then provide the key details without an Issuer ID. Individual keys are supported without `EAS_ENABLE_INDIVIDUAL_ASC_API_KEYS`, but not when the submission uses `--url` or `--path`.

Examples:

```
eas submit --platform ios
```

- why_it_matters: Configure an individual App Store Connect API key for an iOS submission.
- before: Set `EAS_ENABLE_INDIVIDUAL_ASC_API_KEYS` to enable individual App Store Connect API key support; the flag defaulted to false.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.13.0>, <https://github.com/expo/eas-cli/pull/4589>, <https://docs.expo.dev/submit/ios/>
- gotchas: "Version: v24.13.0"; "--platform ios (required): Selects iOS for `eas submit`."; "Prerequisite: A paid Apple Developer account, an iOS bundle identifier in app config, EAS CLI installed, and an Expo account login are required. A production `.ipa` is needed to submit."; "Submissions with an individual key and `--url` or `--path` provided are not supported."

### eas/build custom configs can upload the embedded bundle (2026-10-07)
- slug: eas-build-custom-configs-can-upload-the-embedded-bundle-f75babf77c21
- score: 0.90

How to use it:

For a custom build that uses `eas/build`, embedded-bundle upload is included when eligible. Add `eas/upload_embedded_bundle` only to a custom config that does not use `eas/build`; adding it alongside an enabled upload can make the second upload fail.

Examples:

```
build:
  steps:
    - eas/build
```

```
- eas/upload_embedded_bundle
```

```
- eas/upload_embedded_bundle:
    inputs:
      ignore_error: true
```

- why_it_matters: Configure a custom EAS build to upload its embedded bundle.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.12.0>, <https://docs.expo.dev/custom-builds/schema/>, <https://docs.expo.dev/custom-builds/get-started/>
- gotchas: "Version: v24.12.0"; "`eas/build` inputs: The function accepts no inputs; its build process uses the build profile in `eas.json`."; "`inputs.ignore_error`: Boolean; defaults to `false`. When `true`, logs an upload failure without failing the build. No documented mutual-exclusion rule."; "Prerequisite: Custom build YAML belongs under `.eas/build/`; configure the build profile in `eas.json` to use that config."; "Prerequisite: The upload step skips if EAS Update is not configured, or for development builds and iOS Simulator builds. It uses the build profile's `channel` and `applicationArchivePath` (or the default output path); a missing channel or app can fail the step."; "Applies to custom builds that use `eas/build`."; "Docs conflict: The card's `new_action` says to add `eas/upload_embedded_bundle` to a config using `eas/build`. Official docs say `eas/build` already uploads when enabled and warn that adding the step can trigger a failing duplicate upload. The release note is consistent with automatic upload from `eas/build`."

### eas login --device supports resumable non-interactive sign-in (2026-10-05)
- slug: eas-login-device-supports-resumable-non-interactive-sign-in-785705d3ea5e
- score: 0.98

How to use it:

When signing in from a remote session without browser access, start device login with `eas login --device --non-interactive` and follow its printed approval instructions. After approval, resume with the request ID and browser number using `eas login --device --non-interactive --resume <request-id> --match <number>`.

Examples:

```
eas login --device --non-interactive
```

```
eas login --device --non-interactive --resume <request-id> --match <number>
```

- why_it_matters: When signing in from a remote coding-agent session without direct browser access, start device login and resume it after browser approval.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.11.0>, <https://github.com/expo/eas-cli/pull/4502>, <https://docs.expo.dev/eas/cli/>
- gotchas: "Version: v24.11.0"; "--device: Log in using a code in a browser on any device."; "--non-interactive: Run the command in non-interactive mode."; "--resume <value>: Resume a saved device login using its request ID; one command at a time."; "--match <value>: Submit the number the user sees in their browser."; "The interactive command waits for browser approval and prompts for the number."; "With `--non-interactive`, `CI=1`, or closed stdin, each invocation performs one step, prints the next action, and exits so it can be resumed later."; "The linked description is truncated; resume details may be incomplete."

### eas simulator adds HTTP(S) traffic capture options (2026-10-02)
- slug: eas-simulator-adds-http-s-traffic-capture-options-691b27438049
- score: 0.96

How to use it:

When debugging HTTP(S) traffic from an iOS app on an EAS simulator, run `eas simulator:start` with `--network-capture`; add `--network-capture-field` values to retain selected request data.

Examples:

```
eas simulator:start --network-capture
```

```
eas simulator:start --network-capture --network-capture-field header --network-capture-field query --network-capture-field request-body --network-capture-field response-body
```

- why_it_matters: Inspect HTTP(S) traffic from an app running on a simulator while debugging its network behavior.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.10.0>, <https://github.com/expo/eas-cli/blob/v24.10.0/packages/eas-cli/src/commands/simulator/index.ts>
- gotchas: "Version: v24.10.0"; "--network-capture: Enables recording HTTP(S) traffic from apps on the device; iOS only. HTTPS is decrypted, recordings contain credentials in cleartext, and certificate-pinned apps fail to connect."; "--network-capture-field <value>: Repeatable or comma-separated values: `header`, `query`, `request-body`, `response-body`. Adds selected data beyond method, URL, status, timing, and size. Defaults to none; fields may contain credentials. The docs do not state that values are mutually exclusive."; "Captures HTTP(S) traffic from apps on the device."

### eas update can upload source maps (2026-10-02)
- slug: eas-update-can-upload-source-maps-20a37ecd00ae
- score: 0.96

How to use it:

When publishing an update whose JavaScript stack traces should be symbolicated, run `eas update --upload-source-maps`. EAS CLI uploads the Android and iOS source maps generated during bundling; `sourcesContent` is removed before upload.

Examples:

```
eas update --upload-source-maps
```

- why_it_matters: Publish an update whose stack traces should be symbolicated.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.9.0>, <https://docs.expo.dev/eas/observe/errors/>
- gotchas: "Version: v24.9.0"; "--upload-source-maps: Uploads the Android and iOS source maps generated when the update's JavaScript is bundled."; "Prerequisite: Requires EAS CLI v24.9.0 or later."; "Source maps are stripped of `sourcesContent` before upload."

### eas simulator accepts --build-fingerprint (2026-09-24)
- slug: eas-simulator-accepts-build-fingerprint-3b51133f336b
- score: 0.97

How to use it:

When you need to install and launch a simulator build with a specific fingerprint, run `eas simulator --build-fingerprint <fingerprint>`. It selects the most recent finished build with that fingerprint that can be installed on the simulator.

Examples:

```
eas simulator --build-fingerprint <fingerprint>
```

- why_it_matters: Install the newest simulator build matching a fingerprint.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.8.0>, <https://docs.expo.dev/eas/cli/>
- gotchas: "Version: v24.8.0"; "--build-fingerprint <value>: Fingerprint hash of an EAS Build to install and launch before the simulator session is ready; uses the most recent finished build with this fingerprint that can be installed on the simulator."

### eas workflow:ssh accepts build IDs (2026-09-24)
- slug: eas-workflow-ssh-accepts-build-ids-b42527b19ffa
- score: 0.90

How to use it:

When the workflow SSH session belongs to a build, pass that build ID to `eas workflow:ssh` to connect. The run must have SSH enabled and the session must still be available.

Examples:

```
eas workflow:ssh <build-id>
```

- why_it_matters: Connect to a build's workflow SSH session using its build ID.
- before: Pass a workflow job ID from a run started with `eas workflow:run --ssh`; v24.7.0 source accepted a resource ID but had no build-ID support.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.8.0>, <https://github.com/expo/eas-cli/blob/v24.8.0/packages/eas-cli/src/commands/workflow/ssh.ts>, <https://github.com/expo/eas-cli/blob/v24.7.0/packages/eas-cli/src/commands/workflow/ssh.ts>
- gotchas: "Version: v24.8.0"; "<build-id> (required): Build ID identifying the workflow SSH session; v24.8.0 accepts build IDs."; "Prerequisite: Be logged in to EAS."; "Prerequisite: The workflow run must have been started with `eas workflow:run --ssh`."; "Prerequisite: An OpenSSH client must be installed and `ssh` on PATH."

### eas workflow:insights:maestro reports Maestro test insights (2026-09-11)
- slug: eas-workflow-insights-maestro-reports-maestro-test-insights-0306132e1e0f
- score: 0.91

How to use it:

To review Maestro results for a time range, run `eas workflow:insights:maestro` for the overview or add `--flow <flow-path>` for one flow’s history. Use `--json` for script output.

Examples:

```
eas workflow:insights:maestro [--days <N> | --start <ISO-date> | --end <ISO-date>]
```

```
eas workflow:insights:maestro --flow <flow-path> [--days <N> | --start <ISO-date> | --end <ISO-date>] [--limit <N>]
```

```
eas workflow:insights:maestro --json [--days <N> | --start <ISO-date> | --end <ISO-date>]
```

- why_it_matters: Review Maestro test pass and flake rates, per-flow results, and run history for a time range.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.2.0>, <https://github.com/expo/eas-cli/blob/v24.2.0/packages/eas-cli/src/commands/workflow/insights/maestro.ts>, <https://github.com/expo/eas-cli/blob/v24.2.0/packages/eas-cli/src/insights/timeRange.ts>, <https://github.com/expo/eas-cli/blob/v24.2.0/packages/eas-cli/src/workflow/insights/planGating.ts>
- gotchas: "Version: v24.2.0"; "--days <N>: Show the last N days; defaults to 7, minimum 1. Mutually exclusive with `--start` and `--end`."; "--start <ISO-date>: Start of the insights time range. Mutually exclusive with `--days`."; "--end <ISO-date>: End of the insights time range. Mutually exclusive with `--days`."; "--flow <flow-path>: Show one flow’s history by flow path. Cannot be combined with `--status`, `--tag`, `--search`, `--sort`, or `--sort-direction`."; "--limit <N>: Number of flows to list or recent runs with `--flow`; defaults to 50 and is capped at 100."; "--json: Enable JSON output; non-JSON messages go to stderr. Implies `--non-interactive`."; "--project-id <value>: EAS project ID; defaults to the current directory’s project ID."; "Prerequisite: The command requires a logged-in EAS context and project context; `--project-id` can override the current directory’s project ID."; "Prerequisite: Maestro insights are subject to plan availability and time-span limits; the CLI handles plan-gate errors."; "Insights are displayed for a time range; exact range argument syntax is not stated."

### eas simulator:start supports local egress (2026-09-10)
- slug: eas-simulator-start-supports-local-egress-020783db4a21
- score: 0.97

How to use it:

When an iOS simulator session needs access to a development server on the CLI machine or its network, start it with `--egress local` and repeat `--egress-allow <host:port>` for each destination. Use `localhost:<port>` or `127.0.0.1:<port>` for loopback; the egress client must stay running for the session.

Examples:

```
eas simulator:start --platform ios --egress local --egress-allow <host>:<port>
```

```
eas simulator:start --platform ios --egress local --egress-allow localhost:<port>
```

```
eas simulator:egress [--config-type dotenv|env]
```

- why_it_matters: When an iOS simulator session needs to reach a development server on the CLI machine or its network, start the session with local egress and allow the server host and port.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.1.0>, <https://github.com/expo/eas-cli/blob/main/packages/eas-cli/README.md>, <https://github.com/expo/eas-cli/blob/v24.1.0/packages/eas-cli/src/commands/simulator/egress.ts>
- gotchas: "Version: v24.1.0"; "--egress local (required): Select local egress; the client must remain running for the session."; "--egress-allow <host:port> (required): Exact destination on the CLI machine or its network that the simulator may access through local egress; repeat for multiple destinations. Requires `--egress local`. `localhost` or `127.0.0.1` forwards that port from the simulator host to the CLI machine."; "--config-type dotenv|env: For `simulator:egress`, read session credentials from `.env.eas-simulator` (`dotenv`, default) or the current shell environment (`env`)."; "--platform ios: Select iOS as the simulator platform."; "Prerequisite: Keep the local egress client running for the life of the session."; "Prerequisite: `--egress-allow` requires `--egress local`."; "Prerequisite: The v24.1.0 release documents the iOS system proxy and local egress behavior."; "Requests exit from the CLI machine only when they honor the device host's system proxy."

### eas channel protection commands (2026-09-09)
- slug: eas-channel-protection-commands-aa2b99460a01
- score: 0.92

How to use it:

When you need to restrict publishing and channel changes, protect the channel; remove that restriction with unprotect. Inspect protection status with channel:list or channel:view.

Examples:

```
eas channel:protect <channel-name>
```

```
eas channel:unprotect <channel-name>
```

```
eas channel:list
 eas channel:view <channel-name>
```

- why_it_matters: Manage protection for an EAS Update channel and inspect its protection status.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.0.0>, <https://github.com/expo/eas-cli/blob/v24.0.0/packages/eas-cli/src/commands/channel/protect.ts>, <https://github.com/expo/eas-cli/blob/v24.0.0/packages/eas-cli/src/commands/channel/unprotect.ts>, <https://github.com/expo/eas-cli/blob/v24.0.0/packages/eas-cli/src/commands/channel/list.ts>, <https://github.com/expo/eas-cli/blob/v24.0.0/packages/eas-cli/src/commands/channel/view.ts>, <https://docs.expo.dev/eas/protected-resources/>
- gotchas: "Version: v24.0.0"; "<channel-name> / [NAME]: Channel name to protect or unprotect; omitting it prompts channel selection."; "--json: Enable JSON output; implies --non-interactive."; "--non-interactive: Run without interactive prompts; supply a channel name when using this flag."; "--offset <value>: Start channel list pagination at this index; defaults to 0."; "--limit <value>: Number of channels to fetch per query; defaults to 10 and is capped at 25."; "[NAME] for channel:view: Name of the channel to view."; "Prerequisite: Requires EAS CLI 24.0.0 or later."; "Prerequisite: Only Release Managers, Admins, and Owners can run protect or unprotect."

### eas observe:errors displays grouped issues and occurrences (2026-09-09)
- slug: eas-observe-errors-displays-grouped-issues-and-occurrences-7d578c373022
- score: 0.94

How to use it:

When investigating app error or exception issue groups, run `eas observe:errors` to list groups by fingerprint; rerun with `--fingerprint <fingerprint>` to show that group’s occurrences and stack traces.

Examples:

```
eas observe:errors
```

```
eas observe:errors --fingerprint <fingerprint>
```

- why_it_matters: Inspect error and exception issue groups and investigate an individual occurrence.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.0.0>, <https://github.com/expo/eas-cli/blob/v24.0.0/packages/eas-cli/src/commands/observe/errors.ts>
- gotchas: "Version: v24.0.0"; "--fingerprint <value>: Select an error group fingerprint to show individual occurrences with stack traces instead of the grouped summary."; "Prerequisite: The command requires a logged-in Expo account. It uses the current directory’s EAS project ID unless `--project-id` is supplied."

### eas observe:event displays an event by ID (2026-09-09)
- slug: eas-observe-event-displays-an-event-by-id-7a1b3d123b72
- score: 0.95

How to use it:

When you have an Observe event ID, run `eas observe:event <event-id>` to display its metric, log, or error.

Examples:

```
eas observe:event <event-id> [--project-id <project-id>] [--json] [--non-interactive]
```

- why_it_matters: Inspect a specific Observe metric, log, or error by its event ID.
- sources: <https://github.com/expo/eas-cli/releases/tag/v24.0.0>, <https://github.com/expo/eas-cli/blob/v24.0.0/packages/eas-cli/README.md>, <https://docs.expo.dev/eas/observe/eas-cli/>
- gotchas: "Version: v24.0.0"; "<event-id> (ID) (required): ID of the event to display; IDs are available in JSON output from `observe:session`, `observe:metrics`, or `observe:events`."; "--project-id <project-id>: EAS project ID; defaults to the project ID of the current directory."; "--json: Enable JSON output; implies `--non-interactive`."; "--non-interactive: Run the command in non-interactive mode."; "Prerequisite: Install EAS CLI and authenticate with `eas login`. The project must use EAS Observe. For `--project-id`, use an account with access to that project."

### eas simulator --tag groups and filters simulator sessions (2026-08-31)
- slug: eas-simulator-tag-groups-and-filters-simulator-sessions-c12ff1fa35d6
- score: 0.92

How to use it:

When starting or reviewing simulator sessions for app variants, tag sessions with `--tag` and filter the list with the same tag. Tags can be repeated; listing with multiple tags requires a session to carry every listed tag.

Examples:

```
eas simulator --tag <variant>
```

```
eas simulator:list --tag <variant>
```

```
eas simulator:list --tag <variant-a> --tag <variant-b>
```

- why_it_matters: Group and filter simulator sessions by app variant.
- sources: <https://github.com/expo/eas-cli/releases/tag/v23.2.0>, <https://github.com/expo/eas-cli/blob/v23.2.0/packages/eas-cli/README.md>
- gotchas: "Version: v23.2.0"; "eas simulator --tag <value>: Repeatable label for grouping simulator sessions; stored lowercased."; "eas simulator:list --tag <value>: Repeatable tag filter; a session must carry every tag listed."; "Prerequisite: The commands are documented as experimental and list sessions for the current project."

### eas workflow:run enables SSH on VM jobs (2026-08-31)
- slug: eas-workflow-run-enables-ssh-on-vm-jobs-9cbc170a50e2
- score: 0.92

How to use it:

When a workflow run needs SSH access to its VM jobs, run `eas workflow:run` with `--ssh`. Add `--ssh-idle-timeout=<seconds>` if the session should stay open after a job finishes with no client connected.

Examples:

```
eas workflow:run <workflow-file> --ssh
```

```
eas workflow:run <workflow-file> --ssh --ssh-idle-timeout=<seconds>
```

- why_it_matters: Run a workflow that requires SSH access to its VM jobs.
- sources: <https://github.com/expo/eas-cli/releases/tag/v23.2.0>, <https://github.com/expo/eas-cli/blob/v23.2.0/packages/eas-cli/src/commands/workflow/run.ts>
- gotchas: "Version: v23.2.0"; "FILE (required): Path to the workflow file to run."; "--ssh: Enables SSH on the run; opens an SSH session on each VM job for live debugging with `eas workflow:ssh`."; "--ssh-idle-timeout=<value>: Seconds to keep an SSH session open after its job finishes while no client is connected. Requires `--ssh`; range 0–3600; defaults to 0, closing the session when the job finishes and nobody is connected."; "Enables SSH on the run's VM jobs."

### eas workflow:ssh opens a workflow job worker session (2026-08-31)
- slug: eas-workflow-ssh-opens-a-workflow-job-worker-session-0c4ec854dc68
- score: 0.93

How to use it:

When debugging a workflow job whose run enabled SSH, run `eas workflow:ssh <workflow-job-id> [command...]` to connect to its worker and optionally run a remote shell command.

Examples:

```
eas workflow:ssh <workflow-job-id> [command...]
```

- why_it_matters: Inspect or debug a running workflow job on its worker.
- sources: <https://github.com/expo/eas-cli/releases/tag/v23.2.0>, <https://github.com/expo/eas-cli/blob/v23.2.0/packages/eas-cli/src/commands/workflow/ssh.ts>
- gotchas: "Version: v23.2.0"; "<workflow-job-id> (required): ID of a workflow job started with SSH enabled via `eas workflow:run --ssh`."; "[command...]: Optional command arguments passed to the remote shell."; "Prerequisite: The workflow run must have been started with `eas workflow:run --ssh`."; "Prerequisite: You must be logged in to EAS."; "Prerequisite: An OpenSSH client must be installed and `ssh` must be on PATH."; "The session is on the worker running the specified workflow job."

### eas new prompts for Expo SDK version and accepts --sdk-version (2026-08-31)
- slug: eas-new-prompts-for-expo-sdk-version-and-accepts-sdk-version-499af635456d
- score: 0.93

How to use it:

When creating a project with a specific Expo SDK, run `eas new` and pass `--sdk-version <SDK_VERSION>`, or answer the SDK version prompt. The command downloads the template from npm to support SDK-specific versions.

Examples:

```
eas new <PATH> --sdk-version <SDK_VERSION>
```

```
eas new
```

- why_it_matters: Create a new Expo project with a specific SDK version.
- sources: <https://github.com/expo/eas-cli/releases/tag/v23.1.0>, <https://github.com/expo/eas-cli/blob/v23.1.0/packages/eas-cli/src/commands/project/new.ts>, <https://github.com/expo/eas-cli/blob/v23.1.0/packages/eas-cli/README.md>
- gotchas: "Version: v23.1.0"; "[PATH]: Project path; defaults to the current directory."; "--sdk-version <value>: Expo SDK version for the new project; examples include `57` and `latest`."; "Prerequisite: Install EAS CLI with `npm install --global eas-cli`."

### build-tools adds opt-in CocoaPods dependency caching (2026-08-29)
- slug: build-tools-adds-opt-in-cocoapods-dependency-caching-69ee2e53a73a
- score: 0.95

How to use it:

For repeated iOS builds that should reuse CocoaPods dependencies, set `EAS_PODS_CACHE=1` when running an EAS iOS build. EAS restores a matching Pods cache, runs `pod install`, then saves `ios/Pods` under the lockfile-based key.

Examples:

```
EAS_PODS_CACHE=1 eas build --platform ios
```

- why_it_matters: For repeated iOS builds where CocoaPods dependencies should be reused, enable remote Pods caching.
- before: CocoaPods dependencies were installed from scratch on every iOS build.
- sources: <https://github.com/expo/eas-cli/releases/tag/v23.0.0>, <https://github.com/expo/eas-cli/pull/4266>, <https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/functions/restoreBuildCache.ts>, <https://github.com/expo/eas-cli>
- gotchas: "Version: v23.0.0"; "EAS_PODS_CACHE: Set to `1` to enable CocoaPods caching; otherwise caching is skipped."; "--platform ios (required): Selects iOS for the EAS build."; "Opt-in with `EAS_PODS_CACHE=1`."; "Supports traditional, custom, and simulator iOS builds."; "Cache failures are non-fatal."; "`~/Library/Caches/CocoaPods` is intentionally excluded."

### eas simulator adds an idle-time session limit (2026-08-26)
- slug: eas-simulator-adds-an-idle-time-session-limit-442ad495db93
- score: 0.93

How to use it:

When an EAS simulator session should stop after inactivity, run `eas simulator` with `--max-idle-time-minutes` set to the idle limit in minutes. The session stops automatically after that many minutes without activity.

Examples:

```
eas simulator --max-idle-time-minutes <minutes>
```

- why_it_matters: Stop an `eas simulator` session automatically after a period without activity.
- sources: <https://github.com/expo/eas-cli/releases/tag/v22.6.0>, <https://github.com/expo/eas-cli>
- gotchas: "Version: v22.6.0"; "--max-idle-time-minutes <value>: Stop the session after this many minutes without session activity. Omitting it leaves the session without an idle timeout."; "The flag is opt-in."

### eas-cli adds Appium EAS Simulator session support (2026-08-20)
- slug: eas-cli-adds-appium-eas-simulator-session-support-7611e9578af3
- score: 0.96

How to use it:

When starting an EAS Simulator session for Appium, select the Appium session type. Start it with `eas sim:start --platform <ios|android> --type appium` and follow the connection instructions it prints.

Examples:

```
eas sim:start --platform <ios|android> --type appium
```

- why_it_matters: When using an Appium session in an EAS Simulator workflow, use the supported eas-cli session handling.
- sources: <https://github.com/expo/eas-cli/releases/tag/v22.2.0>, <https://github.com/expo/eas-cli/pull/4190>, <https://github.com/expo/eas-cli/blob/v22.2.0/packages/eas-cli/README.md>
- gotchas: "Version: v22.2.0"; "--platform: Device platform: `ios` or `android`."; "--type (required): Session type; use `appium` to enable the Appium automation interface. Allowed values: `agent-device`, `appium`, `argent`, `serve-sim`."; "--out-config-type: Connection configuration output: `dotenv` writes `.env.eas-simulator` (default); `env` prints shell exports. These are alternative output modes."; "Prerequisite: Install eas-cli, log in to an Expo account, and link the project (`eas init`)."

### eas simulator supports --device selection (2026-08-20)
- slug: eas-simulator-supports-device-selection-8b163af85b68
- score: 0.94

How to use it:

When starting a simulator session, pass `--device` to choose its virtual device; omit it to use the runner-chosen device.

Examples:

```
eas simulator:start --device "<iOS simulator name or UDID>"
```

```
eas simulator:start --platform android --device "<AVD hardware profile id>"
```

- why_it_matters: When starting a simulator for a repository's development or testing workflow, select the virtual device to start.
- sources: <https://github.com/expo/eas-cli/releases/tag/v22.2.0>, <https://github.com/expo/eas-cli>
- gotchas: "Version: v22.2.0"; "--device <value>: Virtual device for the session: iOS Simulator device name or UDID; Android AVD hardware profile ID. Defaults to a device chosen by the runner."; "Docs conflict: Current official EAS simulator guidance says `--device` requires eas-cli ≥22.4.0, later than card version v22.2.0; it does not establish availability at v22.2.0. https://github.com/expo/skills/blob/main/plugins/expo/skills/eas-simulator/references/run-your-app.md"

### eas/checkout accepts a ref input (2026-08-03)
- slug: eas-checkout-accepts-a-ref-input-fdc9782c8a29
- score: 0.95

How to use it:

When a workflow job needs to run against a Git ref other than the triggering ref, set `ref` on its first `eas/checkout` step to the desired branch, tag, or full commit SHA.

Examples:

```
jobs:
  <job_id>:
    steps:
      - uses: eas/checkout
        with:
          ref: <branch_tag_or_full_commit_sha>
```

- why_it_matters: Run a build job against a branch, tag, or commit other than the ref that triggered the job.
- sources: <https://github.com/expo/eas-cli/releases/tag/v21.5.0>, <https://docs.expo.dev/eas/workflows/syntax/>
- gotchas: "Version: v21.5.0"; "ref: Git branch, tag, or full commit SHA to check out. Defaults to the ref that triggered the build or workflow job. Must be set on the job's first `eas/checkout` step."; "Prerequisite: Project sources must come from a Git repository, such as a job triggered through the GitHub integration; local builds and uploaded project tarballs do not support `ref`."; "Prerequisite: The requested ref must be reachable from the source repository's `origin`; checkout uses a shallow fetch (`--depth 1`)."; "The `ref` input selects a branch, tag, or commit SHA."

### eas submit commands inspect and manage submissions (2026-08-03)
- slug: eas-submit-commands-inspect-and-manage-submissions-341861828144
- score: 0.97

How to use it:

When you need to inspect or manage a submission for a build from this project, use `eas submit:list` or `eas submit:view` to inspect it, `eas submit:status` to check App Store and TestFlight state, or `eas submit:retry` and `eas submit:cancel` to manage it. Google Play app status is unavailable through EAS.

Examples:

```
eas submit:list [-p ios|android|all] [--status <awaiting-build|in-queue|in-progress|finished|errored|canceled>] [--offset <number>] [--limit <number>] [--json] [--non-interactive]
```

```
eas submit:view [<submission-id>] [-p ios|android|all] [--json]
eas submit:status [-p ios|android|all] [-e <profile>] [--json] [--non-interactive]
```

```
eas submit:retry [<submission-id>] [-p ios|android|all] [--json] [--non-interactive]
eas submit:cancel [<submission-id>] [-p ios|android|all] [--non-interactive]
```

- why_it_matters: Inspect or manage an EAS submission for a build produced from the repository.
- sources: <https://github.com/expo/eas-cli/releases/tag/v21.5.0>, <https://github.com/expo/eas-cli/blob/v21.5.0/packages/eas-cli/src/commands/submit/list.ts>, <https://github.com/expo/eas-cli/blob/v21.5.0/packages/eas-cli/src/commands/submit/view.ts>, <https://github.com/expo/eas-cli/blob/v21.5.0/packages/eas-cli/src/commands/submit/retry.ts>, <https://github.com/expo/eas-cli/blob/v21.5.0/packages/eas-cli/src/commands/submit/cancel.ts>, <https://github.com/expo/eas-cli/blob/v21.5.0/packages/eas-cli/src/commands/submit/status.ts>
- gotchas: "Version: v21.5.0"; "SUBMISSION_ID: Submission to view, retry, or cancel; when omitted, `-p` can select the platform submission."; "-p, --platform: Select `ios`, `android`, or `all`; with no submission ID, selects the platform submission for view, retry, or cancel."; "--status: Filter list results by `awaiting-build`, `in-queue`, `in-progress`, `finished`, `errored`, or `canceled`."; "--offset: Starting index for paginated list queries; defaults to 0."; "--limit: Items fetched per list query; defaults to 10 and is capped at 50."; "--json: Enable JSON output; for list and retry, implies non-interactive mode."; "--non-interactive: Run without interactive prompts; available for list, retry, cancel, and status."; "-e, --profile: Submit profile from `eas.json` used to resolve the App Store Connect API key; defaults to `production`."; "Prerequisite: Commands operate on the current project and require a logged-in EAS CLI context."; "Prerequisite: `submit:status` requires an App Store Connect API key, configured through `EXPO_ASC_API_KEY_PATH`, `EXPO_ASC_KEY_ID`, and `EXPO_ASC_ISSUER_ID`, an `eas.json` submit profile, or EAS credentials. Interactive Apple login is offered if no key is available; non-interactive use fails without a key."; "Google Play app status is not available through EAS yet."; "List and view include the runtime version and fingerprint of the submitted build."

### eas init --account selects project owner non-interactively (2026-07-27)
- slug: eas-init-account-selects-project-owner-non-interactively-512d99e16d91
- score: 0.97

How to use it:

When creating or linking an EAS project without prompts, run `eas init --account <name> --non-interactive` with the chosen account name. This creates or links `@<name>/<slug>` without prompts.

Examples:

```
eas init --account <name> --non-interactive
```

- why_it_matters: Create an unconfigured project non-interactively under a chosen account.
- sources: <https://github.com/expo/eas-cli/releases/tag/v21.3.0>, <https://github.com/expo/eas-cli>, <https://docs.expo.dev/eas/cli/>
- gotchas: "Version: v21.3.0"; "--account=<value>: Name of the account that will own the project."; "--non-interactive: Run the command in non-interactive mode."; "The account must be one in which you can create projects; the release says unconfigured-project error messages list eligible accounts."

### eas init --json outputs linked project details (2026-07-27)
- slug: eas-init-json-outputs-linked-project-details-79d3714ab2af
- score: 0.96

How to use it:

When initializing or linking an EAS project and a script needs its details, run `eas init --account <account> --json --non-interactive`; it prints the result as JSON to stdout.

Examples:

```
eas init --account <account> --json --non-interactive
```

- why_it_matters: Capture the linked EAS project details from project initialization in a script.
- sources: <https://github.com/expo/eas-cli/releases/tag/v21.3.0>, <https://github.com/expo/eas-cli/blob/v21.3.0/packages/eas-cli/src/commands/project/init.ts>, <https://github.com/expo/eas-cli/blob/v21.3.0/packages/eas-cli/README.md>
- gotchas: "Version: v21.3.0"; "--account <value>: Name of the account that will own the project; mutually exclusive with `--id`."; "--id <value>: ID of the EAS project to link; mutually exclusive with `--account`."; "--json: Enable JSON output; non-JSON messages go to stderr. Implies `--non-interactive`."; "--non-interactive: Run without interactive prompts."; "--force: Create or link without additional prompts, or overwrite an existing project ID when used with `--id`."; "Prerequisite: EAS CLI must have an authenticated Expo account context; the command's context requires logged-in status."; "Prerequisite: Install EAS CLI with `npm install -g eas-cli` or `yarn global add eas-cli`."; "The JSON output is described for a linked project."

### eas testflight feedback and crash-report commands (2026-07-27)
- slug: eas-testflight-feedback-and-crash-report-commands-fb80463b71e8
- score: 0.96

How to use it:

When debugging an iOS app, use `eas testflight:feedback` to inspect tester comments, device details, and screenshot URLs, or `eas testflight:crashes` to inspect crashes and full crash logs.

Examples:

```
eas testflight:feedback [<submission-id-or-app-store-connect-url>] [--offset <value>] [--limit <value>] [--json]
```

```
eas testflight:crashes [<submission-id-or-app-store-connect-url>] [--offset <value>] [--limit <value>] [--json]
```

- why_it_matters: Inspect TestFlight tester feedback or crash reports while debugging an iOS app.
- sources: <https://github.com/expo/eas-cli/releases/tag/v21.3.0>, <https://github.com/expo/eas-cli/blob/v21.3.0/packages/eas-cli/README.md>
- gotchas: "Version: v21.3.0"; "[ID]: ID or App Store Connect API URL of a single submission; workflow triggers expose `app_store_connect.beta_feedback.id` and `.url`."; "--offset: Starting index for pagination; defaults to 0."; "--limit: Items fetched per query; defaults to 20 and is capped at 200."; "--json: Enables JSON output; non-JSON messages go to stderr and the flag implies non-interactive mode."; "--profile: Submit profile from `eas.json` used to resolve the bundle identifier and App Store Connect API key; defaults to `production`."; "--type: Kind of feedback the ID refers to (`crash` or `screenshot`); only needed with a bare ID for screenshot feedback on `crashes` or crash feedback on `feedback`. A URL encodes the type."; "Prerequisite: Install EAS CLI (`npm install -g eas-cli` or `yarn global add eas-cli`)."; "Data is read from App Store Connect."; "Single-submission lookup accepts an ID or the App Store Connect URL exposed by EAS workflow triggers."

### eas observe:session drills down from event lists (2026-07-22)
- slug: eas-observe-session-drills-down-from-event-lists-c1ecebb909ee
- score: 0.95

How to use it:

When you need a session timeline but do not have a session ID, run `eas observe:session` interactively and choose an event name, sort order, then a candidate event. Set the candidate search with `--event-name`, `--sort`, and a time range if needed.

Examples:

```
eas observe:session --event-name <event-name> --sort <slowest|fastest|newest|oldest> --days <number>
```

```
eas observe:session --event-name <event-name> --sort <slowest|fastest|newest|oldest> --start <ISO-date> --end <ISO-date>
```

- why_it_matters: Inspect the session timeline for a selected event when working interactively without a session ID.
- before: Run `observe:session` with a session ID; without one, the non-interactive command still errors.
- sources: <https://github.com/expo/eas-cli/releases/tag/v21.0.3>, <https://github.com/expo/eas-cli/pull/3987>, <https://docs.expo.dev/eas/observe/eas-cli/>, <https://github.com/expo/eas-cli/blob/v21.0.3/packages/eas-cli/src/commands/observe/session.ts>
- gotchas: "Version: v21.0.3"; "--event-name <name>: Metric or user-defined event used to build the candidate list; prompts interactively if omitted."; "--sort <slowest|fastest|newest|oldest>: Orders candidate events. Prompts interactively if omitted. `slowest` and `fastest` apply to metrics; logs use `newest` or `oldest`."; "--days <number>: Limits results to the last N days; mutually exclusive with `--start` and `--end`."; "--start <ISO date>: Sets the start of an explicit time range; use with `--end`; mutually exclusive with `--days`."; "--end <ISO date>: Sets the end of an explicit time range; use with `--start`; mutually exclusive with `--days`."; "Prerequisite: Install EAS CLI, use an app already set up for EAS Observe, and authenticate with `eas login` from the project directory."; "Prerequisite: A logged-in EAS account with access to the project is required."; "Without a session ID, interactive selection is supported; non-interactive use without a session ID still errors."; "The event list shows up to 25 events."; "Docs conflict: The card says `--sort-order`; v21.0.3 source and current Expo docs name the flag `--sort`. The command accepts `--sort`, not `--sort-order`."

### eas browse opens project pages (2026-07-15)
- slug: eas-browse-opens-project-pages-958bafcddb3c
- score: 0.92

How to use it:

When working in a linked EAS project, run `eas browse` to open its Expo dashboard, optionally adding a supported subpage such as `build` or `hosting`; use `--no-browser` to print the URL. [v21.0.1 command source](https://github.com/expo/eas-cli/blob/v21.0.1/packages/eas-cli/src/commands/browse.ts)

Examples:

```
eas browse [PAGE]
```

```
eas browse build
```

```
eas browse hosting --no-browser
```

- why_it_matters: Open a project page or subpage on expo.dev while working in a project repository.
- sources: <https://github.com/expo/eas-cli/releases/tag/v21.0.1>, <https://github.com/expo/eas-cli/blob/v21.0.1/packages/eas-cli/src/commands/browse.ts>
- gotchas: "Version: v21.0.1"; "PAGE: Project subpage; accepted values: `build`, `builds`, `submit`, `submissions`, `update`, `updates`, `workflow`, `workflows`, `cicd`, `hosting`, `deployments`, `credentials`, `env`, `insights`, `observe`, `settings`. Omit for the project dashboard."; "--no-browser (-n): Print the URL instead of opening it in a browser."; "Prerequisite: The command requires project configuration and a logged-in session; the project context resolves the project ID and account."

### eas deploy accepts --dev-domain (2026-07-15)
- slug: eas-deploy-accepts-dev-domain-9530fcfd7d2c
- score: 0.94

How to use it:

For a first-time deployment, set the preview subdomain explicitly to run non-interactively. Run `eas deploy --non-interactive --dev-domain <name>`; the preview URL will be `<name>.expo.app`.

Examples:

```
eas deploy --non-interactive --dev-domain <name>
```

- why_it_matters: Deploy a project non-interactively while selecting its preview URL for a first-time deployment.
- before: On the first deployment, the CLI prompts you to choose a preview subdomain.
- sources: <https://github.com/expo/eas-cli/releases/tag/v21.0.1>, <https://github.com/expo/eas-cli>, <https://docs.expo.dev/deploy/web/>
- gotchas: "Version: v21.0.1"; "--dev-domain=<name>: Sets the custom preview URL subdomain for the project's first deployment; required with `--non-interactive` when customizing the preview URL."; "--non-interactive: Runs the command in non-interactive mode."; "Prerequisite: Install EAS CLI, log in to an Expo account, and link the project with `eas init`."; "This applies to first-time deploys."

### eas project:delete removes a project (2026-07-15)
- slug: eas-project-delete-removes-a-project-869f370ea389
- score: 0.98

How to use it:

When repository maintenance requires removing an EAS project, run `eas project:delete` for the project in the current directory or specify its full name or ID. Confirm interactively, or provide its full name with `--dangerously-confirm-deletion` in non-interactive mode.

Examples:

```
eas project:delete
```

```
eas project:delete <@account/slug-or-project-id>
```

```
eas project:delete <@account/slug-or-project-id> --dangerously-confirm-deletion <@account/slug> --non-interactive
```

- why_it_matters: Delete the current directory’s project or a specified project when removing a project is part of repository maintenance.
- before: Deletion was previously only possible from the website.
- sources: <https://github.com/expo/eas-cli/releases/tag/v21.0.1>, <https://github.com/expo/eas-cli/blob/v21.0.1/packages/eas-cli/src/commands/project/delete.ts>
- gotchas: "Version: v21.0.1"; "[NAME]: Full name (@account/slug) or project ID; defaults to the project in the current directory."; "--dangerously-confirm-deletion=<value>: Project full name (@account/slug) used to confirm deletion; required in non-interactive mode."; "--non-interactive: Run without interactive prompts."; "--json: Enable JSON output; implies non-interactive mode, which requires the confirmation flag."; "Deletion requires sudo mode when the server requires it; the command prompts for a password and OTP to upgrade the session."; "Non-interactive mode requires `--dangerously-confirm-deletion`."

### eas workflow:create adds template-based workflow generation (2026-07-13)
- slug: eas-workflow-create-adds-template-based-workflow-generation-55fc19091cc0
- score: 0.95

How to use it:

When generating a repository workflow, run `eas workflow:create --template <build|update|deploy|custom>` to select a template; for a placeholder, pass a file name without `--template`. The command creates the workflow under `.eas/workflows` and configures project services when the template requires them.

Examples:

```
eas workflow:create --template build
```

```
eas workflow:create --template update
```

```
eas workflow:create <filename>
```

- why_it_matters: Generate a build, update, deploy, or development-build workflow for a repository.
- sources: <https://github.com/expo/eas-cli/releases/tag/v21.0.0>, <https://docs.expo.dev/eas/workflows/get-started/>, <https://github.com/expo/eas-cli/blob/v21.0.0/packages/eas-cli/src/commands/workflow/create.ts>
- gotchas: "Version: v21.0.0"; "[NAME]: Workflow file name. Without `--template`, creates a placeholder workflow."; "--template: Selects `build`, `update`, `deploy`, or `custom`. These are allowed values; docs do not state they are mutually exclusive with one another. If omitted, the CLI prompts for a template unless a name is passed, which creates a placeholder."; "--skip-validation: Skips workflow validation before creation; defaults to false."; "Prerequisite: Install EAS CLI and sign in to an Expo account; workflow creation requires logged-in CLI context."; "Prerequisite: The CLI workflow creation command uses project configuration and VCS context."

### eas update:view accepts platform-specific update IDs (2026-06-18)
- slug: eas-update-view-accepts-platform-specific-update-ids-ff9a33828b06
- score: 0.91

How to use it:

When investigating a platform-specific update, run `eas update:view <UPDATE_ID>`; it resolves the ID to its update group and displays the group details.

Examples:

```
eas update:view <UPDATE_ID>
```

- why_it_matters: When investigating a platform-specific update for a project, resolve its ID to the update group and inspect the group.
- sources: <https://github.com/expo/eas-cli/releases/tag/v20.3.0>, <https://github.com/expo/eas-cli/blob/v20.3.0/packages/eas-cli/src/commands/update/view.ts>, <https://github.com/expo/eas-cli/blob/v20.3.0/packages/eas-cli/README.md>
- gotchas: "Version: v20.3.0"; "UPDATE_ID (required): An update group ID or the ID of a platform-specific update."; "Prerequisite: Install EAS CLI; log in to an Expo account."

### eas update:rollback supports non-interactive use (2026-06-15)
- slug: eas-update-rollback-supports-non-interactive-use-46d06d967dbc
- score: 0.92

How to use it:

When rolling back a published update group from a non-interactive workflow, run `eas update:rollback <GROUP_ID> --non-interactive`. The group must be latest for its branch and runtime version; the preceding group is republished, or the embedded update is published if there is no preceding group.

Examples:

```
eas update:rollback <GROUP_ID> --non-interactive
```

- why_it_matters: Roll back a published update group from a non-interactive coding workflow.
- before: The documented flow was to run `eas update:rollback` and use the interactive terminal guide to select and perform the rollback.
- sources: <https://github.com/expo/eas-cli/releases/tag/v20.2.0>, <https://github.com/expo/eas-cli/blob/v20.2.0/packages/eas-cli/README.md>, <https://docs.expo.dev/eas-update/rollbacks/>
- gotchas: "Version: v20.2.0"; "GROUP_ID (`[GROUPID]`) (required): ID of the update group to roll back; required in non-interactive mode. It must be the latest update for its branch and runtime version."; "`--non-interactive` (required): Runs the command in non-interactive mode."; "The given update group must be the latest for its branch and runtime version."

### eas integrations:convex:connect saves the Convex URL as an EAS environment variable (2026-05-12)
- slug: eas-integrations-convex-connect-saves-the-convex-url-as-an-eas-environment-varia-d0e45c04684a
- score: 0.94

How to use it:

When connecting a Convex project to an Expo project linked to EAS, run `eas integrations:convex:connect` to save `EXPO_PUBLIC_CONVEX_URL` as an EAS environment variable. If it already exists, follow the command’s prompt to avoid an accidental rewrite.

Examples:

```
eas integrations:convex:connect
```

```
eas integrations:convex:connect --region aws-us-east-1 --team-name "<team-name>" --project-name "<project-name>"
```

- why_it_matters: When connecting a Convex project for EAS deployments, save the Convex URL as an EAS environment variable.
- before: The Expo Convex guide previously instructed users to set the EAS environment variable manually; the release note says this integration automates that step.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.12.0>, <https://github.com/expo/eas-cli/pull/3685>, <https://docs.expo.dev/guides/using-convex/>, <https://github.com/expo/eas-cli>
- gotchas: "Version: v18.12.0"; "--region <region>: Convex deployment region; documented options include `aws-us-east-1` and `aws-eu-west-1`."; "--team-name <team-name>: Name for the new Convex team; defaults to the EAS account name."; "--project-name <project-name>: Name for the Convex project; defaults to the app slug."; "--non-interactive: Runs the command in non-interactive mode."; "Prerequisite: An Expo account, EAS CLI installed, and an Expo project linked to EAS with `eas init`."; "If the environment variable already exists, the command prompts the user to prevent accidental rewrites."; "Docs conflict: Current Expo documentation says the command creates or updates `EXPO_PUBLIC_CONVEX_URL` for production, preview, and development environments. The v18.12.0 release note says an existing variable triggers a prompt to prevent accidental rewrites; the current docs do not describe that prompt."

### eas build:dev and eas build:run accept --simulator (2026-05-05)
- slug: eas-build-dev-and-eas-build-run-accept-simulator-982c3b28e72a
- score: 0.98

How to use it:

When targeting a specific iOS simulator, pass its name or UDID with `--simulator` to `eas build:dev` or `eas build:run`. `build:run` also needs a build selector, such as `--latest`.

Examples:

```
eas build:dev --platform ios --simulator "<simulator name or UDID>"
```

```
eas build:run --platform ios --latest --simulator "<simulator name or UDID>"
```

- why_it_matters: When selecting an iOS simulator for a development build, choose the target simulator for installation and execution.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.11.0>, <https://docs.expo.dev/eas/cli/>
- gotchas: "Version: v18.11.0"; "--simulator <value>: iOS simulator name or UDID to install and run the build on; if omitted, the CLI prompts for a simulator."; "--platform <ios|android>: Selects the platform; use `ios` for this task."; "eas build:run build selector (`--latest`, `--id`, `--path`, or `--url`) (required): Selects the simulator/emulator build to run. The documented syntax presents these as alternatives."; "eas build:dev --profile: Selects a build profile; it must allow emulator/simulator internal-distribution development builds. Defaults to `development-simulator`."; "Prerequisite: For `build:dev`, use a build profile that allows emulator/simulator internal-distribution development builds; `development-simulator` is the default."

### eas build:download accepts a build ID (2026-04-30)
- slug: eas-build-download-accepts-a-build-id-ae2a9a0a50c8
- score: 0.96

How to use it:

When you know the build ID, download it with `eas build:download --build-id <build-id>`. The platform is derived from the build.

Examples:

```
eas build:download --build-id <build-id>
```

- why_it_matters: Download a build when you know its build ID.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.9.0>, <https://github.com/expo/eas-cli/blob/v18.9.0/packages/eas-cli/src/commands/build/download.ts>
- gotchas: "Version: v18.9.0"; "--build-id <value>: ID of the build to download; mutually exclusive with `--fingerprint`, `--platform`, and `--dev-client`. The platform is derived from the build."; "Prerequisite: The command requires a logged-in Expo account and a project ID."

### eas integrations:asc manages App Store Connect integrations (2026-04-30)
- slug: eas-integrations-asc-manages-app-store-connect-integrations-b6baf7550555
- score: 0.95

How to use it:

When managing an EAS project's App Store Connect link, use `eas integrations:asc:connect`, `disconnect`, or `status` for the needed operation.

Examples:

```
eas integrations:asc:connect [--api-key-id <API_KEY_ID>] [--asc-app-id <ASC_APP_ID>] [--bundle-id <BUNDLE_ID>] [--json] [--non-interactive]
```

```
eas integrations:asc:disconnect [--yes] [--json] [--non-interactive]
```

```
eas integrations:asc:status [--json] [--non-interactive]
```

- why_it_matters: Manage App Store Connect integrations for an EAS project.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.9.0>, <https://github.com/expo/eas-cli>
- gotchas: "Version: v18.9.0"; "--api-key-id <API_KEY_ID>: Apple App Store Connect API Key ID."; "--asc-app-id <ASC_APP_ID>: App Store Connect app identifier."; "--bundle-id <BUNDLE_ID>: Filter discovered apps by bundle identifier."; "--json: Enable JSON output; implies `--non-interactive`."; "--non-interactive: Run the command in non-interactive mode."; "--yes: Skip the disconnect confirmation prompt."

### build-tools adds eas/deploy for EAS Hosting web deployments (2026-04-22)
- slug: build-tools-adds-eas-deploy-for-eas-hosting-web-deployments-eea3c4a892e6
- score: 0.91

How to use it:

When a build-tools workflow deploys a web app to EAS Hosting, add an `eas/deploy` step after export. The step runs the deployment and exposes deployment output values to later steps.

Examples:

```
steps:
  - uses: eas/export
  - uses: eas/deploy
    id: deploy
```

- why_it_matters: Deploy a web app to EAS Hosting from a build-tools workflow.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.8.0>, <https://github.com/expo/eas-cli/pull/3598>
- gotchas: "Version: v18.8.0"; "uses: eas/deploy (required): Runs the EAS Hosting deployment function in a workflow step."; "id: Assigns the step identifier used to read its outputs, as in `${{ steps.deploy.outputs.deploy_url }}`."; "deploy_json, deploy_url, deploy_deployment_url, deploy_identifier, deploy_dashboard_url, deploy_alias_url: Documented step outputs; the PR example maps them to job outputs for later steps or jobs."; "Prerequisite: The example uses a `type: custom` job and includes `eas/checkout`, `eas/use_npm_token`, `eas/install_node_modules`, and `eas/export` before `eas/deploy`. The PR's failure example omits setup steps and is expected to fail."; "Prerequisite: The PR describes `eas/deploy` as streamlining the usual export-plus-deploy combination; its example explicitly runs `eas/export` before `eas/deploy`."

### eas channel:insights reports channel runtime metrics (2026-04-22)
- slug: eas-channel-insights-reports-channel-runtime-metrics-546e6bb3eb41
- score: 0.96

How to use it:

When maintaining an app release, run channel insights for the target channel and runtime version to review adoption and crash metrics.

Examples:

```
eas channel:insights --channel <name> --runtime-version <version>
```

- why_it_matters: Review adoption and crash metrics for a channel and runtime version while maintaining an app release.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.8.0>, <https://github.com/expo/eas-cli/blob/v18.8.0/packages/eas-cli/src/commands/channel/insights.ts>
- gotchas: "Version: v18.8.0"; "--channel <name> (required): Name of the channel."; "--runtime-version <version> (required): Runtime version to query insights for."; "Prerequisite: Requires a logged-in user and an Expo project ID."

### eas update:insights reports update-group metrics (2026-04-22)
- slug: eas-update-insights-reports-update-group-metrics-7648083c24af
- score: 0.96

How to use it:

When reviewing an update group's performance, run the command with its group ID to display launch, crash, unique-user, and size insights.

Examples:

```
eas update:insights <groupId>
```

- why_it_matters: Review update-group performance while maintaining an app release.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.8.0>, <https://github.com/expo/eas-cli/blob/v18.8.0/packages/eas-cli/src/commands/update/insights.ts>
- gotchas: "Version: v18.8.0"; "groupId (required): ID of an update group."; "--platform <ios|android>: Filter to a single platform; allowed values are ios and android."; "--days <N>: Show insights from the last N days; default is 7, minimum is 1. Mutually exclusive with --start and --end."; "--start <ISO date>: Start of the insights time range. Mutually exclusive with --days."; "--end <ISO date>: End of the insights time range. Mutually exclusive with --days."; "--json: Enable JSON output; implies --non-interactive."; "--non-interactive: Run the command without interactive prompts."; "Prerequisite: EAS CLI must be logged in; command context requires a logged-in user."

### eas build:dev supports --skip-bundler (2026-04-14)
- slug: eas-build-dev-supports-skip-bundler-dd03e168396d
- score: 0.96

How to use it:

When you want to install and run the development build without starting the bundler server, run `eas build:dev --skip-bundler`.

Examples:

```
eas build:dev --skip-bundler
```

- why_it_matters: Install and run a development build without starting the local Expo/Metro server.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.7.0>, <https://github.com/expo/eas-cli/blob/v18.7.0/packages/eas-cli/src/commands/build/dev.ts>
- gotchas: "Version: v18.7.0"; "--skip-bundler: Skip starting the bundler server; defaults to false."; "-p, --platform=<ios|android>: Select the iOS or Android platform."; "-e, --profile=<PROFILE_NAME>: Select the build profile from eas.json; it must allow emulator/simulator internal distribution development client builds. Defaults to `development-simulator`."; "Prerequisite: The selected build profile must allow emulator/simulator internal distribution development client builds."

### eas metadata:push and metadata:pull add non-interactive mode and ASC API Key authentication (2026-04-02)
- slug: eas-metadata-push-and-metadata-pull-add-non-interactive-mode-and-asc-api-key-aut-2d3d72f28fb8
- score: 0.91

How to use it:

When syncing iOS store metadata without prompts, use `eas metadata:push` to upload or `eas metadata:pull` to download and include `--non-interactive`. The v18.5.0 release adds ASC API Key authentication support for both commands.

Examples:

```
eas metadata:push --non-interactive
```

```
eas metadata:pull --non-interactive
```

- why_it_matters: When synchronizing app metadata without interactive prompts, run the metadata push or pull command with ASC API Key authentication configured.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.5.0>, <https://github.com/expo/eas-cli/blob/v18.5.0/packages/eas-cli/src/commands/metadata/push.ts>, <https://github.com/expo/eas-cli/blob/v18.5.0/packages/eas-cli/src/commands/metadata/pull.ts>
- gotchas: "Version: v18.5.0"; "--non-interactive: Run the command in non-interactive mode."; "-e, --profile <value>: Submit profile from eas.json; defaults to `production` if defined there."

### eas metadata:push and metadata:pull support screenshots and previews (2026-04-02)
- slug: eas-metadata-push-and-metadata-pull-support-screenshots-and-previews-fda80acb69ed
- score: 0.97

How to use it:

When syncing iOS App Store metadata for a repository, use `eas metadata:push` to upload the local store configuration, including screenshots and previews; use `eas metadata:pull` to generate it from the store. The commands support a submit profile and non-interactive mode.

Examples:

```
eas metadata:push [-e <profile>] [--non-interactive]
```

```
eas metadata:pull [-e <profile>] [--non-interactive]
```

- why_it_matters: When synchronizing app metadata for a repository, include screenshots and previews in the metadata transfer.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.5.0>, <https://docs.expo.dev/eas/cli/>, <https://docs.expo.dev/eas/metadata/getting-started/>
- gotchas: "Version: v18.5.0"; "-e, --profile=<value>: Submit profile from eas.json; defaults to `production` if defined there."; "--non-interactive: Run without interactive prompts."; "Prerequisite: EAS CLI installed; an Apple App Store app is required. EAS Metadata currently supports Apple App Store only."; "Prerequisite: Upload a new app binary and wait for it to be processed before pushing store configuration."

### eas commands with --json auto-enable --non-interactive (2026-03-09)
- slug: eas-commands-with-json-auto-enable-non-interactive-c00c80378b26
- score: 0.96

How to use it:

When running an EAS CLI command in an automated workflow, pass `--json` for JSON output; it also enables non-interactive mode. The command itself and any task-specific arguments depend on the operation.

Examples:

```
eas <command> --json
```

- why_it_matters: Run an eas command with JSON output in an automated workflow.
- before: Previously, users had to pass both `--json` and `--non-interactive` to request JSON output in non-interactive mode.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.2.0>, <https://docs.expo.dev/eas/cli/>, <https://github.com/expo/eas-cli/pull/3476>
- gotchas: "Version: v18.2.0"; "<command> (required): The EAS command for the task; choose from documented commands."; "--json: Enables JSON output and implies `--non-interactive`."; "--non-interactive: Runs the command in non-interactive mode. Passing `--json` implies this flag, so it need not also be passed."

### eas update commands require --environment for SDK 55 and later (2026-02-25)
- slug: eas-update-commands-require-environment-for-sdk-55-and-later-d01d6ddb0d54
- score: 0.94

How to use it:

For projects using Expo SDK 55 or later, include `--environment` when running `eas update`. Choose the EAS environment whose variables the update should use.

Examples:

```
eas update --channel <channel-name> --message "<message>" --environment <environment-name>
```

- why_it_matters: Run an update command for a project using SDK 55 or later.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.0.5>, <https://docs.expo.dev/eas-update/getting-started/>, <https://docs.expo.dev/eas/cli/>
- gotchas: "Version: v18.0.5"; "--environment <value> (required): EAS environment used for server-side environment variables during command execution; examples include production, preview, and development."; "--channel <value>: Channel the published update should affect."; "--message <value>: Short message describing the update."; "Applies to update commands when SDK is 55 or later."

### eas login supports browser-based authentication (2026-02-12)
- slug: eas-login-supports-browser-based-authentication-d95fd30aa9f1
- score: 0.94

How to use it:

When the repository requires EAS access, run `eas login --browser` to log in to your Expo account using a browser.

Examples:

```
eas login --browser
```

- why_it_matters: Authenticate with EAS CLI while working in a repository that requires EAS access.
- sources: <https://github.com/expo/eas-cli/releases/tag/v18.0.1>, <https://github.com/expo/eas-cli/blob/v18.0.1/packages/eas-cli/README.md>
- gotchas: "Version: v18.0.1"; "--browser: Log in with a browser; v18.0.1 documents this flag. The release note says it was added to `eas login`."; "Prerequisite: Install EAS CLI; the v18.0.1 README documents `npm install -g eas-cli` or `yarn global add eas-cli`."

### eas update adds bytecode and source map flags (2026-01-30)
- slug: eas-update-adds-bytecode-and-source-map-flags-c53f2b737d89
- score: 0.91

How to use it:

When publishing an update that needs bytecode disabled or source maps, pass the corresponding options to `eas update`. Use `--no-bytecode` to skip Hermes bytecode generation and `--source-maps inline` to embed source maps in the bundle.

Examples:

```
eas update --no-bytecode --source-maps inline
```

- why_it_matters: When publishing an update that needs bytecode or source map options, pass the corresponding flags to `eas update`.
- sources: <https://github.com/expo/eas-cli/releases/tag/v16.32.0>, <https://github.com/expo/eas-cli/pull/3339>, <https://docs.expo.dev/eas-update/getting-started/>
- gotchas: "Version: v16.32.0"; "--no-bytecode: Skips Hermes bytecode generation; the PR says it outputs plain JavaScript."; "--source-maps <mode>: Passes a source-map mode to Expo export. The PR documents `inline` as embedding source maps in the bundle. The flags are not documented as mutually exclusive."; "Prerequisite: Install EAS CLI and log in to an Expo account to publish updates."; "The source map mode syntax is not specified."; "Docs conflict: The release note names `--source-maps [mode]`; PR #3339 documents the flag and `inline` mode. No other mode values were verified."

### eas update:list filters by runtime version and platform (2026-01-30)
- slug: eas-update-list-filters-by-runtime-version-and-platform-a9542d5e1529
- score: 0.96

How to use it:

When inspecting published updates, use `--runtime-version` to filter by runtime version and `--platform` to filter by platform. Run `eas update:list` with either or both filters.

Examples:

```
eas update:list --runtime-version <runtime-version> --platform <android|ios|all>
```

- why_it_matters: When inspecting published updates for a project, narrow the update list by runtime version or platform.
- sources: <https://github.com/expo/eas-cli/releases/tag/v16.32.0>, <https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/README.md>, <https://github.com/expo/eas-cli/blob/v16.32.0/packages/eas-cli/src/commands/update/list.ts>
- gotchas: "Version: v16.32.0"; "--runtime-version <value>: Filter updates by runtime version."; "--platform <android|ios|all>: Filter updates by platform. Alias: `-p`."; "Prerequisite: The command requires a project ID and a logged-in Expo account."
