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).
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 --versionWithout a global install:
npx eas-cli@latest build -p iosRequire 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.0EAS CLI key facts
- Latest release: 24.12.1 on 2026-10-08 21:51 UTC (GitHub tag
v24.12.1; npm publish 21:53 UTC). Previous: 24.12.0 on 2026-10-07 21:17 UTC. - EAS CLI 24.12.0 added
assetMapUrlandsourceMapUrltoeas update:view --json, and itsworkflow:sshfix recognizesBUILD_NOT_FOUNDwhen a job run has no matching build. - EAS CLI 24.12.1 waits for a simulator session created before Ctrl+C to return, then stops it or tells you to use
eas simulator:stopand check witheas simulator:list. - iPhone Duo is on sale from 2026-10-23. Apple's 2026-10-05 notice says to recompile with Xcode 27.1; App Store Connect has accepted App Store uploads built with Xcode 27.1 RC since 2026-10-05, and from April 2027 every submission needs iPhone Duo screenshots.
- EAS Build's
latestiOS image ismacos-tahoe-26.5-xcode-26.6(Xcode 26.6). The Xcode 27.1 image ismacos-tahoe-26.6-xcode-27.1, which Expo's docs list asXcode 27.1 beta (27A9269)on 2026-10-07;sdk-58points tomacos-tahoe-26.6-xcode-27.0. - eas-cli 24.12.1 bundles
@expo/apple-utils2.2.1 (published 2026-09-15), whose screenshot and preview types contain noDUOvalue; the newest version on npm is still 2.2.1. eas metadata:lintacceptsAPP_IPHONE_DUO,IPHONE_DUOand made-up keys such asAPP_IPHONE_FOO;eas metadata:pushskips preview types it does not know (from source, see Gotchas).- Since 24.4.0 (2026-09-14) the package requires Node
^20.18.3 || >=22.0.0; on Node 20.17.0 npm only warns (EBADENGINE) and the CLI still runs. - Expo shipped 64 stable eas-cli versions to npm from 2026-05-01 to 2026-10-08. Four of them (19.0.2, 22.3.0, 22.4.0, 22.5.0) have no GitHub release, so watch npm too.
- MIT licence; 1,365 GitHub stars on 2026-10-10.
What changed in the last 5 EAS CLI releases?
EAS CLI 24.12.1 (2026-10-08 21:51 UTC)
eas simulatorwaits up to five seconds after Ctrl+C during session creation, then stops a session that arrives late; if it cannot confirm the stop, it printseas simulator:stopand explains how to check witheas simulator:list. (source)
EAS CLI 24.12.0 (2026-10-07 21:17 UTC)
eas workflow:sshrecognizesBUILD_NOT_FOUNDwhen a workflow job run ID has no matching build. (source)eas update:view --jsonnow returns signedassetMapUrlandsourceMapUrlvalues, or null when the update has no corresponding file. (source)- Custom builds using
eas/buildnow upload the embedded bundle througheas/upload_embedded_bundle;eas/buildignores 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
sipsandcwebpinstead of FFmpeg's unavailable WebP encoder; Android keeps FFmpeg. (source)
EAS CLI 24.11.0 (2026-10-05 22:03 UTC)
eas login --deviceuses a browser device grant; with--non-interactive,CI=1or 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_sessionworkflow step; useeas/start_agent_device_session. (source)
EAS CLI 24.10.0 (2026-10-02 20:55 UTC)
eas simulator --network-capturerecords HTTP(S) traffic from apps on the remote device;--network-capture-fieldalso keeps headers, query values or bodies. (source)
EAS CLI 24.9.0 (2026-10-02 17:35 UTC)
--force-end-active-rolloutoneas update,update:republish,update:roll-back-to-embeddedandupdate:rollback. (source)eas update --upload-source-mapsuploads source maps (withoutsourcesContent) 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=0to turn it off. (source) eas workflow:validateno 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
--helpsurface has no command or flag changes. The only text difference is the rooteas --helpversion 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.
| Command | Flags added | Flags removed |
|---|---|---|
eas account:login | --device--match--non-interactive--resume | none |
eas login | --device--match--non-interactive--resume | none |
- These are the last two minor versions. The only command-line change is device login:
eas login(alias ofeas account:login) gains--device,--match,--resumeand--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:advisorseas simulatoreas simulator:availabilityeas simulator:egresseas simulator:eventseas simulator:execeas simulator:geteas simulator:listeas simulator:stop
Commands removed:
eas sim
- The
eas simulator:*commands existed before 24.8.0 but were hidden fromeas --help; PR #4456 made them visible, so they show here as added. eas simshows as removed because it became a hidden alias (PR #4457). It still runs:eas sim --helpprints theeas simulatorhelp 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:protecteas channel:unprotecteas observe:errorseas observe:eventeas project:statuseas status
| Command | Flags added | Flags removed |
|---|---|---|
eas observe:events | --build-number--environment | none |
eas observe:metrics | --build-number--environment | none |
eas observe:metrics-summary | --environment | none |
eas observe:routes | --environment | none |
eas observe:session | --environment | none |
eas observe:versions | --environment | none |
- The 24.0.0 breaking change is in
--jsonoutput ofeas observe:*(field renames), which a--helpdiff cannot show; see Breaking changes.
What breaks when upgrading EAS CLI, and how do I migrate?
| Version | Change | Migration |
|---|---|---|
| 24.4.0 | eas-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.0 | eas 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.0 | The 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.0 | Build 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.0 | Removed 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.0 | Observe 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=0Fix: 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 privacyPolicyUrlEAS 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=0Fix: 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 1Fix: 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.0npm 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 simulatorcleans up a session that finishes after Ctrl+C during creation. (source) - 24.12.0:
eas workflow:sshhandlesBUILD_NOT_FOUND;eas update:view --jsonreturns 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-rollouton 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; newobserve: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 inbuild:dev,build:runandrun. (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)
2026-07: 20.5.1 to 21.4.0 (9 releases)
2026-06: 20.1.0 to 20.5.0 (5 releases)
2026-05: 18.10.0 to 20.0.0 (18 releases)
Sources
- expo/eas-cli releases (GitHub API) (read 2026-10-10)
- eas-cli on the npm registry (read 2026-10-10)
- EAS CLI 24.12.1 release notes (read 2026-10-10)
- EAS CLI 24.12.0 release notes (read 2026-10-10)
- PR #4522: simulator cancellation cleanup (read 2026-10-10)
- PR #4529: workflow:ssh missing-build handling (read 2026-10-10)
- PR #4534: update map URLs (read 2026-10-10)
- PR #4494: embedded bundle upload for custom builds (read 2026-10-10)
- PR #4557: embedded bundle upload logs (read 2026-10-10)
- PR #4556: mitmproxy quarantine handling (read 2026-10-10)
- PR #4549: macOS simulator preview encoding (read 2026-10-10)
- EAS CLI 24.11.0 release notes (read 2026-10-07)
- EAS CLI 24.10.0 release notes (read 2026-10-07)
- EAS CLI 24.9.0 release notes (read 2026-10-07)
- EAS CLI 24.8.0 release notes (read 2026-10-07)
- EAS CLI 24.4.0 release notes (Node requirement) (read 2026-10-07)
- EAS CLI 24.0.0 release notes (observe JSON) (read 2026-10-07)
- PR #4502: resumable device login (read 2026-10-07)
- eas-cli previews.ts at v24.11.0 (unknown preview types skipped) (read 2026-10-07)
- eas-cli metadata JSON schema at v24.11.0 (read 2026-10-07)
- @expo/apple-utils on the npm registry (read 2026-10-07)
- Expo docs: Build server infrastructure (images and aliases) (read 2026-10-07)
- Expo SDK 58 Beta changelog (2026-09-15) (read 2026-10-07)
- Apple: Prepare and submit your apps for iPhone Duo (2026-10-05) (read 2026-10-07)
- App Store Connect release notes (Xcode 27.1 RC uploads, 2026-10-05) (read 2026-10-07)
- Expo docs: programmatic access (EXPO_TOKEN) (read 2026-10-07)
- expo/eas-cli repository (stars, licence) (read 2026-10-10)
Last verified: 2026-10-10.