{
  "tool": "eas",
  "name": "EAS CLI",
  "long_name": "Expo Application Services CLI (eas-cli)",
  "aliases": [
    "eas-cli",
    "expo-eas",
    "expo-eas-cli",
    "expo-application-services",
    "expo-application-services-cli"
  ],
  "homepage": "https://github.com/expo/eas-cli",
  "url": "https://insidetheloop.dev/tools/eas",
  "markdown_url": "https://insidetheloop.dev/tools/eas.md",
  "date_modified": "2026-10-10T11:27:00Z",
  "title": "EAS CLI 24.12.1: latest version, 24.11.0 diff and release gotchas",
  "description": "EAS CLI 24.12.1 (2026-10-08 UTC): upgrade, the 24.11.0→24.12.1 diff, update map URLs, workflow:ssh and simulator fixes, and account-gated paths.",
  "answer": "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.",
  "latest": {
    "version": "24.12.1",
    "released_at": "2026-10-08T21:51:33Z",
    "url": "https://github.com/expo/eas-cli/releases/tag/v24.12.1"
  },
  "upgrade": [
    {
      "label": "npm",
      "command": "npm i -g eas-cli@latest\neas --version"
    },
    {
      "label": "Without a global install",
      "command": "npx eas-cli@latest build -p ios"
    },
    {
      "label": "Require a minimum version in eas.json",
      "command": "{\n  \"cli\": { \"version\": \">= 24.12.1\" }\n}"
    },
    {
      "label": "Pin a version (for example the last one before the Node requirement rose)",
      "command": "npm i -g eas-cli@24.3.0"
    }
  ],
  "verified": {
    "date": "2026-10-10",
    "version": "24.12.1",
    "method": "Installed eas-cli 24.11.0 and 24.12.1 from npm in throwaway Linux sandboxes with no Expo or Apple credentials, captured `--help` for every listed command (171 pages for each), and ran `bin/tool-diff`. The 24.11.0 to 24.12.1 diff has 0 commands and 0 flags added or removed; only the root version banner changed. A credential-free 24.12.1 probe of `workflow:ssh` and `update:view --json` stopped at the Expo account gate. The attempted `eas simulator create` form was rejected because `create` is not an argument to the root `eas simulator` command."
  },
  "updated_at": "2026-10-10T11:27:00Z",
  "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 `assetMapUrl` and `sourceMapUrl` to `eas update:view --json`, and its `workflow:ssh` fix recognizes `BUILD_NOT_FOUND` when 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:stop` and check with `eas 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 `latest` iOS image is `macos-tahoe-26.5-xcode-26.6` (Xcode 26.6). The Xcode 27.1 image is `macos-tahoe-26.6-xcode-27.1`, which Expo's docs list as `Xcode 27.1 beta (27A9269)` on 2026-10-07; `sdk-58` points to `macos-tahoe-26.6-xcode-27.0`.",
    "eas-cli 24.12.1 bundles `@expo/apple-utils` 2.2.1 (published 2026-09-15), whose screenshot and preview types contain no `DUO` value; the newest version on npm is still 2.2.1.",
    "`eas metadata:lint` accepts `APP_IPHONE_DUO`, `IPHONE_DUO` and made-up keys such as `APP_IPHONE_FOO`; `eas metadata:push` skips 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."
  ],
  "releases": [
    {
      "version": "24.12.1",
      "released_at": "2026-10-08T21:51:33Z",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.12.1",
      "changes": [
        {
          "text": "`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`.",
          "url": "https://github.com/expo/eas-cli/pull/4522"
        }
      ]
    },
    {
      "version": "24.12.0",
      "released_at": "2026-10-07T21:17:55Z",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.12.0",
      "changes": [
        {
          "text": "`eas workflow:ssh` recognizes `BUILD_NOT_FOUND` when a workflow job run ID has no matching build.",
          "url": "https://github.com/expo/eas-cli/pull/4529"
        },
        {
          "text": "`eas update:view --json` now returns signed `assetMapUrl` and `sourceMapUrl` values, or null when the update has no corresponding file.",
          "url": "https://github.com/expo/eas-cli/pull/4534"
        },
        {
          "text": "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.",
          "url": "https://github.com/expo/eas-cli/pull/4494"
        },
        {
          "text": "Embedded bundle uploads now show progress and registration output in build logs.",
          "url": "https://github.com/expo/eas-cli/pull/4557"
        },
        {
          "text": "iOS network-capture sessions remove the mitmproxy quarantine attribute and warn instead of launching a stuck process when cleanup fails.",
          "url": "https://github.com/expo/eas-cli/pull/4556"
        },
        {
          "text": "macOS simulator previews use `sips` and `cwebp` instead of FFmpeg's unavailable WebP encoder; Android keeps FFmpeg.",
          "url": "https://github.com/expo/eas-cli/pull/4549"
        }
      ]
    },
    {
      "version": "24.11.0",
      "released_at": "2026-10-05T22:03:01Z",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.11.0",
      "changes": [
        {
          "text": "`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>`.",
          "url": "https://github.com/expo/eas-cli/pull/4502"
        },
        {
          "text": "Build workers retry App Store Connect connection failures and recover interrupted status reads and upload commits.",
          "url": "https://github.com/expo/eas-cli/pull/4520"
        },
        {
          "text": "Removed the `eas/start_agent_device_remote_session` workflow step; use `eas/start_agent_device_session`.",
          "url": "https://github.com/expo/eas-cli/pull/4518"
        }
      ]
    },
    {
      "version": "24.10.0",
      "released_at": "2026-10-02T20:55:55Z",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.10.0",
      "changes": [
        {
          "text": "`eas simulator --network-capture` records HTTP(S) traffic from apps on the remote device; `--network-capture-field` also keeps headers, query values or bodies.",
          "url": "https://github.com/expo/eas-cli/pull/4308"
        }
      ]
    },
    {
      "version": "24.9.0",
      "released_at": "2026-10-02T17:35:45Z",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.9.0",
      "changes": [
        {
          "text": "`--force-end-active-rollout` on `eas update`, `update:republish`, `update:roll-back-to-embedded` and `update:rollback`.",
          "url": "https://github.com/expo/eas-cli/pull/4233"
        },
        {
          "text": "`eas update --upload-source-maps` uploads source maps (without `sourcesContent`) so update stack traces can be symbolicated.",
          "url": "https://github.com/expo/eas-cli/pull/4436"
        },
        {
          "text": "Builds for SDK 58 and later upload the embedded bundle by default; set `EAS_UPDATE_UPLOAD_EMBEDDED_BUNDLE=0` to turn it off.",
          "url": "https://github.com/expo/eas-cli/pull/4433"
        },
        {
          "text": "`eas workflow:validate` no longer crashes on some schemas and exits non-zero when validation fails.",
          "url": "https://github.com/expo/eas-cli/pull/4507"
        },
        {
          "text": "App Store Connect requests rejected for missing or expired Apple agreements now explain how to fix them.",
          "url": "https://github.com/expo/eas-cli/pull/4513"
        }
      ]
    }
  ],
  "surface": [
    {
      "from": "24.11.0",
      "to": "24.12.1",
      "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`.",
      "summary": "0 commands added, 0 removed, 0 commands with flags added or removed; 1 help pages changed in any way.",
      "commands_added": [],
      "commands_removed": [],
      "flags": [],
      "notes": [
        "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`."
      ]
    },
    {
      "from": "24.10.0",
      "to": "24.11.0",
      "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`.",
      "summary": "0 commands added, 0 removed, 2 commands with flags added or removed; 3 help pages changed in any way.",
      "commands_added": [],
      "commands_removed": [],
      "flags": [
        {
          "command": "eas account:login",
          "added": [
            "--device",
            "--match",
            "--non-interactive",
            "--resume"
          ],
          "removed": []
        },
        {
          "command": "eas login",
          "added": [
            "--device",
            "--match",
            "--non-interactive",
            "--resume"
          ],
          "removed": []
        }
      ],
      "notes": [
        "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)."
      ]
    },
    {
      "from": "24.7.0",
      "to": "24.8.0",
      "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`.",
      "summary": "9 commands added, 1 removed, 0 commands with flags added or removed; 3 help pages changed in any way.",
      "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"
      ],
      "flags": [],
      "notes": [
        "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."
      ]
    },
    {
      "from": "23.2.0",
      "to": "24.0.0",
      "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`.",
      "summary": "6 commands added, 0 removed, 6 commands with flags added or removed; 10 help pages changed in any way.",
      "commands_added": [
        "eas channel:protect",
        "eas channel:unprotect",
        "eas observe:errors",
        "eas observe:event",
        "eas project:status",
        "eas status"
      ],
      "commands_removed": [],
      "flags": [
        {
          "command": "eas observe:events",
          "added": [
            "--build-number",
            "--environment"
          ],
          "removed": []
        },
        {
          "command": "eas observe:metrics",
          "added": [
            "--build-number",
            "--environment"
          ],
          "removed": []
        },
        {
          "command": "eas observe:metrics-summary",
          "added": [
            "--environment"
          ],
          "removed": []
        },
        {
          "command": "eas observe:routes",
          "added": [
            "--environment"
          ],
          "removed": []
        },
        {
          "command": "eas observe:session",
          "added": [
            "--environment"
          ],
          "removed": []
        },
        {
          "command": "eas observe:versions",
          "added": [
            "--environment"
          ],
          "removed": []
        }
      ],
      "notes": [
        "The 24.0.0 breaking change is in `--json` output of `eas observe:*` (field renames), which a `--help` diff cannot show; see Breaking changes."
      ]
    }
  ],
  "breaking": [
    {
      "version": "24.4.0",
      "change": "eas-cli requires Node `^20.18.3 || >=22.0.0`.",
      "migrate": "Use Node 22 or 24 (or 20.18.3+). Older Node gets an npm `EBADENGINE` warning at install, not a hard stop.",
      "url": "https://github.com/expo/eas-cli/pull/4279"
    },
    {
      "version": "24.0.0",
      "change": "`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`.",
      "migrate": "Update scripts that parse `observe` JSON; use `eas observe:errors` (with `--fingerprint`) for exceptions.",
      "url": "https://github.com/expo/eas-cli/pull/4338"
    },
    {
      "version": "23.0.0",
      "change": "The EAS Simulator preview-only session type was renamed from `--type serve-sim` to `--type web-preview-only`.",
      "migrate": "`eas simulator --type serve-sim` → `eas simulator --type web-preview-only`.",
      "url": "https://github.com/expo/eas-cli/pull/4298"
    },
    {
      "version": "22.0.0",
      "change": "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`.",
      "migrate": "Read `.app`, `.updateChannel.name` and `.runtime.version` in scripts and agents.",
      "url": "https://github.com/expo/eas-cli/pull/4021"
    },
    {
      "version": "21.0.0",
      "change": "Removed `eas onboarding` and its aliases `init:onboarding` and `project:onboarding`.",
      "migrate": "Use `eas init` to create or link a project, or `eas new` for a new one.",
      "url": "https://github.com/expo/eas-cli/pull/3993"
    },
    {
      "version": "20.0.0",
      "change": "Observe commands renamed: `observe:logs` → `observe:events`, the old `observe:events` → `observe:metrics`, the old `observe:metrics` → `observe:metrics-summary`.",
      "migrate": "Rename the commands in scripts; note the same names now mean different data.",
      "url": "https://github.com/expo/eas-cli/pull/3778"
    }
  ],
  "gotchas": [
    {
      "title": "`eas metadata:lint` passes iPhone Duo and made-up display types",
      "version": "24.11.0",
      "command": "# store.config.json (en-US): \"screenshots\": {\"APP_IPHONE_DUO\": [...], \"APP_IPHONE_FOO\": [...]}, \"previews\": {\"IPHONE_DUO\": \"./previews/duo.mp4\"}\neas metadata:lint; echo \"exit=$?\"",
      "output": "EAS Metadata is in beta and subject to breaking changes.\n✅ Store configuration is valid.\nexit=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).",
      "url": "https://github.com/expo/eas-cli/blob/v24.11.0/packages/eas-cli/schema/metadata-0.json"
    },
    {
      "title": "`eas metadata:push` skips preview types its Apple library does not know (IPHONE_DUO)",
      "version": "24.11.0",
      "command": "eas metadata:push   # store.config.json has \"previews\": {\"IPHONE_DUO\": \"./previews/duo.mp4\"}",
      "output": "Log.warn(chalk`{yellow Unknown preview type {bold ${previewType}} for ${localeCode}, skipping.${suggestion}}`);\n# 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.\n# 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.",
      "url": "https://github.com/expo/eas-cli/blob/v24.11.0/packages/eas-cli/src/metadata/apple/tasks/previews.ts"
    },
    {
      "title": "`eas metadata:lint` exits 0 even when it finds errors",
      "version": "24.11.0",
      "command": "eas metadata:lint; echo \"exit=$?\"   # en-US entry without privacyPolicyUrl",
      "output": "EAS Metadata is in beta and subject to breaking changes.\n\nMetadata store config errors found\n  - $.apple.info.en-US The value at /apple/info/en-US is missing the required field 'privacyPolicyUrl'.\n\nexit=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`.",
      "url": "https://github.com/expo/eas-cli/blob/v24.11.0/packages/eas-cli/src/commands/metadata/lint.ts"
    },
    {
      "title": "Non-interactive commands without a login or EXPO_TOKEN",
      "version": "24.11.0",
      "command": "eas build -p ios --profile production --non-interactive </dev/null; echo \"exit=$?\"",
      "output": "An Expo user account is required to proceed.\nEither 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/)\nexit=1\n\n    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.`",
      "url": "https://docs.expo.dev/accounts/programmatic-access/"
    },
    {
      "title": "`eas login --non-interactive` alone does not log in",
      "version": "24.11.0",
      "command": "eas login --non-interactive </dev/null; echo \"exit=$?\"",
      "output": "Use eas login --device --non-interactive to log in without prompts.\nexit=1\n\n    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`.",
      "url": "https://github.com/expo/eas-cli/pull/4502"
    },
    {
      "title": "`Run this command inside a project directory.` with app.json present",
      "version": "24.11.0",
      "command": "ls   # app.json eas.json store.config.json, no package.json\neas metadata:lint; echo \"exit=$?\"",
      "output": "Run this command inside a project directory.\nexit=1\n\n    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.",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.11.0"
    },
    {
      "title": "Removed and renamed commands",
      "version": "24.11.0",
      "command": "eas onboarding; eas observe:logs; eas simulator --type serve-sim --non-interactive",
      "output": " ›   Error: command onboarding not found\n# exit 2\n ›   Error: command observe:logs not found\n# exit 2\nExpected --type=serve-sim to be one of: agent-device, appium, argent, web-preview-only\nSee more help with --help\n# 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.",
      "url": "https://github.com/expo/eas-cli/pull/3993"
    },
    {
      "title": "Node 20.17 installs with a warning, not an error",
      "version": "24.11.0",
      "command": "npx -y -p node@20.17.0 -- npm i eas-cli@24.11.0",
      "output": "npm warn EBADENGINE Unsupported engine {\nnpm warn EBADENGINE   package: 'eas-cli@24.11.0',\nnpm warn EBADENGINE   required: { node: '^20.18.3 || >=22.0.0' },\nnpm warn EBADENGINE   current: { node: 'v20.17.0', npm: '11.19.0' }\nnpm 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.",
      "url": "https://github.com/expo/eas-cli/pull/4279"
    },
    {
      "title": "`eas simulator create` is not a valid invocation",
      "version": "24.12.1",
      "command": "eas simulator create --non-interactive </dev/null; echo \"simulator create exit=$?\"",
      "output": "Unexpected argument: create\nSee more help with --help\nsimulator create exit=1\n    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.",
      "url": "https://github.com/expo/eas-cli/pull/4522"
    }
  ],
  "monthly": [
    {
      "month": "2026-10",
      "versions": "24.9.0 to 24.12.1 (5 releases to 2026-10-08)",
      "highlights": [
        {
          "text": "24.12.1: `eas simulator` cleans up a session that finishes after Ctrl+C during creation.",
          "url": "https://github.com/expo/eas-cli/pull/4522"
        },
        {
          "text": "24.12.0: `eas workflow:ssh` handles `BUILD_NOT_FOUND`; `eas update:view --json` returns signed source-map and asset-map URLs.",
          "url": "https://github.com/expo/eas-cli/releases/tag/v24.12.0"
        },
        {
          "text": "24.11.0: resumable device login for agents (`eas login --device --non-interactive`).",
          "url": "https://github.com/expo/eas-cli/pull/4502"
        },
        {
          "text": "24.9.0: `--force-end-active-rollout` on update commands, `eas update --upload-source-maps`, embedded bundle upload on by default for SDK 58.",
          "url": "https://github.com/expo/eas-cli/releases/tag/v24.9.0"
        }
      ]
    },
    {
      "month": "2026-09",
      "versions": "24.0.0 to 24.8.0 (13 releases)",
      "highlights": [
        {
          "text": "24.0.0: `eas observe:*` JSON fields renamed; new `observe:errors`, `observe:event`, `channel:protect`, `channel:unprotect`, `eas status`.",
          "url": "https://github.com/expo/eas-cli/releases/tag/v24.0.0"
        },
        {
          "text": "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`.",
          "url": "https://github.com/expo/eas-cli/releases/tag/v24.4.2"
        },
        {
          "text": "24.8.0 made `eas simulator:*` visible and accepts individual App Store Connect API keys.",
          "url": "https://github.com/expo/eas-cli/releases/tag/v24.8.0"
        }
      ]
    },
    {
      "month": "2026-08",
      "versions": "21.5.0 to 23.2.0 (14 releases; 22.3.0 to 22.5.0 on npm only)",
      "highlights": [
        {
          "text": "21.5.0 added `eas submit:list`, `submit:view`, `submit:retry`, `submit:cancel` and `submit:status`.",
          "url": "https://github.com/expo/eas-cli/pull/4134"
        },
        {
          "text": "22.0.0 renamed build JSON fields (`app`, `updateChannel`, `runtime`); 23.0.0 renamed `--type serve-sim` to `web-preview-only`.",
          "url": "https://github.com/expo/eas-cli/releases/tag/v22.0.0"
        }
      ]
    },
    {
      "month": "2026-07",
      "versions": "20.5.1 to 21.4.0 (9 releases)",
      "highlights": [
        {
          "text": "21.0.0 removed `eas onboarding`.",
          "url": "https://github.com/expo/eas-cli/pull/3993"
        },
        {
          "text": "21.3.0 added `eas testflight:feedback` and `eas testflight:crashes`.",
          "url": "https://github.com/expo/eas-cli/pull/4084"
        }
      ]
    },
    {
      "month": "2026-06",
      "versions": "20.1.0 to 20.5.0 (5 releases)",
      "highlights": [
        {
          "text": "20.1.0 added `eas update:embedded:list`, `:view` and `:delete`; 20.3.0 added `eas account:audit` and the PostHog integration commands.",
          "url": "https://github.com/expo/eas-cli/releases/tag/v20.3.0"
        },
        {
          "text": "20.2.0: non-interactive App Store builds can repair provisioning profiles with the stored App Store Connect API key, without `EXPO_ASC_*` variables.",
          "url": "https://github.com/expo/eas-cli/pull/3805"
        }
      ]
    },
    {
      "month": "2026-05",
      "versions": "18.10.0 to 20.0.0 (18 releases)",
      "highlights": [
        {
          "text": "19.0.0 made browser login the default for `eas login` (`--no-browser` for the old flow).",
          "url": "https://github.com/expo/eas-cli/pull/3746"
        },
        {
          "text": "20.0.0 renamed `observe:logs` → `observe:events`, `observe:events` → `observe:metrics`, `observe:metrics` → `observe:metrics-summary`.",
          "url": "https://github.com/expo/eas-cli/pull/3778"
        }
      ]
    }
  ],
  "sources": [
    {
      "title": "expo/eas-cli releases (GitHub API)",
      "url": "https://api.github.com/repos/expo/eas-cli/releases",
      "read": "2026-10-10"
    },
    {
      "title": "eas-cli on the npm registry",
      "url": "https://registry.npmjs.org/eas-cli",
      "read": "2026-10-10"
    },
    {
      "title": "EAS CLI 24.12.1 release notes",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.12.1",
      "read": "2026-10-10"
    },
    {
      "title": "EAS CLI 24.12.0 release notes",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.12.0",
      "read": "2026-10-10"
    },
    {
      "title": "PR #4522: simulator cancellation cleanup",
      "url": "https://github.com/expo/eas-cli/pull/4522",
      "read": "2026-10-10"
    },
    {
      "title": "PR #4529: workflow:ssh missing-build handling",
      "url": "https://github.com/expo/eas-cli/pull/4529",
      "read": "2026-10-10"
    },
    {
      "title": "PR #4534: update map URLs",
      "url": "https://github.com/expo/eas-cli/pull/4534",
      "read": "2026-10-10"
    },
    {
      "title": "PR #4494: embedded bundle upload for custom builds",
      "url": "https://github.com/expo/eas-cli/pull/4494",
      "read": "2026-10-10"
    },
    {
      "title": "PR #4557: embedded bundle upload logs",
      "url": "https://github.com/expo/eas-cli/pull/4557",
      "read": "2026-10-10"
    },
    {
      "title": "PR #4556: mitmproxy quarantine handling",
      "url": "https://github.com/expo/eas-cli/pull/4556",
      "read": "2026-10-10"
    },
    {
      "title": "PR #4549: macOS simulator preview encoding",
      "url": "https://github.com/expo/eas-cli/pull/4549",
      "read": "2026-10-10"
    },
    {
      "title": "EAS CLI 24.11.0 release notes",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.11.0",
      "read": "2026-10-07"
    },
    {
      "title": "EAS CLI 24.10.0 release notes",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.10.0",
      "read": "2026-10-07"
    },
    {
      "title": "EAS CLI 24.9.0 release notes",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.9.0",
      "read": "2026-10-07"
    },
    {
      "title": "EAS CLI 24.8.0 release notes",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.8.0",
      "read": "2026-10-07"
    },
    {
      "title": "EAS CLI 24.4.0 release notes (Node requirement)",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.4.0",
      "read": "2026-10-07"
    },
    {
      "title": "EAS CLI 24.0.0 release notes (observe JSON)",
      "url": "https://github.com/expo/eas-cli/releases/tag/v24.0.0",
      "read": "2026-10-07"
    },
    {
      "title": "PR #4502: resumable device login",
      "url": "https://github.com/expo/eas-cli/pull/4502",
      "read": "2026-10-07"
    },
    {
      "title": "eas-cli previews.ts at v24.11.0 (unknown preview types skipped)",
      "url": "https://github.com/expo/eas-cli/blob/v24.11.0/packages/eas-cli/src/metadata/apple/tasks/previews.ts",
      "read": "2026-10-07"
    },
    {
      "title": "eas-cli metadata JSON schema at v24.11.0",
      "url": "https://github.com/expo/eas-cli/blob/v24.11.0/packages/eas-cli/schema/metadata-0.json",
      "read": "2026-10-07"
    },
    {
      "title": "@expo/apple-utils on the npm registry",
      "url": "https://registry.npmjs.org/@expo/apple-utils",
      "read": "2026-10-07"
    },
    {
      "title": "Expo docs: Build server infrastructure (images and aliases)",
      "url": "https://docs.expo.dev/build-reference/infrastructure/",
      "read": "2026-10-07"
    },
    {
      "title": "Expo SDK 58 Beta changelog (2026-09-15)",
      "url": "https://expo.dev/changelog/sdk-58-beta",
      "read": "2026-10-07"
    },
    {
      "title": "Apple: Prepare and submit your apps for iPhone Duo (2026-10-05)",
      "url": "https://developer.apple.com/news/?id=kkphp5qo",
      "read": "2026-10-07"
    },
    {
      "title": "App Store Connect release notes (Xcode 27.1 RC uploads, 2026-10-05)",
      "url": "https://developer.apple.com/help/app-store-connect/release-notes",
      "read": "2026-10-07"
    },
    {
      "title": "Expo docs: programmatic access (EXPO_TOKEN)",
      "url": "https://docs.expo.dev/accounts/programmatic-access/",
      "read": "2026-10-07"
    },
    {
      "title": "expo/eas-cli repository (stars, licence)",
      "url": "https://github.com/expo/eas-cli",
      "read": "2026-10-10"
    }
  ],
  "fixes": []
}
