Telemetry never collects PII or call content. No phone numbers, transcripts,
audio, prompts, tool arguments, API keys, customer identifiers, file paths,
hostnames, or IP addresses are ever sent.
What is collected
Each event is a small, flat JSON object with only coarse, low-cardinality fields: Common fields on every event:
Per-event dimensions (all are a closed enum or a coarse bucket — an off-list
value is replaced with
other before sending):
The
run_id is a fresh random value on every process start (it groups one run’s
events). The install_id is a random UUID generated once and stored in a small
local file (~/.getpatter/install-id, or $XDG_STATE_HOME/getpatter/install-id
when XDG_STATE_HOME is set) so the maintainers can count unique active
installs over time — it is a random number, not tied to you or any PII, and is
never derived from hardware (MAC address, hostname, serial numbers). Opting out
never creates or reads this file. The collector drops the source IP on receipt.
Custom tool names, custom integration endpoints, custom/fine-tuned model names, and
any value not on a closed enum are never sent — only counts and coarse
categories.
How to disable it
Telemetry is opt-out. Any one of the following turns it off:Python
TypeScript
next telemetry disable):
Telemetry is also automatically disabled in CI and test runners (for example
when
CI, GITHUB_ACTIONS, PYTEST_CURRENT_TEST, or VITEST is set).
Inspect exactly what would be sent
SetPATTER_TELEMETRY_DEBUG=1 to print every event to stderr without sending
it. This lets you audit precisely what would leave your machine:
Send telemetry to your own collector
Point Patter at any HTTP endpoint that accepts a JSON array of events:Precedence
When more than one signal is present, the first match wins:DO_NOT_TRACKset → offPATTER_TELEMETRY_DISABLEDset → off- persisted opt-out marker present (
getpatter telemetry disable) → off telemetry=Falsein code → off- CI / test environment detected → off
- otherwise → on

