Skip to main content
aislop collects anonymous usage analytics to help the team understand which commands are used, how long scans take, and where issues are found most often. This data never includes your source code, file paths, project or repo names, branch names, raw diagnostic messages, or secrets of any kind. This page describes exactly what is collected, how your anonymous identity works, and how to turn telemetry off completely.

What is collected

aislop emits six named events across the CLI and MCP server lifecycle.
EventWhen it fires
cli_installedFirst-ever run on a machine, when ~/.aislop/install_id is created
cli_command_startedAt the beginning of any command (scan, fix, ci, init, doctor, rules, badge, hook install/uninstall/status/baseline)
cli_command_completedAt the end of any command — success or failure — carrying exit_code, duration_ms, score, finding counts, and per-engine stats
mcp_server_startedAfter the aislop-mcp stdio transport connects
mcp_tool_calledEach invocation of aislop_scan, aislop_fix, aislop_why, or aislop_baseline through the MCP server
hook_scan_completedAfter a Claude, Cursor, Gemini, or pi agent hook finishes a scoped scan

Properties sent with every event

Every event always includes the following fields:
PropertyValue
aislop_versionThe installed aislop version string
node_versionThe Node.js runtime version
osOperating system platform
archCPU architecture
schema_versionPayload schema version (currently "v2")
anonymous_install_idRandom UUID stored in ~/.aislop/install_id
package_managerOne of npm / pnpm / yarn / bun / npx / unknown
is_citrue only when CI=true and you have explicitly opted in via config
Command events (cli_command_started, cli_command_completed) additionally include: command, language_summary, per-language flags (lang_typescript, lang_javascript, lang_python, lang_java), file_count_bucket (0-10 / 10-50 / 50-100 / 100-500 / 500-1000 / 1000+), score_bucket, the final score, finding counts, and per-engine timings.
All properties are filtered through an allowlist before being sent. Anything not on that list is dropped automatically, even if a future caller passes it.

What is never collected

aislop is explicitly designed so that none of the following ever leaves your machine:
  • Source code or file contents
  • File paths or directory names
  • Project names or repository names
  • Branch names or commit hashes
  • Raw diagnostic messages or rule match text
  • Secrets, credentials, or environment variable values

Anonymous identity

Telemetry uses a random UUID stored at ~/.aislop/install_id (or $XDG_STATE_HOME/aislop/install_id on Linux systems that respect XDG). This file is created with 0600 permissions on first run. There is no account, no login, and no way to connect the UUID to you or your organization.
If you delete ~/.aislop/install_id, aislop generates a new UUID the next time you run a command. Your old identity is gone permanently — no data is linked across UUIDs.
The file is never created when telemetry is disabled, so opting out before the first run means the identifier is never written to disk at all.

Opting out

You can disable telemetry at any level of your stack. The following list is ordered by precedence — higher entries always win.
Set either of these environment variables to disable telemetry for the duration of that process, regardless of any config file:
AISLOP_NO_TELEMETRY=1 aislop scan
DO_NOT_TRACK=1 aislop scan
DO_NOT_TRACK=1 follows the Console Do Not Track standard, so tools that already set it will automatically opt out of aislop telemetry too.
Set telemetry.enabled: false in .aislop/config.yml to disable telemetry for everyone using that project:
# .aislop/config.yml
telemetry:
  enabled: false
Set telemetry.enabled: true to opt in. This also overrides the automatic CI default (see below), so you can explicitly keep telemetry on in CI pipelines:
# .aislop/config.yml
telemetry:
  enabled: true
When CI=true is set in the environment and there is no explicit telemetry.enabled value in config, aislop disables telemetry automatically. This means standard CI providers (GitHub Actions, CircleCI, GitLab CI, etc.) are opted out by default without any configuration.
When none of the above conditions apply, telemetry is on by default. The ~/.aislop/install_id file is created on first run with 0600 permissions.

Precedence summary

PrecedenceConditionResult
1 (highest)AISLOP_NO_TELEMETRY=1 or DO_NOT_TRACK=1Off — always
2telemetry.enabled: false in configOff
3telemetry.enabled: true in configOn (overrides CI default)
4CI=true with no explicit configOff by default
5 (lowest)DefaultOn

Inspecting what gets sent

If you want to see the exact JSON payload before it is transmitted, use the debug and dry-run flags together:
AISLOP_TELEMETRY_DEBUG=1 AISLOP_TELEMETRY_DRY_RUN=1 aislop scan
  • AISLOP_TELEMETRY_DEBUG=1 — prints every outgoing event to stderr as formatted JSON.
  • AISLOP_TELEMETRY_DRY_RUN=1 — suppresses the actual network request so nothing is sent.
Using both together is the safest way to audit what would be transmitted without sending anything.