What Helpike collects
This page is the contract. It describes everything Helpike sends about your usage, under what circumstance, and how to turn it off. If anything here differs from what the software does, that is a bug — and the field list is frozen by a test in the source. The agreement itself is section 5 of the terms of use; this page is the field-by-field detail behind it.
helpike-mcp) makes no network request for telemetry — not one. Nothing on this page
changes that.
The two layers
Layer 0 — the CDN log (always on, like any download)
The app makes HTTPS requests to this site: when you download the installer, the catalog, a
DocPack or the model — and also once an hour, on its own, to ask whether a new
version exists (/download/latest.json, with the version, OS and architecture in the
query string). An open app also reloads the catalog every 30 minutes.
Like every server on the internet, the CDN records a line for each of those requests: date, path requested, status, bytes, IP and User-Agent. That is true of any file you download from anywhere, and it existed before any decision of ours. What the project does with those lines:
- aggregates them by day, never per request;
- counts downloads per platform and per pack;
- estimates distinct machines from a digest of
IP + User-Agentsalted with a secret that rotates every month — which makes it impossible to link two months of observations to the same machine; - never stores the IP in the database. It exists only in memory, during aggregation, and the raw log expires from storage after 45 days.
The app's User-Agent is Helpike/2.3.0 (macos; aarch64) and the sidecar's is
helpike-mcp/0.1.0 (macos; aarch64). Product name, version, system and architecture —
nothing else.
Layer 1 — the beacon (declared in the terms of use)
Once you accept the terms of use — the screen the app shows at first launch, whose section 5 declares this — the app makes one GET per day, carrying the previous day's counters. Before that acceptance, nothing is sent at all.
The acceptance is not retroactive. Accepting marks yesterday as already
reported: whatever was recorded before the terms were read is never sent. Exporting
DO_NOT_TRACK stops the sending immediately, including in the middle of a send
already under way.
There is no server receiving this: the target is a 3-byte file on the same CDN, and the line the CDN writes in its access log is the collection.
The literal payload
The app shows this URL on its own screen. It is built by the same function that does the sending:
GET https://helpike.com/beacon.txt
?v=1
&i=0123456789abcdef0123456789abcdef
&d=2026-08-23
&a=2.3.0&o=macos&r=aarch64
&fd=41&pk=7&pb=3120&ao=3&am=214&sc=5&em=95
&q=88&q0=4&t=12&p50=31&p95=84&md=1
&cl=claude-code:4,cursor:1
&tp=rails,turbo,rubyllm
| Field | Meaning |
|---|---|
v | payload version |
i | install id: 16 random bytes, generated on this machine |
d | the (closed) day the numbers refer to, UTC |
a · o · r | app version · operating system · architecture |
fd | days since first run |
pk · pb | packs installed · MB on disk |
md | 1 if the embedding model is installed |
ao · am | times the app was opened · minutes with the window open |
sc | MCP assistant sessions |
em | engaged minutes: 5-minute windows with at least one MCP event |
q · q0 · t | searches · searches with zero results · other tool calls |
p50 · p95 | search latency, in ms |
cl | assistants that connected, with how many sessions each |
tp | up to 8 packs that answered the searches |
What is NEVER sent
- The text of your searches. Never — not truncated, not hashed.
- Project paths, file names or directory names.
- Titles or content of the pages a search returned.
- Machine name, OS user name, e-mail, phone number.
- Any hash of the above — a hashed path is still tracking a project.
There is no account, login, session or cookie anywhere in the product.
tp is the one apparent exception, and it is not one: a pack slug
(rails) is public catalog data, and it is the only way to answer "which packs do
people actually consult after downloading". Only names that exist in the published
catalog are sent — a pack you built yourself and copied into
~/.helpike/packs is filtered out before sending, because its name is a directory and
a file on your disk. With no catalog reachable, tp goes out empty.
How to turn it off
In the environment: export DO_NOT_TRACK=1 or
HELPIKE_NO_TELEMETRY=1. It is re-read before every send, so it takes effect without
restarting the app. DO_NOT_TRACK is the cross-tool convention; the Helpike variable
exists so you can silence this app alone.
There is no switch in the app. Layer 1 is declared in section 5 of the terms of use and starts with your use of the product; what the app offers on screen is the transparency — the usage-data panel on the Home screen shows the literal URL that would be sent, and this installation's id.
To change identifier, delete ~/.helpike/install.json: a new one is generated on the
next run and nothing links it to the old one. To have rows already sent deleted, send the
i the app shows on that same screen to
support@helpike.com — every row matching that id is
removed. The same address takes security reports.
What stays on your machine, and where
| File | What it is |
|---|---|
~/.helpike/activity.jsonl | everything the assistants did, including the text of the searches. Written since day one, never sent. "Clear history" on the Home screen erases it. |
~/.helpike/appuse.jsonl | one line every 5 minutes while the app is open |
~/.helpike/usage/<day>.json | the daily rollup — exactly the numbers in the table above |
~/.helpike/install.json | the install id, the terms revision you accepted and the day you accepted it |
All of them are plain text, readable with cat. Deleting any of them is safe.
Why it exists
The project is free, has no revenue and is maintained by one person. The questions telemetry answers are the ones that decide what to work on: which packs are worth maintaining, how many people actually use it, and — the most expensive of them — when download traffic will pass the CDN's free tier and start costing hundreds of dollars a month.
The honest alternative to measuring is guessing. The dishonest one is measuring without saying so.