{
  "slug": "build-tools-starts-expo-device-hub-for-android-simulator-sessions-228bd607817f",
  "title": "build-tools starts expo-device-hub for Android simulator sessions",
  "tools": [
    "eas"
  ],
  "tags": [
    "agent"
  ],
  "introduced_at": "2026-10-15T22:45:24.000Z",
  "announced_at": "2026-10-15T22:45:24.000Z",
  "effective_at": null,
  "date_basis": "source-publication",
  "status": "unknown",
  "how": {
    "incantation": "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"
    ],
    "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`."
    ]
  },
  "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"
  ],
  "rank": 0.91023,
  "judge": {
    "publish": true,
    "judge_model": "codex-cli/gpt-6-luna+typesafe/jev-1.13.0",
    "prompt_version": "extract-v7+enrich-v2+judge-v2x3+jev-publish-v1"
  },
  "review_state": "approved",
  "provenance": {
    "run_id": "wave2a-20261017",
    "verdict_id": "wave2a-20261017:wave2a-20261017-18db4970dfff2a52-1:gate",
    "evidence_hash": "81069a0873fc75c5bfcc569c7c86ecb81e04f81f0e843a085483bc77ad88593a"
  },
  "review": {
    "draft_hash": "4c8efb2466c9768c3835b10777483cb2cf0a2db45dd8303cf2e3d2bf6abcde39",
    "reviewer": "publication-gate",
    "reviewed_at": "2026-10-15T22:45:24.000Z",
    "decision": "wave2a-20261017:gate",
    "reason": "2 of 3 judge runs approved with p_yes >= 0.9 (mean 0.91 >= 0.9; 2 needed) and Jev gave 0.60 (>= 0.6 needed)."
  }
}
