You send it, you can read it
Anonymised usage metrics exist to know whether the tool works. The people who send them get to see them first.
Open data
Gentle AI collects a thin, anonymous stream of usage metrics and publishes it back as open data. No dashboards for investors only: the same aggregates, with the definitions, the method and the parts we do not know.
Snapshot built updated loadingdistributions from the last complete day
This snapshot has not been refreshed for more than two days, so the numbers below are older than usual. The exporter that rebuilds it runs every five minutes.
Anonymised usage metrics exist to know whether the tool works. The people who send them get to see them first.
The page only ever renders grouped counts. Anything smaller than the privacy floor — 10 machines or 10 rows — is folded into an anonymous bucket only when that bucket still hides at least two groups; a lone group is withheld instead of being dressed as one.
Rows whose model is unknown, efforts the client never reported, activity that comes from the orchestrator instead of a subagent: all of it is published as a coverage number.
The snapshot could not be loaded right now. The raw file and every dataset stay available at /data/snapshot.json.
Adoption comes from the install and heartbeat events, rolled up per UTC day. Each number is a count of machines that reported, never a count of people.
Machines that reported at least one event that day, and the ones reporting for the first time.
Operating system and CPU architecture reported by the install.
The coding agent each machine says it drives with Gentle AI: one machine can run several.
Optional pieces installed on that machine: memory (engram), SDD, skills, persona, guardrails, theme.
The gentle-ai build the machine reported last on that day.
Machines with receipt-driven development enabled in their configuration.
External signals, not telemetry: npm downloads of the packages and cumulative GitHub release-asset downloads.
Runtime rows are sent by the agent integrations — Pi, OpenCode, Claude Code, Codex — after every measured run: model, effort, agent class and the token usage the provider disclosed.
Token classes across every retained runtime row.
Tokens processed in a rolling 15-minute window ending at the last export, measured on the server clock — not the newest row. Aggregate only: no per-host, per-model or per-agent breakdown inside the window.
Tokens processed per UTC day, summed over the hosts that clear the privacy floor.
The integration that sent the rows: the tool you use, not your machine.
Tokens per resolved model. Rows whose model the client could not resolve count as unknown or custom.
Tokens per reasoning effort the run was started with.
Tokens per agent class. Orchestrator rows are the main agent; named rows are packaged subagents.
Every published subagent × model cell above the privacy floor: what each packaged agent ran on, by volume. A measurement table, not a quality ranking.
Coverage is part of the measurement, not a footnote. These are the shares of rows the collector could not fully attribute.
No group under 10 machines or rows is ever published by name. A small tail becomes one other bucket only when that bucket still hides at least two groups and clears the floor; a lone group is withheld, so a series can list fewer hosts, models or agents than it sums to.
npm and GitHub downloads come from those services' public APIs, not from telemetry, and are listed here only to keep every published number in one place.
One best-effort HTTP request per observation, a closed vocabulary, a 90-day raw window and an exporter that refuses to publish anything identifier-shaped.
DO_NOT_TRACK=1Honours the console-wide do-not-track convention.GENTLE_AI_TELEMETRY=0Environment opt-out for shells and CI images.CI / GITHUB_ACTIONSAny truthy value disables telemetry automatically.gentle-ai telemetry disablePersisted local opt-out; enable brings it back.Raw events and runtime rows are deleted after 90 days. Daily rollups — the counts behind the adoption blocks — are kept, which is why the totals can predate the retained raw window.
The same words the dashboard, the wire contract and the datasets use.
One machine running gentle-ai. Identified by a random id generated locally; it is not derived from hardware, user or account.
A periodic 'still alive' event from an install that already sent its install event.
One machine reporting on one UTC day. A machine active on five days counts five times in a distribution.
The most recent complete day the collector has rolled up, normally yesterday. Distribution blocks are a snapshot of that day.
Distinct install ids that sent at least one event that day.
Installs whose first install event landed that day.
The agent integration that produced a runtime row: pi, opencode, claude-code or codex.
Which packaged agent ran: orchestrator for the main agent, then names such as sdd-apply, explore, verify.
How the class was recognised: orchestrator, built_in from the packaged allowlist, custom, or unknown.
Where the model id came from: selected (the client configuration) or response (what the provider replied).
The reasoning effort the run was started with: minimal, low, medium, high, xhigh, max.
The effort the provider actually served. Few providers report it, so it is usually unavailable and is not used in totals.
input + output + cache read + cache creation + reasoning. Always the sum of the five parts, never an inferred total.
Prompt tokens served from the provider's prompt cache, usually the cheapest and largest class.
One observation from one agent run. Rows are independent: they are not sessions and have no parent-child links.
One HTTP batch of rows from a client, capped at 16 KiB and 32 rows.
The minimum group size (10 by default) a group needs to be published by name. A smaller tail becomes one anonymous bucket only when that bucket merges at least two groups and still clears the floor; a single group is withheld, because naming it 'other' would not hide its numbers.
No. The collector's schema has no field for code, text, diffs, paths, repository, hostname or user. A payload with an unexpected field shape is rejected, and the published snapshot is scanned for identifier-shaped strings before it is written.
Because a tool that asks for numbers should show them back. It also keeps the project honest: a claim about token savings or agent usage can be checked against the same aggregates the maintainers read.
Yes: the collector is part of gentle-ai and takes an endpoint override. The exporter and schema here are versioned (`gentle-ai.opendata/v1`), so any collector with the same tables can produce the same page.
The snapshot is rebuilt on the telemetry host every five minutes. The timestamp at the top of the page is the time of the last successful build, not the time you opened it.
Most runtime rows come from the orchestrator, which is the agent you talk to. Named subagents only appear when a packaged agent (SDD phases, explore, verify, review) actually ran, and every group below the privacy floor is folded away.
Every block on this page is also a file. CSV for spreadsheets, JSON for code. The same aggregate the private dashboard reads.
Active, new and heartbeat machines per UTC day.
day · active_installs · new_installs · heartbeats · events · sourceMachines by operating system and architecture.
day · platform · installsMachines by the agent they drive.
day · agent · installsMachines by installed component.
day · component · installsMachines by gentle-ai version.
day · version · installsRows, responses, launches and the five token classes per host.
host · rows · responses · launches · input_tokens · output_tokens · cache_read_tokens · cache_creation_tokens · reasoning_tokens · tokens_processedTokens processed per host per UTC day.
day · host · rows · responses · tokens_processedRows, responses and tokens per resolved model.
model · rows · responses · tokens_processedTokens by the effort the run was started with.
effort · rows · responses · tokens_processedTokens per agent class, orchestrator included.
agent_class · agent_kind · rows · responses · tokens_processedOne row per published subagent × model cell, with its error breakdown and duration coverage.
agent_class · agent_kind · model · rows · responses · tokens_processed · errored_rows · error_categoriesLast complete day per package, as reported by npmjs.org.
package · day · downloadsCumulative release-asset downloads per tag.
tag · downloadsAlso available: the whole snapshot as a single file at /data/snapshot.json (schema gentle-ai.opendata/v1).
The aggregated datasets are published under CC BY 4.0: use them, quote them, build on them, credit “Gentle AI — gentlemanprogramming.com/telemetry”.
The collector, the exporter and this page are part of the open-source Gentle AI and gentle-pi projects.
Something looks wrong with a number? Tell us — corrections ship as a change to the exporter, and the reason is written down next to it.