What leaves your machine — a prompt inspector that never sends the prompt
The privacy leg of this site had exactly one instrument, and it reads a table of what providers SAY in their terms. This one measures the thing itself. Paste a prompt or a document; the page counts the UTF-8 bytes a hosted request would carry, names every identifier inside them — addresses, keys, card numbers, IPs, and the paths and file names of your own machine — marks each one in place, and sets that against the same text handed to a model running locally, where the answer is zero by construction rather than by promise.
Where it runs
In-labRuns entirely in your browser and makes no request of any kind — no upload, no analytics event, not even a length counter. Turn off your network and it still works.
Live demo
Nothing you type here leaves this page. There is no request in this instrument — no upload, no analytics event, not even a count of how long your text was. Everything below is computed by your own browser from the box beneath it, which is exactly what a model running on your own machine would do with it. Turn off your network and it still works.
Why bytes and not tokens. Every vendor tokenises differently, so a token count is an estimate of one provider's billing unit and a guess about everyone else's. Bytes are not an estimate: they are what the wire carries, identical for every provider, and computable here without shipping anyone's tokenizer.
To a hosted model: 0 B leave this machine, carrying 0 detected identifiers. To a model running on this machine: 0 bytes leave, carrying 0 identifiers.
Stack
The problem
Everyone knows in the abstract that a pasted stack trace goes to somebody else's computer. Nobody knows what is in their own paste. The stretch of text between "here is my error" and "please fix it" routinely carries a service key, a customer email, an internal hostname and the name of a file the reader would never send on purpose — and no instrument on this site, or on most others, will tell you which.
The approach
A pure-TypeScript detection core with zero framework imports and no I/O, wrapped in a demo that computes everything synchronously from component state. Detection is shape-based on purpose: every class is something a regular expression recognises from its form alone, because the moment a class needs semantics the honest answer is a model, and a model is what this page exists to keep out of the loop. Card-shaped digit runs are gated on Luhn before they are reported.
Decisions & trade-offs
- 01It counts BYTES, not tokens, and says so on the page. Every vendor tokenises differently, so a token count is an estimate of one provider's billing unit and a guess about the rest; bytes are what the wire carries, identical everywhere, and computable without shipping anyone's tokenizer.
- 02No telemetry is wired into this demo at all — not a page view, not a run counter, not an anonymous length histogram. The page makes a claim the reader cannot verify by looking, so the only thing that makes it true is that the code contains no way to send anything. A component test mocks fetch and navigator.sendBeacon and proves neither is reached.
- 03Your own file names get their own section, above the fold of the breakdown. A path is reported as a path everywhere else; the name at the end of it is usually the most private string in the prompt, and it is the class readers are least braced for.
- 04Findings are shown redacted in the breakdown table even though the reader's own text sits in the box above. Reprinting a live key into a second element earns nothing, and the table exists to name the shape of what was found, not to show it twice.
Where it stands
The instrument is live and the detector is pinned by 57 unit tests. What it does not yet do: name what a given provider would RETAIN of what it just counted — that is /tools/privacy-cost, and joining the two is the next move.
- You can run it here — metA live demo on the page itself, in your own browser — not a screenshot of one, and not a promise that one is coming.
- Its core is pinned by tests — metThe arithmetic underneath is a plain module with its own test suite, so every number the interface prints is a number something checks.
- The code is public — not yetA link to the source, so a reader who disagrees with a figure can go and read the line that produced it.
- It has found something — not yetAt least one stated finding — a thing the instrument taught that the build could not have written down before it existed.
Not shipped yet: 2 criteria are still open — the code is public, it has found something.
- 2026-09-05Built the inspector that never sends the prompt