By Jetformat
What is sent
After a command finishes, the CLI queues one record:
| Field | Example | Why |
|---|---|---|
command |
text, word to-pdf |
Which features matter |
format |
markdown, json |
Which output shapes matter |
input_ext |
docx, pdf, url |
Which file types people bring |
duration_ms, ok, error_kind |
840, false, not_found |
Where it is slow or fails |
version, os, arch |
0.1.6, darwin, arm64 |
What to keep supporting |
client |
claude-skill, openai-skill, deepseek-harness |
Which agent host called it (from JETFORMAT_CLIENT) |
install_id |
random 32 hex characters | Counts installations, not people |
That is the complete list. No path, no file name, no file size, no contents, no hash, no account id, no IP-derived location is stored. The install_id is generated on your machine, lives in ~/.jetformat/telemetry.json, and is not linked to a sign-in.
When it is sent
Pings go to ~/.jetformat/telemetry-queue.jsonl first. The queue is flushed in one request on the first run, then at most once a minute or when 25 pings are waiting, with a 1.5 second timeout. A command never waits on the network, and offline use keeps working; unsent pings are capped at 500 and retried later.
Turn it off
Any of these stops it. Nothing is queued or sent while it is off.
jetformat telemetry off # saved in ~/.jetformat/telemetry.json
export JETFORMAT_TELEMETRY=off # per shell or per CI job
export DO_NOT_TRACK=1 # the cross-tool convention
jetformat telemetry status # shows the current state and why
The first ping prints a one-line notice on stderr so nobody finds out later.
What billing sends
Paid commands also report the verb, the unit count, and a job id so credits can be charged. That path is separate and needs a sign-in. See where do my files go.