PII Detector Demo

Card numbers, emails, phone numbers and API keys are found before text leaves the device. The language model only ever sees placeholders.

Kaihuan Huang Independent reimplementation · all data is synthetic

Try it

Detected

What the model receives

Card numbers must pass a Luhn check, so the rules never call an order number a card (the model may still mask it as an account number, erring on the side of caution). Where both disagree, a check-digit match wins. Repeated values keep the same placeholder, so the model can still reason about them. Rules alone miss names, addresses and dates; the local model below finds them.

Run the model on this device

The same open model the full service uses, openai/privacy-filter (Apache-2.0), running in your browser on WebGPU. The weights download once from Hugging Face and are cached. Your text is never sent anywhere.

What is inside the model: architecture card. 1.40B parameters in a 128-expert mixture-of-experts with 4 experts active per token, grouped-query attention (14 heads, 2 KV heads), a 128-token sliding window and 128K context; that is why it runs in a browser at all. Generated from the config alone, no weights downloaded.

Desktop Chrome with the Network panel open. The requests are the one-time weight download (837 MB from Hugging Face). Detection then runs twice, in 485 ms and 444 ms, with 0 network requests; the only new entry is a local blob: script created inside the browser.

Needs a desktop browser with WebGPU (Chrome or Edge) and about 3 GB of free memory.

Why local

Admin walkthrough

Synthetic data. Acknowledge a card-number incident, preview exactly who an enforcement change will block before confirming it, then view credentials, which are write-only and show only their last four characters.