These variables configure the runner and first-party packages. In the tables,
set means the variable exists, value means it is not blank, and flag
means it is not blank, 0, or false. Flag values are case-insensitive.
Reference
Model
Configure a model in e2e.config.ts. Its provider reads the API key:
gateway() uses AI_GATEWAY_API_KEY, openrouter() uses
OPENROUTER_API_KEY, and openai() uses OPENAI_API_KEY. Without
AI_GATEWAY_API_KEY, gateway() uses a
Vercel OIDC token. A missing
credential fails on the first model call. Subscription models use a stored
login instead.
See Models and Subscriptions.
E2E_OAUTH_CREDENTIALS
The stored subscription logins as JSON, the contents of oauth.json, for a
machine nobody can sign in on.
- The
e2e/oauth/*models ande2e modelsread it in place of$XDG_CONFIG_HOME/e2e/oauth.json. e2e loginande2e logoutrefuse to change it.- Refreshed tokens are not written back.
OPENCODE_API_KEY
An OpenCode Console service account API key or an OpenCode Go subscription
API key. opencodeConsole() and e2e models opencode-console use it in place
of the stored opencode-console login. OpenCode reads the same variable.
Credentials and secrets
<NAME>is the name uppercased with every character outsideA-Z0-9replaced by_, sopower-userbecomesE2E_USER_POWER_USER_USERNAME.- Two credentials, or two secrets, whose names map to one
<NAME>areINVALID_CONFIGat config load, set or not. So one rotation never replaces two entries. The message names the entries and the variables. For example,api-keyandapi_keyboth readE2E_SECRET_API_KEY;svc-aandsvc_aboth readE2E_USER_SVC_A_USERNAMEand_PASSWORD. - A credential and a secret may share a name, since their prefixes differ.
- A variable for a name absent from the config is ignored.
- An empty password or secret is
INVALID_CONFIG, and so is one shorter than 6 characters (code points). Redaction rewrites every occurrence of a value, and one that short would take ordinary text with it. An empty username is accepted.
Run mode
CI
Turns on CI mode:
retriesdefaults to 1 andworkersto 1.cachedefaults toread-only.- A focused test is
ONLY_IN_CI. reuseExistingon an app command is ignored.
Replay cache
E2E_CACHE_DIR
Replaces cache.dir for e2e run and
e2e cache, resolved from the project root.
~or a leading~/is the home directory.--cache-dirwins over it.- A custom
cache.storeignores it. - The cache mode stays as configured, and
--no-cachestill turns the cache off.
Diagnostics
--debug and --ai-trace are flags, not variables; see
CLI.
Telemetry
E2E_TELEMETRY_FLEET
Names the platform running e2e for its users.
- Events are attributed to
fleet:<name>instead of a per-machine id. - No preferences file is written, and no notice is printed.
- A value that is not a plain token is sent as
other.
Detected environments
Telemetry also checks for the markers CI vendors and coding agents set. Only the derived name is sent.
What is sent and how to read it is on the Telemetry page.
Reporters
@e2e-dev/github reads the variables GitHub Actions sets, when a run finishes:
Engines
EXPO_TOKEN
The Expo access token easSimulators() from @e2e-dev/eas starts and stops
simulator sessions with. See EAS Simulators.
- Unset, it uses the eas-cli login in
.expo/state.jsonunder the home directory (HOME,USERPROFILE). - With neither, the device lease fails.
What app processes inherit
An app command receives PATH, HOME, TMPDIR, TMP, TEMP,
SystemRoot, and COMSPEC, plus the variables command.inheritEnv matches
and whatever command.env sets.
The scaffolded config module reads APP_URL, not the runner. If the dev
server needs it too, pass it through command.env.