mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-26 12:26:38 -06:00
6885eb69b0
CI jobs are not installs; unchecked they outnumber operators by orders of magnitude and make version and platform counts meaningless. A configured telemetry endpoint still reports, so update-path E2E lanes keep working.
203 lines
8.4 KiB
Markdown
203 lines
8.4 KiB
Markdown
---
|
|
summary: "What OpenClaw sends: a daily update check by default, optional anonymous feature statistics, and every privacy control"
|
|
title: "Usage telemetry and update checks"
|
|
read_when:
|
|
- Checking what information OpenClaw sends and what it never collects
|
|
- Deciding whether to share anonymous feature statistics
|
|
- Enabling or disabling anonymous feature statistics
|
|
- Disabling all automatic update-check requests
|
|
---
|
|
|
|
**The only thing OpenClaw sends on its own is a daily update check.** It asks
|
|
whether a newer version exists, and the request carries nothing but the version,
|
|
operating system, and CPU architecture already visible to any package registry.
|
|
Everything else on this page is opt-in.
|
|
|
|
Anonymous feature statistics — which channels and providers you have configured
|
|
— are **off by default** and never turn themselves on. When you do enable them,
|
|
they ride along with that same daily update check instead of adding a second
|
|
request.
|
|
|
|
If you turn them on: thank you. Feature statistics are the only way we learn
|
|
which channels, providers, and plugins people actually use, and they decide what
|
|
gets improved, what gets fixed first, and what can safely be retired. A handful
|
|
of Discord anecdotes is otherwise the entire evidence base. We publish what we
|
|
learn back to everyone at
|
|
[telemetry.openclaw.ai](https://telemetry.openclaw.ai), so the data you
|
|
contribute stays visible to you.
|
|
|
|
Declining is a completely normal choice and changes nothing about how OpenClaw
|
|
works for you.
|
|
|
|
## Inspect what is sent
|
|
|
|
Run this command before or after changing your preference:
|
|
|
|
```bash
|
|
openclaw telemetry show
|
|
```
|
|
|
|
Add `--json` to get the same state and payload as one machine-readable
|
|
document.
|
|
|
|
The output shows whether feature statistics are enabled, why they are enabled
|
|
or disabled, the request endpoint, and the last successful check. When feature
|
|
statistics are enabled, it prints the exact JSON payload the next request would
|
|
send. When they are disabled, it shows the update-only request and its
|
|
`User-Agent` header instead.
|
|
|
|
## Daily update check
|
|
|
|
The default request is:
|
|
|
|
```http
|
|
GET https://telemetry.openclaw.ai/api/latest-version
|
|
User-Agent: openclaw/2026.8.2 (darwin; node/26.0.1; arm64; gateway)
|
|
```
|
|
|
|
The `User-Agent` contains the OpenClaw version, operating system, Node.js
|
|
version, CPU architecture, and whether the request came from the Gateway or
|
|
CLI. It has no request body, install identifier, machine identifier, or random
|
|
tracking identifier.
|
|
|
|
The service responds with the latest version and, optionally, a short
|
|
operator-facing note. OpenClaw displays an available update and its note through
|
|
the existing update notice. Unreachable services, timeouts, invalid responses,
|
|
and other failed checks do not interrupt startup or normal operation.
|
|
|
|
A successful response and its timestamp are cached in the existing shared state
|
|
database. Startup reuses the cached result for the next 24 hours, and a running
|
|
Gateway checks again during normal maintenance with a small random delay. Failed
|
|
checks do not count as successful daily checks.
|
|
|
|
For testing or self-hosting, set `OPENCLAW_TELEMETRY_ENDPOINT` to your complete
|
|
replacement endpoint URL. The public server source is available at
|
|
[openclaw/telemetry](https://github.com/openclaw/telemetry).
|
|
|
|
## Optional anonymous feature statistics
|
|
|
|
Feature statistics are **off by default**. Interactive setup offers a one-time
|
|
opt-in with **No thanks** selected by default. Non-interactive and scripted
|
|
installations never opt in automatically. OpenClaw records when you accepted or
|
|
declined so it does not ask again.
|
|
|
|
When you explicitly enable feature statistics, the same daily request becomes a
|
|
`POST` with this complete JSON payload:
|
|
|
|
```json
|
|
{
|
|
"schema": 1,
|
|
"version": "2026.8.2",
|
|
"platform": "darwin-arm64",
|
|
"node": "26.0.1",
|
|
"surface": "gateway",
|
|
"features": {
|
|
"channels": ["discord", "telegram"],
|
|
"providerFamilies": ["anthropic", "openai"],
|
|
"plugins": ["codex", "diagnostics-otel"],
|
|
"pluginsEnabled": 9,
|
|
"sessionsLast24h": 14
|
|
}
|
|
}
|
|
```
|
|
|
|
| Field | Meaning |
|
|
| --------------------------- | ------------------------------------------------------------------------- |
|
|
| `schema` | Payload format version, currently `1`. |
|
|
| `version` | Installed OpenClaw version. |
|
|
| `platform` | Operating system and CPU architecture. |
|
|
| `node` | Running Node.js version. |
|
|
| `surface` | Request origin: `gateway` or `cli`. |
|
|
| `features.channels` | Publicly known enabled channel plugin names, sorted alphabetically. |
|
|
| `features.providerFamilies` | Publicly known configured provider names; never model names. |
|
|
| `features.plugins` | Publicly known enabled plugin names, sorted alphabetically. |
|
|
| `features.pluginsEnabled` | Total enabled plugins, including privately developed plugins never named. |
|
|
| `features.sessionsLast24h` | Number of sessions observed during the preceding 24 hours. |
|
|
|
|
OpenClaw names only plugins and channels that are bundled with OpenClaw or
|
|
already appear in its official plugin catalog. Privately developed plugins are
|
|
counted but never named because a private plugin name could identify its
|
|
organization. Subtract `features.plugins.length` from `features.pluginsEnabled`
|
|
to find the number of unnamed private plugins.
|
|
|
|
The sender and `openclaw telemetry show` use the same payload builder, so the
|
|
JSON displayed by the CLI is the same payload the sender would use at that
|
|
moment.
|
|
|
|
Reports carry no identifier of any kind, which means they cannot be linked to
|
|
each other. We can see that some install runs Telegram with Anthropic models; we
|
|
cannot see that it is the same install as yesterday, and we cannot build a
|
|
history of any single machine. That costs us retention analysis, and we consider
|
|
it worth paying.
|
|
|
|
### What is never collected
|
|
|
|
Neither request tier includes message content, prompts, model names, API keys,
|
|
credentials, secret references, file paths, hostnames, account identifiers,
|
|
user identifiers, or installation and machine identifiers. OpenClaw does not
|
|
create a random UUID or other persistent request identifier, so daily requests
|
|
cannot be linked through an OpenClaw-issued identifier.
|
|
|
|
Anonymous feature statistics are separate from optional, operator-configured
|
|
[OpenTelemetry export](/gateway/opentelemetry).
|
|
|
|
## Turn feature statistics on or off
|
|
|
|
Enable or disable anonymous feature statistics at any time:
|
|
|
|
```bash
|
|
openclaw telemetry on
|
|
openclaw telemetry off
|
|
```
|
|
|
|
You can also configure the same preference directly:
|
|
|
|
```json5
|
|
{
|
|
telemetry: {
|
|
enabled: false,
|
|
},
|
|
}
|
|
```
|
|
|
|
Set `DO_NOT_TRACK=1` or `DO_NOT_TRACK=true` to force feature statistics off,
|
|
even when `telemetry.enabled` is `true`. `DO_NOT_TRACK` does not disable the
|
|
daily update check: OpenClaw sends the update-only `GET` request without a
|
|
feature-statistics body.
|
|
|
|
## Automated environments
|
|
|
|
OpenClaw sends nothing when it detects an automated environment, meaning the
|
|
`CI` environment variable is set to a truthy value. Continuous integration jobs
|
|
are not installations: they would outnumber real operators by orders of
|
|
magnitude and make version and platform counts meaningless, and your pipeline
|
|
should not report to us on every job.
|
|
|
|
This applies to both tiers, so a CI job sends no update check and no feature
|
|
statistics. Setting `OPENCLAW_TELEMETRY_ENDPOINT` overrides the suppression,
|
|
because a configured endpoint means the run is deliberately exercising this
|
|
path.
|
|
|
|
## Disable every automatic update request
|
|
|
|
To go fully dark, disable the existing startup update check:
|
|
|
|
```json5
|
|
{
|
|
update: {
|
|
checkOnStart: false,
|
|
},
|
|
}
|
|
```
|
|
|
|
This stops both tiers and every automatic update request: no update request, no
|
|
feature statistics, and no update notice, even when `update.auto.enabled` is
|
|
`true`. Setting `OPENCLAW_NO_AUTO_UPDATE=1` also prevents automatic update
|
|
requests and applies. Explicit update commands remain available when you choose
|
|
to run them.
|
|
|
|
See [Configuration reference](/gateway/configuration-reference#telemetry) for
|
|
the full `telemetry` configuration and
|
|
[Update configuration](/gateway/configuration-reference#update) for the
|
|
automatic update-check controls.
|