Telemetry and privacy
Release builds of pyscriptc send pseudonymous usage events to PostHog (EU cloud, eu.i.posthog.com).
Telemetry exists to answer one question: which unsupported constructs block real users the most, so the roadmap follows demand.
See the privacy notice for the legal basis, retention and your rights.
What is sent
Every field of every event, in full:
| Event | Field | Example | Why |
|---|---|---|---|
| all | distinct_id |
3f2b8c1e-... (random uuid4) |
counts distinct installs, not people; see below |
| all | pyscriptc_version |
0.4.0 |
which release has which problem |
| all | python_version |
3.14 (major.minor only) |
which Python versions to support |
| all | platform |
darwin, linux |
which targets matter |
| all | $ip (null), $geoip_disable (true), $process_person_profile (false) |
ask PostHog not to store the IP, not to geolocate and not to build a person profile | |
cli.invoked |
subcommand |
compile |
which commands are used |
compile.finished |
duration_ms |
412 |
performance regressions |
compile.finished |
outcome |
fences |
ok, fences, check-failed, lower-error or build-error |
compile.finished |
fence_count |
3 |
how often programs are blocked |
compile.finished |
fence_families |
{"union-types": 2, "stdlib": 1} |
which kinds of constructs block users (fixed vocabulary, stdlib:<module> collapsed to stdlib) |
compile.finished |
checker, emit, driver |
pyrefly, bin, clang |
which toolchain options are used (flag choices from a fixed list) |
compile.finished |
skip_check |
false |
explains an absent checker |
coverage.reported |
definitions, fencedDefinitions, fences, rootFences |
40, 3, 5, 2 |
aggregate coverage only |
coverage.reported |
byFamily |
{"union-types": 5} |
family to fence count |
Not sent, ever: file names or paths, user names, host names, machine ids, MAC addresses, source text or snippets, imported module names, fence codes, per-fence locations, definition names, argument values, environment variables.
The server connection necessarily exposes your IP address to the host; the project is configured to discard it (see the privacy notice).
The install id
The id is a random uuid4 created the first time an event is sent and stored in telemetry-id next to the config file (~/.config/pyscriptc/telemetry-id, or under $XDG_CONFIG_HOME), with mode 0600.
Nothing about your machine is read to make it: no machine id, MAC address or hostname.
It is still a persistent identifier for the install, so it counts as pseudonymous data, not anonymous data.
Run pyscriptc telemetry reset-id (or delete the file) to throw it away; a new unrelated id is created at the next send.
Older releases derived the id from a hash of machine identifiers; this release stops using it and does not migrate it.
Opting out
pyscriptc telemetry disable # persistent off
pyscriptc telemetry status # current state
pyscriptc telemetry reset-id # new random id
Or set PYSC_NO_TELEMETRY=1 or DO_NOT_TRACK=1.
Telemetry is always silent on CI and in development builds built without POSTHOG_PROJECT_TOKEN.
First-run notice
The first time you run pyscriptc in an interactive terminal, it prints a notice on stderr listing what is collected, the retention period and how to opt out, then records notice_seen = true in ~/.config/pyscriptc/config.toml (or under $XDG_CONFIG_HOME).
No event is sent before that notice was shown.
The notice never prints, and so nothing is sent, when stderr is not a TTY, when CI is set, or when telemetry is disabled.
The pyscriptc telemetry command itself sends nothing.