octolens npm package collects a small amount of usage
telemetry: enough to see which commands earn their keep and where they fail,
and nothing that could identify what you were working on. This page is the
full contract — what is sent, what can never be sent, why telemetry cannot
affect a run, and how to turn it off with one environment variable.
Where telemetry exists at all
Only in the published npm package (the customer edition). If you run the CLI from a checkout of the Octolens repository, telemetry is compiled out — that edition sends nothing, ever, regardless of configuration.What is sent
Product events, each carrying only environment metadata:- the CLI’s own version, release channel and build commit,
- the edition and transport in use (for the published package: the customer edition, over REST),
- the operating system platform (as Node.js reports it —
linux,darwin,win32), - and the Node.js major version the CLI is running on.
The events
cli_command_completed — exactly one per invocation, success or failure,
emitted by the shared command lifecycle (never by individual commands). Its
full property list, on top of the environment metadata above:
cli_command_not_found — emitted when you invoke a command that does not
exist, carrying a single property: attempted_id. Its value is never anything
you typed: when the unknown id closely resembles a real command or command
group (the same near-miss tolerance the “did you mean” hint uses), the
property is that real command id (mentons reports as mentions);
anything else — a pasted token or credential, a search term, any free text in
the command position — is replaced by <redacted> before capture. Either way
the value is drawn from the CLI’s own public command vocabulary, so no
user-typed byte ever leaves the machine on this path.
Events are attributed to your workspace id once you are logged in — the
same identifier the Octolens web app uses, tied to the workspace rather than
to a person. Before any login exists, events carry a random install id,
generated on first use and stored in the CLI’s config file
(~/.config/octolens/config.json, created 0600). It identifies the
install, nothing else, and it is never regenerated once created.
The signup and upgrade funnel events
Beyond command-level events, the CLI records the local steps ofoctolens signup and octolens upgrade — the parts of getting started that
happen entirely inside your terminal, which the server can never see. Each
event carries only a step name, an outcome flag or a short machine reason
(such as timeout or no_browser_flag), and the signup method
(browser_handoff or headless) — never your email, company domain,
verification code, or API key:
cli_signup_browser_opened— whether the signup page could be opened in a browser (with the reason when it could not),cli_signup_callback_received— the browser delivered the new API key back to the terminal,cli_signup_code_requested/cli_signup_code_verified— the headless email-code steps (including whether a run resumed via--signup-id),cli_signup_key_validated/cli_signup_profile_saved— the key checked out against the deployment and the login was stored,cli_signup_abandoned— the signup died locally: the browser wait timed out, the process was interrupted, or a prompt was cancelled,cli_signup_already_authenticated— signup was refused because this terminal is already logged in,cli_upgrade_link_opened— whether the one-time upgrade link could be opened in a browser.
What is never sent
Command arguments, keyword terms, search phrases, mention content, file paths, environment variables, API keys — anything you type or anything the API returns. Telemetry describes that the CLI was used, never what it was used on.Why it cannot affect a command
The telemetry module is built so that its worst day is invisible:- It never blocks. Events are buffered in memory and posted in a single batch as the process exits, with a hard cap of 400ms — an unreachable or hung endpoint cannot delay your shell prompt beyond that, and cannot hold the process alive.
- It never prints. Nothing reaches stdout or stderr, in any mode —
--jsonoutput stays exactly one document, and network failures are swallowed silently. - It never changes behaviour. Exit codes,
--jsondocuments and error envelopes are byte-identical with telemetry enabled, disabled, or failing.
