Paste Shield: strip personal data before you paste
It strips names, addresses, account numbers, keys and passwords out of text before you paste it into ChatGPT, and it does all of that work inside your browser.
Every paste into ChatGPT is a potential leak
You paste a snippet of an email, a log, or a config into a model, and you easily leave names, addresses, account numbers, API keys and passwords behind. Tools that clean text on a server only move the leak somewhere else. So we built a filter that removes this data before it leaves the browser tab: no install, no account, no text sent to an external API.
Three detection layers, all on device
- NER model
- Data with no fixed shape: people's names, addresses and places. Understands sentence context. Runs in a Web Worker (@huggingface/transformers) on the CPU, through WebAssembly, so Chrome, Edge, Firefox and Safari all give the same result.
- Checksum-verified rules
- Data with a fixed shape: API keys, tokens, JWTs, private keys, IBANs, cards, national and tax IDs, e-mail addresses, phone numbers, dates, passwords. They run instantly, before the model even loads, because a leaked key is catastrophic.
- Your always-hide list
- Words only you know are sensitive: client names, project codenames. The model cannot infer them.
Hits from all three layers merge into one list, with no confidence cutoff: a miss is a leak, so over-redaction is the safe side of the error. Where a rule and the model describe the same span, the rule wins: a tax number proven by its checksum stays a tax number instead of being relabelled a bank account. The model runs fail-closed: a load error blocks copying until you reload the model.
One download, then offline
The model downloads once, from huggingface.co, and stays in the browser's cache. The app's own request counter shows those megabytes live, so you do not have to take our word for it.
The model uses standard ONNX operators only, so it runs on the CPU through WebAssembly: the same in Chrome, Edge, Firefox and Safari, on a laptop and on a phone. There is no separate rules-only mode for weaker devices. When the browser reports a metered connection, the download waits for your tap. When there is no room to store the model, the app says plainly that it will download again next time.
Zero requests, not a claim, an architecture
Your text never leaves your browser.
- 0
- network requests carrying your text: it never leaves your browser, so there is nothing on a server to steal.
- 135 MB
- the model downloads once and stays in your browser: 6.5 s on a fast link, about a minute on a 20 Mbit one. After that it works offline.
- fail-closed
- a model load error blocks copying: even a failure never lets unprotected text out.
Method: "zero requests" is about your text, not about the whole page. The one thing that does leave the machine is the model download, shown in the app as its own counter row: the file model_quantized.onnx is 135,359,829 bytes, plus a 2.9 MB tokenizer, and the time is counted from first paint to the model being ready. Cross-origin isolation headers (COOP/COEP/CORP) are set in next.config.ts and vercel.json. The app ships no analytics and no telemetry of any kind. Code: 2,473 lines of TypeScript in src (blank and comment-only lines excluded) and 206 unit tests.
Our own project. We built it and we run it ourselves.
Every choice has a reason
| Layer | Choice | What it does |
|---|---|---|
| Framework | Next.js (App Router) | The page computes everything on your machine, so there is no request that could carry the text out. |
| Model | distilbert-base-multilingual-cased-ner-hrl, q8 | It recognizes names and addresses in every browser, with no graphics card. |
| Runtime | @huggingface/transformers, ONNX Runtime | The model runs in the background, so typing in the window never stutters. |
| Structured detection | Rules on the main thread, model in a worker | A number proven by its checksum is labelled for what it is instead of being guessed. |
| Offline | Service worker + CacheStorage | After the first download the app opens with no internet at all. |
