Tool pages / EAS CLI

EAS CLI 24.12.1: latest version, 24.11.0 diff and release gotchas

Latest: EAS CLI 24.12.1, released (release notes).

Last verified 2026-10-10 against 24.12.1. Page updated . Also as Markdown and JSON.

The latest EAS CLI (eas, npm eas-cli) is 24.12.1, released 2026-10-08 21:51 UTC. Upgrade with npm i -g eas-cli@latest. Our 24.11.0 to 24.12.1 --help snapshots show 0 commands and 0 flags added or removed; only the root version banner changed. EAS CLI 24.12.0 adds assetMapUrl and sourceMapUrl to eas update:view --json and handles missing builds in eas workflow:ssh; 24.12.1 stops a simulator session that finishes after Ctrl+C during eas simulator. These remote paths need an Expo account, so their server responses were not reproduced here. For iPhone Duo, Apple asks for apps built with Xcode 27.1, but the EAS Build latest iOS image still ships Xcode 26.6: set "image": "macos-tahoe-26.6-xcode-27.1" in the iOS build profile.

How do I install or upgrade to EAS CLI 24.12.1?

npm:

npm i -g eas-cli@latest
eas --version

Without a global install:

npx eas-cli@latest build -p ios

Require a minimum version in eas.json:

{
  "cli": { "version": ">= 24.12.1" }
}

Pin a version (for example the last one before the Node requirement rose):

npm i -g eas-cli@24.3.0

EAS CLI key facts

What changed in the last 5 EAS CLI releases?

EAS CLI 24.12.1 (2026-10-08 21:51 UTC)

  • eas simulator waits up to five seconds after Ctrl+C during session creation, then stops a session that arrives late; if it cannot confirm the stop, it prints eas simulator:stop and explains how to check with eas simulator:list. (source)

EAS CLI 24.12.0 (2026-10-07 21:17 UTC)

  • eas workflow:ssh recognizes BUILD_NOT_FOUND when a workflow job run ID has no matching build. (source)
  • eas update:view --json now returns signed assetMapUrl and sourceMapUrl values, or null when the update has no corresponding file. (source)
  • Custom builds using eas/build now upload the embedded bundle through eas/upload_embedded_bundle; eas/build ignores an upload error so the build continues. (source)
  • Embedded bundle uploads now show progress and registration output in build logs. (source)
  • iOS network-capture sessions remove the mitmproxy quarantine attribute and warn instead of launching a stuck process when cleanup fails. (source)
  • macOS simulator previews use sips and cwebp instead of FFmpeg's unavailable WebP encoder; Android keeps FFmpeg. (source)

EAS CLI 24.11.0 (2026-10-05 22:03 UTC)

  • eas login --device uses a browser device grant; with --non-interactive, CI=1 or closed stdin each call does one step and prints the next, so an agent can resume with --resume <id> --match <number>. (source)
  • Build workers retry App Store Connect connection failures and recover interrupted status reads and upload commits. (source)
  • Removed the eas/start_agent_device_remote_session workflow step; use eas/start_agent_device_session. (source)

EAS CLI 24.10.0 (2026-10-02 20:55 UTC)

  • eas simulator --network-capture records HTTP(S) traffic from apps on the remote device; --network-capture-field also keeps headers, query values or bodies. (source)

EAS CLI 24.9.0 (2026-10-02 17:35 UTC)

  • --force-end-active-rollout on eas update, update:republish, update:roll-back-to-embedded and update:rollback. (source)
  • eas update --upload-source-maps uploads source maps (without sourcesContent) so update stack traces can be symbolicated. (source)
  • Builds for SDK 58 and later upload the embedded bundle by default; set EAS_UPDATE_UPLOAD_EMBEDDED_BUNDLE=0 to turn it off. (source)
  • eas workflow:validate no longer crashes on some schemas and exits non-zero when validation fails. (source)
  • App Store Connect requests rejected for missing or expired Apple agreements now explain how to fix them. (source)

Which EAS CLI commands and flags were added or removed?

EAS CLI 24.11.0 → 24.12.1

0 commands added, 0 removed, 0 commands with flags added or removed; 1 help pages changed in any way.

Method: bin/tool-snapshot ran --help for every eas subcommand of both versions in a throwaway Linux sandbox (171 and 171 help pages), then bin/tool-diff compared them. Hidden flags do not appear in --help.

  • The 24.11.0 to 24.12.1 --help surface has no command or flag changes. The only text difference is the root eas --help version banner; the release-note behavior changes are not visible in --help.

EAS CLI 24.10.0 → 24.11.0

0 commands added, 0 removed, 2 commands with flags added or removed; 3 help pages changed in any way.

Method: bin/tool-snapshot ran --help for every eas subcommand of both versions in a throwaway Linux sandbox (171 and 171 help pages), then bin/tool-diff compared them. Hidden flags do not appear in --help.

CommandFlags addedFlags removed
eas account:login--device--match--non-interactive--resumenone
eas login--device--match--non-interactive--resumenone
  • These are the last two minor versions. The only command-line change is device login: eas login (alias of eas account:login) gains --device, --match, --resume and --non-interactive, so an agent can log in without a terminal prompt (PR #4502).

EAS CLI 24.7.0 → 24.8.0

9 commands added, 1 removed, 0 commands with flags added or removed; 3 help pages changed in any way.

Method: bin/tool-snapshot ran --help for every eas subcommand of both versions in a throwaway Linux sandbox (163 and 171 help pages), then bin/tool-diff compared them. Hidden flags do not appear in --help.

Commands added:

  • eas integrations:supabase:advisors
  • eas simulator
  • eas simulator:availability
  • eas simulator:egress
  • eas simulator:events
  • eas simulator:exec
  • eas simulator:get
  • eas simulator:list
  • eas simulator:stop

Commands removed:

  • eas sim
  • The eas simulator:* commands existed before 24.8.0 but were hidden from eas --help; PR #4456 made them visible, so they show here as added.
  • eas sim shows as removed because it became a hidden alias (PR #4457). It still runs: eas sim --help prints the eas simulator help on 24.11.0.

EAS CLI 23.2.0 → 24.0.0

6 commands added, 0 removed, 6 commands with flags added or removed; 10 help pages changed in any way.

Method: bin/tool-snapshot ran --help for every eas subcommand of both versions in a throwaway Linux sandbox (155 and 161 help pages), then bin/tool-diff compared them. Hidden flags do not appear in --help.

Commands added:

  • eas channel:protect
  • eas channel:unprotect
  • eas observe:errors
  • eas observe:event
  • eas project:status
  • eas status
CommandFlags addedFlags removed
eas observe:events--build-number--environmentnone
eas observe:metrics--build-number--environmentnone
eas observe:metrics-summary--environmentnone
eas observe:routes--environmentnone
eas observe:session--environmentnone
eas observe:versions--environmentnone
  • The 24.0.0 breaking change is in --json output of eas observe:* (field renames), which a --help diff cannot show; see Breaking changes.

What breaks when upgrading EAS CLI, and how do I migrate?

VersionChangeMigration
24.4.0eas-cli requires Node ^20.18.3 || >=22.0.0.Use Node 22 or 24 (or 20.18.3+). Older Node gets an npm EBADENGINE warning at install, not a hard stop.
24.0.0eas observe:* --json output renamed fields: metricName/metricValue → name/value, eventName → name; eas observe:events lists user-defined events only and exceptions moved to the new eas observe:errors.Update scripts that parse observe JSON; use eas observe:errors (with --fingerprint) for exceptions.
23.0.0The EAS Simulator preview-only session type was renamed from --type serve-sim to --type web-preview-only.eas simulator --type serve-sim → eas simulator --type web-preview-only.
22.0.0Build objects in --json output (eas build, build:list, build:view, build:resign) have app, updateChannel {id, name} and runtime {id, version} instead of project, channel and runtimeVersion; eas update:republish --json has runtime instead of runtimeVersion.Read .app, .updateChannel.name and .runtime.version in scripts and agents.
21.0.0Removed eas onboarding and its aliases init:onboarding and project:onboarding.Use eas init to create or link a project, or eas new for a new one.
20.0.0Observe commands renamed: observe:logs → observe:events, the old observe:events → observe:metrics, the old observe:metrics → observe:metrics-summary.Rename the commands in scripts; note the same names now mean different data.

What EAS CLI errors did we reproduce, and how do I fix them?

`eas metadata:lint` passes iPhone Duo and made-up display types (EAS CLI 24.11.0)

# store.config.json (en-US): "screenshots": {"APP_IPHONE_DUO": [...], "APP_IPHONE_FOO": [...]}, "previews": {"IPHONE_DUO": "./previews/duo.mp4"}
eas metadata:lint; echo "exit=$?"
EAS Metadata is in beta and subject to breaking changes.
✅ Store configuration is valid.
exit=0

Fix: Lint checks the JSON schema, which allows any key under screenshots and previews. It does not prove EAS can upload a Duo asset. Check display types against Apple's screenshot specifications, or upload Duo assets with a tool that lists them (for example asc 5.12.0+, see /tools/asc). (source)

`eas metadata:push` skips preview types its Apple library does not know (IPHONE_DUO) (EAS CLI 24.11.0)

eas metadata:push   # store.config.json has "previews": {"IPHONE_DUO": "./previews/duo.mp4"}
Log.warn(chalk`{yellow Unknown preview type {bold ${previewType}} for ${localeCode}, skipping.${suggestion}}`);
# source line in packages/eas-cli/src/metadata/apple/tasks/previews.ts at v24.11.0; not run, because push needs an Expo and App Store Connect login.
# The check uses ALL_PREVIEW_TYPES from @expo/apple-utils 2.2.1, which has no DUO value in our sandbox grep.

Fix: Upload iPhone Duo app previews outside eas metadata:push until an eas-cli release adds the type. Screenshot display types are not checked this way: they are sent to App Store Connect as written, so Apple decides. (source)

`eas metadata:lint` exits 0 even when it finds errors (EAS CLI 24.11.0)

eas metadata:lint; echo "exit=$?"   # en-US entry without privacyPolicyUrl
EAS Metadata is in beta and subject to breaking changes.

Metadata store config errors found
  - $.apple.info.en-US The value at /apple/info/en-US is missing the required field 'privacyPolicyUrl'.

exit=0

Fix: In CI, use eas metadata:lint --json and fail when the array is not empty, for example test "$(eas metadata:lint --json | jq length)" = 0. (source)

Non-interactive commands without a login or EXPO_TOKEN (EAS CLI 24.11.0)

eas build -p ios --profile production --non-interactive </dev/null; echo "exit=$?"
An Expo user account is required to proceed.
Either log in with eas login or set the EXPO_TOKEN environment variable if you're using EAS CLI on CI (Learn more: https://docs.expo.dev/accounts/programmatic-access/)
exit=1

    Error: build command failed.

Fix: Set EXPO_TOKEN (an access token from expo.dev) or, for an agent working with a person, use eas login --device --non-interactive. A wrong token fails differently: The bearer token is invalid. followed by Error: GraphQL request failed. (source)

`eas login --non-interactive` alone does not log in (EAS CLI 24.11.0)

eas login --non-interactive </dev/null; echo "exit=$?"
Use eas login --device --non-interactive to log in without prompts.
exit=1

    Error: account:login command failed.

Fix: Run eas login --device --non-interactive, give the printed URL and code to the person, then run eas login --device --non-interactive --resume <request id> --match <number>. --resume without --device fails with All of the following must be provided when using --resume: --device. (source)

`Run this command inside a project directory.` with app.json present (EAS CLI 24.11.0)

ls   # app.json eas.json store.config.json, no package.json
eas metadata:lint; echo "exit=$?"
Run this command inside a project directory.
exit=1

    Error: metadata:lint command failed.

Fix: Run EAS CLI from the app directory that has a package.json (in a monorepo, the app's own directory). In our sandbox the same folder passed once a minimal package.json was added. (source)

Removed and renamed commands (EAS CLI 24.11.0)

eas onboarding; eas observe:logs; eas simulator --type serve-sim --non-interactive
 ›   Error: command onboarding not found
# exit 2
 ›   Error: command observe:logs not found
# exit 2
Expected --type=serve-sim to be one of: agent-device, appium, argent, web-preview-only
See more help with --help
# exit 1

Fix: eas onboarding was removed in 21.0.0 (use eas init); observe:logs is observe:events since 20.0.0; --type serve-sim is --type web-preview-only since 23.0.0. (source)

Node 20.17 installs with a warning, not an error (EAS CLI 24.11.0)

npx -y -p node@20.17.0 -- npm i eas-cli@24.11.0
npm warn EBADENGINE Unsupported engine {
npm warn EBADENGINE   package: 'eas-cli@24.11.0',
npm warn EBADENGINE   required: { node: '^20.18.3 || >=22.0.0' },
npm warn EBADENGINE   current: { node: 'v20.17.0', npm: '11.19.0' }
npm warn EBADENGINE }

Fix: The CLI still started on 20.17.0 in our sandbox (eas-cli/24.11.0 linux-x64 node-v20.17.0), but it is outside the supported range; use Node 22 or 24. (source)

`eas simulator create` is not a valid invocation (EAS CLI 24.12.1)

eas simulator create --non-interactive </dev/null; echo "simulator create exit=$?"
Unexpected argument: create
See more help with --help
simulator create exit=1
    Error: simulator command failed.

Fix: eas simulator is the root command. Omit create and pass the session options directly, such as --platform, --build-id or --type. Use eas simulator:stop for a known session. (source)

EAS CLI release history by month

2026-10: 24.9.0 to 24.12.1 (5 releases to 2026-10-08)

  • 24.12.1: eas simulator cleans up a session that finishes after Ctrl+C during creation. (source)
  • 24.12.0: eas workflow:ssh handles BUILD_NOT_FOUND; eas update:view --json returns signed source-map and asset-map URLs. (source)
  • 24.11.0: resumable device login for agents (eas login --device --non-interactive). (source)
  • 24.9.0: --force-end-active-rollout on update commands, eas update --upload-source-maps, embedded bundle upload on by default for SDK 58. (source)

2026-09: 24.0.0 to 24.8.0 (13 releases)

  • 24.0.0: eas observe:* JSON fields renamed; new observe:errors, observe:event, channel:protect, channel:unprotect, eas status. (source)
  • 24.4.0 requires Node ^20.18.3 || >=22.0.0; 24.4.2 supports Xcode 27's Device Hub in build:dev, build:run and run. (source)
  • 24.8.0 made eas simulator:* visible and accepts individual App Store Connect API keys. (source)

2026-08: 21.5.0 to 23.2.0 (14 releases; 22.3.0 to 22.5.0 on npm only)

  • 21.5.0 added eas submit:list, submit:view, submit:retry, submit:cancel and submit:status. (source)
  • 22.0.0 renamed build JSON fields (app, updateChannel, runtime); 23.0.0 renamed --type serve-sim to web-preview-only. (source)

2026-07: 20.5.1 to 21.4.0 (9 releases)

  • 21.0.0 removed eas onboarding. (source)
  • 21.3.0 added eas testflight:feedback and eas testflight:crashes. (source)

2026-06: 20.1.0 to 20.5.0 (5 releases)

  • 20.1.0 added eas update:embedded:list, :view and :delete; 20.3.0 added eas account:audit and the PostHog integration commands. (source)
  • 20.2.0: non-interactive App Store builds can repair provisioning profiles with the stored App Store Connect API key, without EXPO_ASC_* variables. (source)

2026-05: 18.10.0 to 20.0.0 (18 releases)

  • 19.0.0 made browser login the default for eas login (--no-browser for the old flow). (source)
  • 20.0.0 renamed observe:logs → observe:events, observe:events → observe:metrics, observe:metrics → observe:metrics-summary. (source)

Sources

Last verified: 2026-10-10.