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

How Expo Simulators sessions work

Edit page

An Expo Simulators session is a time-limited job on EAS that starts a remote Android Emulator or iOS Simulator with a controller. Learn its states, its startup sequence, and its session page.


An Expo Simulators session is one remote device that runs for a limited time on EAS infrastructure. Each session belongs to an EAS project. It starts one Android Emulator or iOS Simulator, the controller that you selected, and a browser preview. EAS runs each session as a job, in the same way that it runs other EAS jobs.

What a session contains

PartWhat it does
Remote deviceA stock Android Emulator or iOS Simulator. It starts blank unless you give an application source.
Controlleragent-device, Argent, or Appium. It receives device actions. A web-preview-only session has no controller.
Browser previewA live stream of the device that people can see in a desktop browser and, on iOS, control.
Session recordThe ID, name, tags, status, timestamps, activity events, and artifacts. You can read it after the session stops.

Select Open preview on the session page on expo.dev to open 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.

For a list of the session types, see Expo Simulators session types.

Session states

A session moves through these states:

StateEAS CLIREST APIexpo.dev labelMeaning
NewNEWnewStartingEAS created the session and has not queued its job yet.
QueuedQUEUEDqueuedStartingThe session's job waits in the queue for a worker.
StartingSTARTINGstartingStartingA worker runs the job and prepares the device and the controller.
In progressIN_PROGRESSin-progressLiveThe session runs. Connection details are available.
StoppedSTOPPEDstoppedFinishedThe session ended normally. This state is final.
ErroredERROREDerroredFailedThe session ended with an error. This state is final.

A session goes from starting to in progress when the device and the controller are ready. New, queued, and starting sessions are not final, so a stop request ends them. It goes to stopped when you stop it, when it reaches a limit, or when its job finishes or is canceled. It goes to errored when its job fails. An errored session stays errored, even if you send a stop request.

The REST API returns connection details, such as controller tokens, only while the session is in progress.

What happens when a session starts

  1. EAS creates the session in the new state and returns its ID and session page URL.
  2. The session waits in the queue. EAS CLI shows a queue message during this step.
  3. A machine on EAS starts the device and the controller.
  4. If you gave an application source, EAS downloads, installs, and launches the app. It also applies launch arguments and opens a URL if you gave them.
  5. The controller reports its connection details, and the session goes to in progress.
  6. EAS CLI writes .env.eas-simulator and prints the connection instructions.

EAS CLI waits up to 15 minutes for steps 3 to 5. Queue time does not count toward this limit. If the limit expires, EAS CLI stops the session. If the job fails before the session is ready, the session goes to errored, and EAS CLI exits with an error.

Ways to create a session

MethodController choicePlatforms
EAS CLIAll session typesAndroid and iOS
REST APIAll session typesAndroid and iOS
Create session linkBrowser preview onlyAndroid and iOS
Create new simulator dialog on expo.devagent-device, Argent, or AppiumAndroid and iOS

The Create new simulator dialog on the Simulator sessions page has these fields:

  • Session name
  • Platform
  • Controller
  • Build source: the latest app build, Expo Go, a URL, or an uploaded build file
  • Build, or the SDK version for Expo Go
  • Device
  • Metro URL
  • Launch arguments and tags, under Advanced options

The dialog does not set a maximum duration, an idle timeout, or local egress. Use EAS CLI or the REST API for the duration and idle limits, and EAS CLI for local egress. To create a session, you need the Developer role or higher.

The session page

Each session has a page on expo.dev:

https://expo.dev/accounts/<account>/projects/<project>/simulator-sessions/<session-id>

The page has these sections, from top to bottom:

  1. Summary. The status, duration, the person who started the session, the start time, and a Stop session button.
  2. Preview or recordings. An Open preview button while the session runs, or the screen recordings after it stops.
  3. Session activity. The controller actions, with a Drive this session button while the session runs.
  4. Artifacts. Files from the session, in groups: screenshots, screen recordings, traces, performance metrics, native profiles, React profiles, session events, and other files.
  5. Logs. The logs of the job that ran the session. This section starts collapsed.

Android session pages also show a warning that Android Emulator support is still in development.

Common questions

Is a session the same as an EAS Build?

No. Both run as jobs on EAS, but a session runs a device for you to use. It does not create a build. Use EAS Build to create the build that a session installs.

Can I reuse a stopped session?

No. A stopped or errored session is final. Start a new session. You can still read the record and the artifacts of a stopped session.

Can I delete a session?

Yes. You can delete a session after it finishes, if you have the Developer role or higher. Deleting a session also deletes its recordings and screenshots. You cannot undo the deletion.