Skip to content

About anonymous usage telemetry

b8e sends one anonymous event per command invocation so we can see which commands are actually used. It is on by default, it collects nothing that could identify you or your code, and you can switch it off with one environment variable you may already have set.

This page is the full version of the notice b8e prints on its first run.

Either of these switches it off completely. They are equals — neither is a lesser alias of the other.

Terminal window
export BINCLUSIVE_TELEMETRY=0
Terminal window
export DO_NOT_TRACK=1

“Off” means off before anything happens, not merely “we skip the send”: no identifier is created, no file is written, no notice state is recorded, and no network connection is opened. A machine that has opted out leaves no telemetry trace on disk at all.

Nine fields, and this list is exhaustive — it is enforced by the type the event is built from and by the schema that parses it at the other end, so a tenth field cannot be added by accident.

FieldExampleWhy
CommandscanWhich parts of the CLI are used.
Skill tagwrite-codePresent only when a coding agent identified the skill it was running. Separates agent-driven runs from hand-typed ones.
CLI version0.20.0Whether a release is being adopted.
Operating systemdarwinWhich platforms to keep working.
CPU architecturearm64Same.
Outcomesuccess or failureWhether the command worked.
Duration1234 (milliseconds)How long it took. A slow command that then failed looks identical to a fast one without this.
Machine ida random UUIDDistinguishes one machine from another so a hundred runs from one laptop is not a hundred users.
Run originci or customerSo one pipeline firing two hundred times does not read as two hundred people.

No source code. No file names or paths. No scan findings, rule ids or violation counts. No URLs, hostnames or repository names. No account, organisation or project identity, and no way to join a telemetry event to one. No IP-derived location, no email, no username.

Running b8e against a private codebase sends us nothing about that codebase.

It is a random UUID generated on your machine the first time b8e runs and stored under ~/.config/b8e, next to your credentials. It is not derived from your hostname, MAC address, username or any path — a derived identifier is not an anonymous one, because anyone who can compute the same derivation can undo it.

Deleting ~/.config/b8e/telemetry.json resets it, and you get a new random id. Nothing joins the old one to the new one.

To the same endpoint the rest of the CLI talks to — the one BINCLUSIVE_API_URL names, at /telemetry instead of /graphql. Point b8e at a staging or self-hosted deployment and its usage events follow it; there is no second telemetry host and no separate variable that could send a staging run’s usage somewhere you did not choose.

Development builds of b8e and the builds our own release tests drive send nothing at all. Only a released build in someone else’s hands is counted, which is the point of counting.

A run with no credential sends nothing. The endpoint is authenticated, so an event is sent under whichever credential the run already has — your b8e auth login session, or a pipeline’s BINCLUSIVE_API_KEY — and a run holding neither is simply not counted. In practice that branch is narrow: nothing runs without an identity, so the commands that reach it are the two exempt from the credential gate, auth and doctor — plus b8e audit on a provisioned cloud runner, whose instance identity satisfies the gate but is not a telemetry bearer. Everything else refuses with exit 7 before there is a command to count. Nothing about that credential is stored with the event: it proves the request came from a real user and is then discarded, which is why the list above can say no account, organisation or project identity is recorded.

--help, --version, and a mistyped command send nothing either. Those never run a command, so there is no command name to report — and reporting what you typed instead is exactly the thing the list above promises we do not do.

The same reason Next.js, Homebrew, Astro and the Angular CLI ship the same thing: an opt-in signal measures the people who opt in, which is not the question. What makes on-by-default acceptable is the rest of this page — the notice you cannot miss, the opt-out that costs one line, and a payload narrow enough that reading it end to end takes ten seconds.