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.
Turning it off
Section titled “Turning it off”Either of these switches it off completely. They are equals — neither is a lesser alias of the other.
export BINCLUSIVE_TELEMETRY=0export 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.
Exactly what an event contains
Section titled “Exactly what an event contains”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.
| Field | Example | Why |
|---|---|---|
| Command | scan | Which parts of the CLI are used. |
| Skill tag | write-code | Present only when a coding agent identified the skill it was running. Separates agent-driven runs from hand-typed ones. |
| CLI version | 0.20.0 | Whether a release is being adopted. |
| Operating system | darwin | Which platforms to keep working. |
| CPU architecture | arm64 | Same. |
| Outcome | success or failure | Whether the command worked. |
| Duration | 1234 (milliseconds) | How long it took. A slow command that then failed looks identical to a fast one without this. |
| Machine id | a random UUID | Distinguishes one machine from another so a hundred runs from one laptop is not a hundred users. |
| Run origin | ci or customer | So one pipeline firing two hundred times does not read as two hundred people. |
Exactly what an event never contains
Section titled “Exactly what an event never contains”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.
The machine id
Section titled “The machine id”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.
Where an event goes
Section titled “Where an event goes”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.
Runs that are never counted
Section titled “Runs that are never counted”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.
Why it is on by default
Section titled “Why it is on by default”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.