This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

Expo Simulators CLI reference

Edit page

Reference for the experimental eas simulator commands that create, inspect, monitor, control, list, route network traffic for, and stop remote simulator sessions.


The simulator:* commands are experimental. They appear in eas --help from EAS CLI 24.8.0. Install or update EAS CLI before running them:

Terminal
- eas simulator:start --help

The --help flag displays the available options for simulator:start.

The start command is also available as eas simulator, eas sim:start, and the hidden alias eas sim. The other commands have matching eas sim:* aliases, such as eas sim:list and eas sim:stop.

To manage sessions without EAS CLI, use the Expo Simulators REST API.

Commands

CommandPurpose
simulator:availabilityCheck whether the current project's account can use Expo Simulators
simulator:startCreate a session and wait for its controller configuration
simulatorSame command as simulator:start
simulator:execRun another command with .env.eas-simulator loaded
simulator:eventsShow recorded activity or follow activity from a running session
simulator:egressRun the local egress client for a session started with --egress local
simulator:getGet status, connection details, dashboard URL, timestamps, and artifacts
simulator:listList and filter sessions for the current project
simulator:stopStop a session

simulator:availability

Terminal
- eas simulator:availability --json

The --json flag is optional. It prints a stable, machine-readable result for agents and automation; omit it for human-readable output. The JSON object contains available and accountName. When the account does not have access, it also contains waitlistUrl. This command does not create a session or consume simulator usage.

simulator:start

The session type determines which interface EAS provisions with the remote device. Every type includes a browser preview. Choose agent-device, Argent, or Appium to add programmatic control, or choose web-preview-only for the browser preview only:

Use agent-device for accessibility-driven device actions and app installation.

Terminal
- eas simulator:start --platform ios --type agent-device --name "Checkout flow screenshots" --non-interactive

Important flags:

FlagDescription
-p, --platformandroid or ios. Required in non-interactive mode; prompted for in an interactive terminal
--nameHuman-readable session name shown by simulator:list, simulator:get, and expo.dev
--tagLabel that groups sessions, such as one tag for each app variant. Repeat the flag for multiple tags. Stored in lowercase
--deviceAndroid virtual device hardware profile, or iOS Simulator name or unique device identifier (UDID). The runner chooses a device when omitted
--build-idEAS Build to install and launch before the session is ready
--build-fingerprintFingerprint hash of an EAS Build. Installs the most recent finished build with this fingerprint that the simulator can install
--application-archive-urlApplication archive to download, install, and launch before the session is ready
--expo-goInstall and launch the Expo Go version that matches the current project's Expo SDK
--sdk-versionExpo SDK used to select Expo Go. Only valid with --expo-go; defaults to the current project SDK
--launch-argArgument passed to the installed app when it launches. Repeat the flag for multiple arguments
--open-urlExpo or development-client URL to open in the installed app after launch
--typeSession type. Defaults to agent-device. Every type includes a browser preview. Use agent-device, appium, or argent to add programmatic control, or web-preview-only for the browser preview only
--package-versionController package version. Defaults to the service's latest version
--max-duration-minutesAutomatic session stop time, up to the plan limit: 40 minutes on the Free plan and 115 minutes on paid plans. Defaults to the plan limit
--egresslocal routes the device's network traffic through this machine. On Android, all TCP traffic from the emulator. On iOS, HTTP(S) and WebSocket traffic that honors the system proxy or proxy environment variables, such as gRPC and libcurl. See Network traffic and local egress in Expo Simulators
--egress-allowExact host:port on this machine or its network that the simulator can reach through local egress, such as localhost:3000. Repeat for multiple destinations. Requires --egress local
--network-captureRecord HTTP(S) traffic from apps on an iOS device as an HTTP Archive (HAR). iOS only. Not compatible with --egress local. See Record network traffic
--network-capture-fieldWhat a recording also keeps: header, query, request-body, or response-body. Repeat the flag or pass a comma-separated list. Requires --network-capture
--max-idle-time-minutesStop after this many minutes without session activity. When omitted, the session has no idle timeout and runs until its maximum duration. Not supported for web-preview-only
--out-config-typedotenv (default) to write .env.eas-simulator, or env to print shell exports
--[no-]forceWhether to create a new session when a session ID already exists in the environment. Defaults to true
--non-interactiveReturn after the session is ready instead of staying attached
--jsonPrint machine-readable output and imply non-interactive mode

--build-id, --build-fingerprint, --application-archive-url, and --expo-go are mutually exclusive application sources. --launch-arg and --open-url require one of those sources because the start command needs an installed application to launch.

The default dotenv output writes configuration even when you pass --json. Use --out-config-type env when you explicitly do not want the file. The env output does not export EAS_SIMULATOR_SESSION_ID, so pass --id <session-id> to simulator:get, simulator:stop, and simulator:events.

Common JSON output fields have this shape. The fields inside remoteConfig depend on the selected controller:

{ "id": "<session-id>", "name": "Checkout flow screenshots", "type": "<controller-type>", "deviceRunSessionUrl": "https://expo.dev/accounts/<account>/projects/<project>/simulator-sessions/<session-id>", "remoteConfig": { "<controller-specific-key>": "<value>" } }

Treat remoteConfig as secret because it includes controller credentials. In --json output, the browser preview URL already includes its token. It is remoteConfig.webPreviewUrl, or remoteConfig.previewUrl for a web-preview-only session.

Interactive and non-interactive behavior

Without --non-interactive or --json, the start command stays attached in an interactive terminal and polls the session. Press Ctrl + C once to stop it. EAS CLI resets .env.eas-simulator after it confirms the session ended. When CI is set or standard input is not a terminal, such as in an agent shell, the command runs non-interactively even without the flag.

With --non-interactive or --json, the command returns after the controller is ready. You must stop the session separately.

simulator:exec

simulator:exec is controller-agnostic. It loads the connection variables for the active session from .env.eas-simulator, then spawns the command and arguments that follow.

Use the command pattern for the controller selected when the session started:

Terminal
- eas simulator:exec npx agent-device@latest <command> [args...]

simulator:exec does not implement device actions. It only supplies the active session's connection environment and runs the command that follows. The available actions and argument syntax come from agent-device, Argent, or your Appium client. For Appium, simulator:exec sets APPIUM_URL and APPIUM_CAPS for your client.

simulator:events

Show a snapshot of the activity recorded for the session referenced by .env.eas-simulator:

Terminal
- eas simulator:events

Pass a session ID to inspect another session:

Terminal
- eas simulator:events --id <session-id>

The default text output condenses related operations into a readable timeline. It includes the timestamp, controller, summary, and duration when available. This command shows session and controller activity from agent-device, Argent, or Appium, not application runtime logs.

Follow new activity while a session is running:

Terminal
- eas simulator:events --follow

The -f short flag is equivalent to --follow. The command stops following when the session ends. Press Ctrl + C to stop following earlier.

For agents and automation, request the raw event records as JSON:

Terminal
- eas simulator:events --json

The JSON object contains deviceRunSessionId and an events array. Common event fields include eventId, ts, producer, type, and summary, with operation ID, outcome, duration, and controller-specific data when available. --json cannot be combined with --follow.

simulator:egress

Run the local egress client for the session in .env.eas-simulator:

Terminal
- eas simulator:egress

The session must have started with --egress local. In interactive mode, simulator:start runs the egress client in the same terminal, so you do not need this command. With --non-interactive, run simulator:egress in another terminal and keep it running for the life of the session.

Use --config-type env to read the session credentials from the shell environment instead of .env.eas-simulator. Press Ctrl + C to stop the egress client. The session keeps running, and proxied requests fail until the client connects again.

simulator:get

Get the session referenced by .env.eas-simulator:

Terminal
- eas simulator:get --json --non-interactive

Get another session explicitly:

Terminal
- eas simulator:get --id <session-id> --json --non-interactive

The response includes:

  • ID, name, tags, type, status, and platform
  • Created, started, finished, and updated timestamps
  • The expo.dev simulator session URL
  • Controller connection configuration
  • Session artifacts, when present, with each artifact's id, name, filename, fileSizeBytes, metadata, and downloadUrl. fileSizeBytes appears only after the session stops

simulator:list

Terminal
- eas simulator:list --platform ios --status in-progress --json --non-interactive

Filters can be repeated:

FilterValues
--platformandroid, ios
--typeagent-device, appium, argent, web-preview-only
--statusnew, queued, starting, in-progress, stopped, errored
--nameText that the session name starts with. Case does not matter. Takes one value
--tagTag. A session must have every listed tag

Use --limit to control page size (10 by default, 100 at most) and --after with the previous response's endCursor for pagination.

simulator:stop

Stop the session referenced by .env.eas-simulator:

Terminal
- eas simulator:stop

Stop a specific session:

Terminal
- eas simulator:stop --id <session-id>

Running simulator:stop on a session that already stopped succeeds.

Use --json for a machine-readable object containing the session id and final status.

.env.eas-simulator

While a session is active, the managed file contains its session ID:

.env.eas-simulator
EAS_SIMULATOR_SESSION_ID='<session-id>'

After the session stops and EAS CLI resets the file, only the comment header remains.

Controller connection variables depend on the selected type:

ControllerConnection variables
agent-deviceAGENT_DEVICE_DAEMON_BASE_URL, AGENT_DEVICE_DAEMON_AUTH_TOKEN
ArgentARGENT_TOOLS_URL and, when required, ARGENT_AUTH_TOKEN
AppiumAPPIUM_URL, APPIUM_CAPS

A session started with --egress local also adds EAS_SIMULATOR_EGRESS_URL, EAS_SIMULATOR_EGRESS_TOKEN, EAS_SIMULATOR_EGRESS_FINGERPRINT, EAS_SIMULATOR_EGRESS_PORT, EAS_SIMULATOR_EGRESS_PLATFORM, and EAS_SIMULATOR_EGRESS_ALLOW.

When the file contains a session ID, its values replace the same variables in your shell environment for simulator:start, simulator:exec, simulator:get, simulator:stop, simulator:events, and simulator:egress. The only exception is simulator:egress --config-type env, which does not read the file. When the file has no session ID and you do not pass --id, simulator:get, simulator:stop, and simulator:events use EAS_SIMULATOR_SESSION_ID from your shell environment.

Add the file to .gitignore:

.gitignore
.env.eas-simulator

Do not modify its values while the session is running.