This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
Control a remote simulator with agent-device, Argent, or Appium
Edit page
Open apps, press buttons, enter text, and read the accessibility tree on an Expo Simulators session through simulator:exec and a controller.
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.
EAS CLI manages the session, but it does not press buttons or type text. Device actions come from the controller that you selected with --type when the session started. Run each controller command through eas simulator:exec, which loads the connection details for the active session and then runs the command.
How simulator:exec works
simulator:exec reads .env.eas-simulator, adds its values to the environment, and runs the command that follows. It does not implement device actions itself. There is no simulator:tap command.
Each session type provisions only its own controller. For example, agent-device commands do not work in an Argent session. A web-preview-only session has no controller. See Expo Simulators session types.
Control the app with agent-device
agent-device is an open source command-line controller from Callstack. It runs on demand through npx, so you do not need to install it globally.
Open an app
apps lists the apps that you installed. Add --all to include system apps.
Read the screen and press an element
Take a snapshot of the interactive accessibility tree:
The snapshot returns references such as @e1 and @e2. Press an element by its reference or by a selector:
To press an element, use press or click.
On iOS, a snapshot can take tens of seconds. If an action times out, take a new snapshot before you try again. The first action can reach the device even when the response is late, so a second attempt can do the action two times.
Enter text and scroll
Open a deep link
The first time a scheme opens, iOS can show an Open in dialog. Accept it with alert accept. You can also start the session with --open-url. EAS then tries to approve the scheme so that the dialog does not appear. --open-url requires an application source, such as --build-id. See Install an app on a remote Android Emulator or iOS Simulator.
Do not open the browser preview URL on the device. The preview URL is a browser stream for people, not a deep link.
Read the full command list
agent-device includes help text that is written for agents. Read the version that matches the session:
Control the app with Argent
Argent is a controller from Software Mansion. Install its CLI, then run its tools through simulator:exec:
Argent tools need an explicit --udid. Use the booted device from list-devices. Argent gesture tools take coordinates from 0.0 to 1.0, not pixels.
To use Argent through its Model Context Protocol (MCP) server instead, link the session credentials. Use --yes so that a new token replaces an old one:
If your editor already runs argent mcp, restart the editor so that it uses the new link.
Control the app with Appium
Start an appium session, then run your Appium client through simulator:exec. Configure the client to read the server URL from APPIUM_URL and the capabilities from APPIUM_CAPS, which contains JSON:
For more information, see Run Appium tests on a remote Android Emulator or iOS Simulator.
Control the device from a browser
Every session type includes a live browser preview. Open the browser preview URL from the start output, or select Open preview on the session page on expo.dev, to see the device. On iOS, you can also interact with it. In --json output, the URL is remoteConfig.webPreviewUrl, or remoteConfig.previewUrl for a web-preview-only session. See Share a live Expo Simulators session or start one from a link.
The session page on expo.dev shows an Open preview button that opens the browser preview in a new tab. Android support is still in development, so some features that work on iOS may not work on Android yet.
Browser preview activity does not reset the idle timer. See How long an Expo Simulators session runs.
Common questions
Why does a controller command say that the remote daemon is unavailable?
The controller connection dropped, or the session stopped. A dropped connection also removes the installed app state and the snapshot references. Stop the session if it is still active, start a new session, and repeat the install, open, and drive steps. See Troubleshoot Expo Simulators.
Can I control two devices in one session?
Yes, in an iOS session. agent-device can boot and control more than one iOS Simulator in a session. Use a separate named agent-device session for the second device. Pass --session <name> and --device "<name>" when you boot it. Then pass --session <name> on each later command for that device. The agent-device --device flag accepts only a device name. To select a device by its unique device identifier (UDID), use --udid <UDID>. See Use a second device in the same session.