LEGAL
Telemetry
Trustabl collects anonymous usage data to help improve the product — to understand which SDKs users scan most often, catch reliability issues, and measure adoption. This page is the complete and authoritative list of every event and every property that can be sent — updated in the same commit as any event schema change.
Telemetry is off by default. On your first interactive scan, Trustabl asks you to choose a level.
trustabl telemetry status
TRUSTABL_TELEMETRY=full
Telemetry levels
In CI (CI=true or a recognized CI provider env var), telemetry defaults to Disabled unless TRUSTABL_TELEMETRY is explicitly set.
Disabled
Nothing
Minimal
anonymous_id, cli_version, ci_provider, is_new_install, exit_code — one event at scan end
Full
All events and properties listed below
What we never collect
Never
Repo names, org names, usernames, email addresses, IP addresses
Never
File paths, directory names, or filenames from the scanned repo
Never
Source code — no snippets in any form, including inside error messages
Never
Finding content — explanation text, fix text, matched code — anything a rule produced
Never
Tool or agent names from the scanned codebase
Never
LLM details — provider name, model name, API key presence
Never
Exact file counts — coarse size buckets are used instead
Never
Env var values — CI provider detected by presence only, never values
Never
Raw error strings — errors are bucketed into a closed enum before sending
Anonymous ID
Every event carries an anonymous_id that identifies the installation, not the person. It is never derived from machine fingerprinting — no hostname, no MAC address, no username hash.
Local
Random UUID v4 generated once, stored in ~/.config/trustabl/telemetry.json. Stable across runs on the same machine.
CI
Ephemeral UUID generated per invocation, never written to disk. CI runs are counted but not session-correlated.
Events
scan.started
Fired when a scan begins, after argument validation passes
| Property | Type | Notes |
|---|---|---|
| os | string | darwin, linux, windows |
| arch | string | arm64, amd64 |
| target_type | string | "local" or "remote" (GitHub URL) |
| format | string | human, json, sarif |
| strict_mode | bool | Whether --strict was passed |
| flags_used | []string | Flag names only — never flag values |
| ci_provider | string | github_actions, gitlab_ci, circleci, jenkins, unknown, or "" (not CI) |
| is_new_install | bool | First run on this machine |
scan.completed
Fired on a successful scan (exit code 0 or 1)
| Property | Type | Notes |
|---|---|---|
| duration_ms | int | Wall-clock milliseconds |
| repo_size_bucket | string | small (<20 files), medium (<200), large (≥200). Counts Python, TypeScript, JavaScript, Go, YAML, JSON, Markdown, C#, PHP, and Rust files. |
| sdks_detected | []string | SDKs observed in code |
| languages_detected | []string | Languages recognized in the repo |
| tools_count | int | Tool definitions discovered |
| agents_count | int | Agent declarations discovered |
| findings_by_severity | object | Finding count per severity level |
| rule_ids_fired | object | Hit count per rule ID — no finding content included |
| rules_sha | string | Commit SHA of the rule pack used |
| schema_version | int | Rule schema version |
| exit_code | int | 0 (clean) or 1 (findings present) |
| features_used | []string | attest, vuln_scan, sarif_out, json_out, bom_out, no_rules_update |
| repo_id_hash | string | 32-char hex prefix of a salted SHA-256 of the CI repo env var (GITHUB_REPOSITORY, CI_PROJECT_PATH, CIRCLE_PROJECT_REPONAME). One-way — the repo name cannot be recovered. Used only for dedup. Empty outside CI or with no recognized repo env var. |
scan.failed
Fired when the scan exits with code 2 (a scanner or I/O error, not a
findings-based exit)
| Property | Type | Notes |
|---|---|---|
| error_category | string | Closed enum — raw error string is never sent. Values: rules_fetch_failed, clone_failed, parse_error, no_rules, unknown. |
| phase | string | Pipeline phase where failure occurred, derived from error_category. Values: rules, clone, inventory, unknown. |
| duration_ms | int | Wall-clock milliseconds until failure |
| rules_sha | string | Resolved rules SHA at time of failure. Empty if failure occurred before rules were resolved. |
| schema_version | int | Rule schema version at time of failure. 0 if not yet resolved. |
command.run
Fired for every non-scan subcommand invocation
| Property | Type | Notes |
|---|---|---|
| command | string | version, mcp, enrich, attest, verify, capabilities, rules.pull, rules.validate, vulndb.pull |
crash.reported
Fired only when a user explicitly chooses "Send anonymous crash
report" after a panic — never sent automatically. Independent of the
telemetry setting: fires the same whether telemetry is full, minimal,
or disabled.
| Property | Type | Notes |
|---|---|---|
| panic_value | string | Recovered panic value, best-effort redacted of common secret shapes (sk-ant-*, sk-proj-*, long hex/base64). Not guaranteed free of all sensitive content. |
| stack | string | Scrubbed stack frames only — no argument values, no source lines, file paths trimmed to basename:line. |
| version | string | CLI build version |
| commit | string | Build commit SHA |
| os | string | GOOS |
| arch | string | GOARCH |
| rules_sha | string | Always empty — build meta carries no resolved SHA at the panic site. Reserved for future use. |
First-run prompt
On the first scan in an interactive terminal (TTY), before any scan output, Trustabl asks you to choose a level. The choice is saved to ~/.config/trustabl/telemetry.json and never asked again. Empty input or no response defaults to Disabled. The prompt is never shown in CI or when output is piped.
Trustabl collects anonymous data to help improve the product.
No source code, file paths, repo names, or finding details are ever sent.
Learn more: https://trustabl.ai/telemetry
Choose a telemetry level:
1. Minimal - Version and outcome
2. Full - Usage stats
3. Disabled - No data
Enter 1, 2, or 3 [default: 3]:
No source code, file paths, repo names, or finding details are ever sent.
Learn more: https://trustabl.ai/telemetry
Choose a telemetry level:
1. Minimal - Version and outcome
2. Full - Usage stats
3. Disabled - No data
Enter 1, 2, or 3 [default: 3]:
Manage telemetry
Three mechanisms for explicit control, evaluated in this order:
1
Environment variable — highest priority
Overrides the config file.
export TRUSTABL_TELEMETRY=disabled # or: 0
export TRUSTABL_TELEMETRY=minimal
export TRUSTABL_TELEMETRY=full # or: 1
export TRUSTABL_TELEMETRY=minimal
export TRUSTABL_TELEMETRY=full # or: 1
2
CLI command — persisted
Writes your preference to the config file. Persists across sessions.
trustabl telemetry off # disable
trustabl telemetry minimal # version and outcome only
trustabl telemetry full # all anonymous usage stats
trustabl telemetry status # show current level and its source
trustabl telemetry minimal # version and outcome only
trustabl telemetry full # all anonymous usage stats
trustabl telemetry status # show current level and its source
3
Config file — manual
Edit ~/.config/trustabl/telemetry.json directly. Valid mode values: "disabled", "minimal", "full".
{"mode": "minimal", "anonymous_id": "your-uuid-here"}
Where data is stored locally
~/.config/trustabl/telemetry.json
Holds the mode setting and the stable anonymous UUID. Created when a telemetry level is chosen (first-run prompt or CLI command), directory permissions 0700, file permissions 0600. Never created in CI.
~/.config/trustabl/crash-.log
Scrubbed crash report written on an unrecovered panic, mode 0600.
Crash reports
When Trustabl experiences an unrecovered panic, it always writes a scrubbed crash report to ~/.config/trustabl/crash—<UTC-timestamp>.log — even in CI or non-interactive environments. This local file is the permanent, transparent record of what was captured. Nothing is transmitted without an explicit choice: after writing the file, Trustabl prompts the user with a numbered menu, shown only in an interactive terminal.
Help us fix it? No source code or file contents are sent.
1. Send anonymous crash report
2. Open GitHub issue
3. Do nothing
Enter 1, 2, or 3 [default: 3]:
1. Send anonymous crash report
2. Open GitHub issue
3. Do nothing
Enter 1, 2, or 3 [default: 3]:
The default action is always "Do nothing". All three options are shown on every crash — "Send anonymous crash report" is never hidden or renumbered based on the telemetry setting, because crash reporting is a separate consent from usage telemetry. Choosing it fires the crash.reported event and works even when telemetry is disabled — it only no-ops if the build has no PostHog key. Choosing "Open GitHub issue" opens a pre-filled URL in the browser; no data is transmitted by Trustabl itself.
Backend
PostHog
Events are sent over HTTPS to PostHog, a product analytics platform. Trustabl does not use PostHog for advertising, profiling, or any purpose other than product improvement. Events are batched and sent asynchronously — no telemetry call ever adds latency to a scan. Network errors are silently discarded and never affect the exit code. PostHog privacy policy →