Telemetry
Gate sends counts and identifiers so we can tell whether it is being used. It never sends content.
The complete field list, the enforcement mechanism, and the reasoning are on the privacy page. This page is the configuration reference.
Turning it off
Any one of these, in order of precedence:
gate scan --no-telemetry
export GATE_TELEMETRY=0 # also: false, off, no
export DO_NOT_TRACK=1 # the Console Do Not Track convention
gate.config.ts
export default defineConfig({ telemetry: false })
Everything works identically with telemetry off. It is a side channel, never a dependency: a default scan makes no network calls at all.
What it sends
One event per completed scan: counts of servers, tools and credentials; finding counts by severity; which rule IDs fired; which capability classes were present; which adapters matched; the blast radius; whether it ran in CI; coarse platform; and a one-way repository fingerprint.
Never your code, file contents, secrets, repository name, command lines, environment values, tool names or finding text.
The request has a 1.5 second timeout and is fire-and-forget. It cannot slow a scan noticeably and cannot fail one.
Self-hosting
Point Gate at your own collector:
export GATE_TELEMETRY_ENDPOINT=https://telemetry.internal.example/v1/events
The backend is one Worker and one table:
apps/telemetry/src/index.tsvalidates each event against the same strict schema the client uses, then inserts it.apps/telemetry/schema.sqlis the table. Every column maps to exactly one allowlisted field.
For local development there is also
scripts/ingest-server.mjs,
which needs no database and appends to a file instead.
There is no dashboard. Events are newline-delimited JSON, one object per scan, so any tool that reads JSON can aggregate them.