Telemetry
AxonFlow SDKs and all four integration plugins (OpenClaw, Claude Code, Cursor, and Codex) send a small anonymous telemetry ping so the team can understand adoption, runtime compatibility, and broad deployment patterns. Telemetry is designed to be low-risk, fire-and-forget, and easy to disable.
This page is mainly for platform owners and senior engineers who need to answer two practical questions: what leaves the environment by default, and how should we standardize telemetry behavior across teams?
Default Behavior
Across the current SDKs and plugins:
- SDK telemetry is off by default in sandbox mode
- SDK telemetry is on by default in non-sandbox modes, including localhost and self-hosted evaluation
- OpenClaw plugin telemetry is on by default for local, self-hosted, and remote deployments (fires once per plugin initialization)
- Claude Code, Cursor, and Codex plugin telemetry is on by default (fires once per install, guarded by a stamp file at
$HOME/.cache/axonflow/{plugin}-telemetry-sent)
That means local development on localhost now emits the same anonymous startup telemetry as other non-sandbox/self-hosted evaluation environments unless you explicitly opt out.
What Is Collected
The payload is intended to describe SDK usage shape, not business data.
| Field | Example | Source | Purpose |
|---|---|---|---|
| SDK / plugin identifier | typescript, claude-code-plugin | All | Understand language and integration adoption |
| SDK / plugin version | 5.2.0, 0.4.0 | All | Track upgrade patterns |
| Mode | production or sandbox (SDKs), production or development (plugins) | All | Understand deployment behavior |
| OS and architecture | linux, arm64 | All | Prioritize platform support |
| Runtime version | node, python, go, JVM info, or bash version | All | Compatibility tracking |
endpoint_type | localhost, private_network, remote, unknown | SDKs only | SDK-derived classification of the configured AxonFlow URL. New in v5.3.0 / v6.3.0. The raw URL is never sent or hashed. |
| Platform version | 7.0.1 | Plugins only | Detected from AxonFlow /health endpoint (best-effort, 2s timeout) |
| Features | ["hooks:2"] | Plugins only | Hook count and configuration summary |
| Random instance identifier | UUID-like value | All | De-duplicate anonymous pings |
endpoint_type classification rules
localhost—localhost,127.0.0.1,::1,0.0.0.0,*.localhost, anything in the127.0.0.0/8loopback range, the IPv6 unspecified address::, and any fully-expanded equivalent of::1(e.g.0:0:0:0:0:0:0:1)private_network— RFC1918 IPv4 ranges (10/8,172.16-31,192.168/16), IPv4 link-local (169.254/16), IPv6 ULA (fc00::/7, RFC 4193), IPv6 link-local (fe80::/10), and the hostname suffixes.local,.internal,.lan,.intranetremote— everything else (public hostnames, public IPv4 and IPv6 addresses)unknown— any URL that can't be parsed
Deprecated site-local IPv6 addresses (fec0::/10, withdrawn by RFC 3879) are classified as remote, not private_network.
This field lets us distinguish localhost evaluation traffic from real production deployments on the checkpoint dashboard, without ever seeing the URL itself.
What Is Not Collected
- the configured AxonFlow URL itself — only the SDK-derived
endpoint_typeclassification - prompts, responses, or tool outputs
- MCP statements or connector parameters
- API keys, client secrets, tokens, or credentials
- tenant names, company names, or user identities
- file paths, environment-variable values, or request payload contents
- hashes of any of the above
How to Disable Telemetry
Environment Variables
export DO_NOT_TRACK=1
# or
export AXONFLOW_TELEMETRY=off
SDK Configuration
- TypeScript
- Python
- Go
- Java
const client = new AxonFlow({
endpoint: process.env.AXONFLOW_ENDPOINT!,
clientId: process.env.AXONFLOW_CLIENT_ID!,
telemetry: false,
});
client = AxonFlow.sync(
endpoint="http://localhost:8080",
client_id="demo-client",
telemetry=False,
)
enabled := false
client := axonflow.NewClient(axonflow.AxonFlowConfig{
Endpoint: "http://localhost:8080",
ClientID: "demo-client",
TelemetryEnabled: &enabled,
})
AxonFlow client = AxonFlow.create(
AxonFlowConfig.builder()
.endpoint("http://localhost:8080")
.clientId("demo-client")
.telemetry(false)
.build()
);
Endpoint
Telemetry pings are sent to https://checkpoint.getaxonflow.com/v1/ping. For private or air-gapped deployments, override the endpoint with the AXONFLOW_CHECKPOINT_URL environment variable.
Operational Characteristics
- SDK telemetry is sent once per client initialization, not once per request
- OpenClaw plugin telemetry fires once per plugin registration (on each IDE launch)
- Claude Code, Cursor, and Codex plugin telemetry fires once per install (stamp file guard prevents repeat pings; delete
$HOME/.cache/axonflow/{plugin}-telemetry-sentto re-send) - failures are silent and should not break SDK usage
- the call is designed to run in the background with a short timeout
- explicit SDK config can override the normal default behavior
Recommended Team Policy
Most organizations land on one of these operating patterns:
- leave telemetry enabled in shared non-sandbox environments, including localhost or self-hosted evaluations, so adoption and compatibility signals reach the AxonFlow team
- disable telemetry in tightly regulated or locked-down production estates with
DO_NOT_TRACK=1orAXONFLOW_TELEMETRY=off - bake the choice into base images, deployment templates, or internal SDK wrappers so application teams get a predictable default
Why This Exists
Telemetry helps the team prioritize the SDKs, operating systems, and runtime combinations that real engineers are using. That is especially important when AxonFlow is used across multiple languages and deployment modes.
If your organization prefers not to send anonymous usage data, the opt-out controls above are the supported way to disable it.
