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.
Expo Simulators is a limited-access preview. It is not included with paid or free plans and is currently available only to select partners. Join the waitlist if you are interested in trying it.
The simulator:* commands are experimental. They appear in eas --help from EAS CLI 24.8.0. Install or update EAS CLI before running them:
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
simulator:availability
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.
Use Argent to run its remote device tools through the session.
Use Appium when you want to connect an existing Appium client or test suite.
Use the browser preview without provisioning a programmatic controller.
Important flags:
--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:
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:
Pass a session ID to inspect another session:
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:
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:
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:
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:
Get another session explicitly:
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, anddownloadUrl.fileSizeBytesappears only after the session stops
simulator:list
Filters can be repeated:
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:
Stop a specific session:
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:
After the session stops and EAS CLI resets the file, only the comment header remains.
Controller connection variables depend on the selected type:
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:
Do not modify its values while the session is running.