Open data

What the agents are actually doing

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

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.

Aggregates, never machines

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.

Gaps are data too

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.

Who is installing it

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 per day

Machines that reported at least one event that day, and the ones reporting for the first time.

Platforms

Operating system and CPU architecture reported by the install.

Agents

The coding agent each machine says it drives with Gentle AI: one machine can run several.

Components

Optional pieces installed on that machine: memory (engram), SDD, skills, persona, guardrails, theme.

Versions

The gentle-ai build the machine reported last on that day.

Receipt-driven development

Machines with receipt-driven development enabled in their configuration.

Downloads

External signals, not telemetry: npm downloads of the packages and cumulative GitHub release-asset downloads.

What the agents spend

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 per day

Tokens processed per UTC day, summed over the hosts that clear the privacy floor.

Hosts

The integration that sent the rows: the tool you use, not your machine.

Models

Tokens per resolved model. Rows whose model the client could not resolve count as unknown or custom.

Effort

Tokens per reasoning effort the run was started with.

Subagents

Tokens per agent class. Orchestrator rows are the main agent; named rows are packaged subagents.

Which model ran each subagent

Every published subagent × model cell above the privacy floor: what each packaged agent ran on, by volume. A measurement table, not a quality ranking.

What we do not know

Coverage is part of the measurement, not a footnote. These are the shares of rows the collector could not fully attribute.

Read these numbers with the caveats

  • Machines, not people. An install id is minted per machine and reinstalling or rebuilding a container produces a new one. CI runners and throwaway containers that never opted out inflate the install counts, and the platform split is where you can see them.
  • The install-only share below is the honest denominator: it counts machines that sent the install event and never reported again.
  • Runtime retention is 90 days, so the runtime blocks describe a rolling window, not all of history.
  • Model attribution depends on the client. Rows sent before the model registry shipped stay unknown, and unknown or custom rows are reported as such instead of being guessed.
  • Runtime rows are independent observations: responses and tokens are never averaged into a session, so bars must be read as totals.
  • npm's 30-day aggregate is not published yet: the collector's daily rows repeat the same value across consecutive days, so summing them would overstate the number. Only the last complete day is shown.

Groups below the floor

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.

External numbers

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.

How it is collected

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.

What is collected

  • The tool version, operating system and CPU architecture.
  • Which coding agents you drive and which optional components are installed.
  • Whether receipt-driven development is enabled.
  • Runtime rows: host, agent class, public model id, selected effort, token counts, error category and timing.
  • A random install id, generated locally, used only to count machines instead of requests.

What is never collected

  • Your code, diffs, prompts, responses or file paths.
  • Your repository, organisation, hostname, username or e-mail.
  • Session identifiers, task identifiers or parent-child links between runs.
  • Any raw payload in the published snapshot: the page only ever renders grouped counts.

Turning it off

  • 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 pipeline

  • A client sends one best-effort HTTP request per observation, capped at 16 KiB and 32 rows. No queue, no retries, no local storage.
  • The collector validates against a closed vocabulary and stores raw rows for 90 days.
  • A daily job rolls each day up per machine, which is what the adoption blocks read.
  • The exporter aggregates, folds a tail only when the fold still hides two groups or more, and refuses to write a snapshot that names a group under the floor or contains an identifier-shaped string.
  • This page fetches that JSON at runtime, so the numbers never depend on when the site was last deployed.

Field glossary

The same words the dashboard, the wire contract and the datasets use.

Install

One machine running gentle-ai. Identified by a random id generated locally; it is not derived from hardware, user or account.

Heartbeat

A periodic 'still alive' event from an install that already sent its install event.

Machine-day

One machine reporting on one UTC day. A machine active on five days counts five times in a distribution.

Reference day

The most recent complete day the collector has rolled up, normally yesterday. Distribution blocks are a snapshot of that day.

Active machines

Distinct install ids that sent at least one event that day.

New machines

Installs whose first install event landed that day.

Host

The agent integration that produced a runtime row: pi, opencode, claude-code or codex.

Agent class

Which packaged agent ran: orchestrator for the main agent, then names such as sdd-apply, explore, verify.

Agent kind

How the class was recognised: orchestrator, built_in from the packaged allowlist, custom, or unknown.

Model evidence

Where the model id came from: selected (the client configuration) or response (what the provider replied).

Selected effort

The reasoning effort the run was started with: minimal, low, medium, high, xhigh, max.

Effective effort

The effort the provider actually served. Few providers report it, so it is usually unavailable and is not used in totals.

Tokens processed

input + output + cache read + cache creation + reasoning. Always the sum of the five parts, never an inferred total.

Cache read

Prompt tokens served from the provider's prompt cache, usually the cheapest and largest class.

Row

One observation from one agent run. Rows are independent: they are not sessions and have no parent-child links.

Delivery

One HTTP batch of rows from a client, capped at 16 KiB and 32 rows.

Privacy floor

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.

Is my code or my prompt sent anywhere?

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.

Why publish telemetry at all?

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.

Can I send my own data if I self-host a collector?

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.

How often does this page change?

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.

Why is the subagent split so small?

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.

Take the data

Every block on this page is also a file. CSV for spreadsheets, JSON for code. The same aggregate the private dashboard reads.

Installs per day

Active, new and heartbeat machines per UTC day.

day · active_installs · new_installs · heartbeats · events · source

Platforms

Machines by operating system and architecture.

day · platform · installs

Coding agents

Machines by the agent they drive.

day · agent · installs

Components

Machines by installed component.

day · component · installs

Versions

Machines by gentle-ai version.

day · version · installs

Runtime per host

Rows, 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_processed

Tokens per day

Tokens processed per host per UTC day.

day · host · rows · responses · tokens_processed

Models

Rows, responses and tokens per resolved model.

model · rows · responses · tokens_processed

Efforts

Tokens by the effort the run was started with.

effort · rows · responses · tokens_processed

Agent classes

Tokens per agent class, orchestrator included.

agent_class · agent_kind · rows · responses · tokens_processed

Subagent × model

One 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_categories

npm downloads

Last complete day per package, as reported by npmjs.org.

package · day · downloads

GitHub downloads

Cumulative release-asset downloads per tag.

tag · downloads

Also 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.