Telemetry
What the CLI sends, what it never sends, and how to turn it off.
The e2e CLI sends anonymous usage data: which commands, engines, and
features people use, and where runs fail. Telemetry is on by default. It
sends counts and versions, never test content, app content, or credentials.
Opt out
Any one of these turns telemetry off:
npx e2e telemetry disable # saved in ~/.config/e2e/telemetry.json
export E2E_TELEMETRY_DISABLED=1 # for a shell or a CI job
export DO_NOT_TRACK=1 # the cross-tool conventionpnpm exec e2e telemetry disable # saved in ~/.config/e2e/telemetry.json
export E2E_TELEMETRY_DISABLED=1 # for a shell or a CI job
export DO_NOT_TRACK=1 # the cross-tool conventionbunx e2e telemetry disable # saved in ~/.config/e2e/telemetry.json
export E2E_TELEMETRY_DISABLED=1 # for a shell or a CI job
export DO_NOT_TRACK=1 # the cross-tool conventionThe environment variables win over the saved setting. e2e telemetry enable
reverses a saved disable. e2e telemetry prints the status and, when off,
the reason. The preferences file is under $XDG_CONFIG_HOME/e2e/ when that is
set, and %APPDATA%\e2e\ on Windows.
A disable also stops commands already running in another terminal. Nothing
is sent when the preferences directory isn’t writable, or from a source
checkout of the e2e repository.
See what would be sent
E2E_TELEMETRY_DEBUG=1 npx e2e runE2E_TELEMETRY_DEBUG=1 pnpm exec e2e runE2E_TELEMETRY_DEBUG=1 bunx e2e runThe CLI prints the exact payloads to stderr as [telemetry] {...} and
sends nothing.
What is sent
Each command sends one e2e_cli_session event. run and explore also
send e2e_run_completed, init sends e2e_init_completed (and so does
explore when it runs the init wizard first), upgrade sends
e2e_upgrade_completed, and mcp sends one e2e_mcp_session per MCP
session. --help and --version send
nothing, on any command. run() and explore() from e2e/runner send no
session event, only one e2e_run_completed per call that returns a report.
The events go in one request when the command, run(), or explore() ends, with a
two-second deadline. e2e mcp sends each session event in its own request,
and e2e run --watch sends each run’s event when that run ends.
Events hold only the properties below. An error code that isn’t an upper-case
token is sent as OTHER. An engine, platform, model, fleet, or MCP client
name, or an MCP client version, that isn’t a plain token of letters, digits,
dots, dashes, and underscores is sent as other. An engine version that isn’t
semver is sent as unversioned. In action and tool call counts, a project’s
own tools count together as tool, and any other name as other.
Every event
e2e_cli_session, once per command
e2e_init_completed, once per init wizard
e2e_upgrade_completed, once per e2e upgrade
e2e_run_completed, once per e2e run, e2e explore, or completed run() or explore()
Config features, absent when the config didn’t load. Each is a count, a boolean, or one of the runner’s own option values, never text you wrote:
On e2e explore and explore() only, counts of what the exploration was given and found:
e2e_mcp_session, once per MCP session
An e2e mcp server sends one for each open_session it receives, when the
session closes or the open fails. A session that is still open when the
client kills the server isn’t sent.
What is never sent
Telemetry never sends test titles, file paths, URLs, origins, instructions, observations, page content, screenshots, error messages, stack traces, environment variable values, credentials, or file contents. It never sends the names of targets, agents, credentials, secrets, or project tools, MCP tool arguments or results, an exploration’s goal or charters, or its findings’ words.
In CI
CI runs count as the CI vendor, not as a machine, with no preferences file
and no notice. A coding agent that sets CI in its shell, with no CI vendor
around it, counts as the machine it runs on.
In CI, only the environment variables turn telemetry off. Set
E2E_TELEMETRY_DISABLED: '1' in the job’s env.
In a fleet
A platform that runs e2e for its users on new machines would count each
machine as a new user. Set E2E_TELEMETRY_FLEET=<name> on those machines.
Their events count as fleet:<name>, with no preferences file and no
notice, as in CI. Or set E2E_TELEMETRY_DISABLED=1 to send nothing.
Where it goes
Events go to eu.i.posthog.com, a PostHog project that the e2e
maintainers operate. PostHog keeps no person profile, stores no request
address, and skips GeoIP for each event. The data is read in aggregate.
Telemetry falls under the security policy. Outbound connections lists every other connection a run can make.
Feedback
e2e feedback isn’t telemetry. It sends the
words in its flags as one e2e_feedback event to the same PostHog project,
with the machine facts above. When telemetry is on, it has the same anonymous
id as your telemetry events.
A saved e2e telemetry disable doesn’t stop it. E2E_TELEMETRY_DISABLED=1
and DO_NOT_TRACK=1 do. The CLI reference
covers redaction, --dry-run, and bugs without --repro.
The notice
The first command, or the first run() or explore() from e2e/runner, prints a notice
on stderr that tells how to opt out. It leaves --reporter json output
intact. e2e init and e2e telemetry don’t print it, so it waits for the
next command. The notice shows again after a large change to the data
collected.
