Your name is none of the model's business.

curtain-privacy detects names, email addresses, and other identifiers and replaces them with placeholders before any model sees your message, then restores them in the reply. It runs entirely in your browser. After a one-time model download, nothing you type leaves this device. Try it below.

The first visit downloads two models from Hugging Face. That download is the only network activity on this page. The card on the right shows the exact text the assistant received after each turn. Each message is handled on its own; this demo keeps no history between turns, so the placeholders start again from one every time.

How it works

Redact, generate, restore.

01

Redact

Before your message goes anywhere, a small on-device model finds the names, email addresses, and other identifiers it recognizes and swaps each one for a placeholder like [GIVEN_NAME_1.a3f9]. The real values never enter the prompt.

02

Generate

The assistant works on the redacted text only. With WebGPU available, Qwen2.5-0.5B-Instruct runs locally in your browser, a deliberately tiny model here to show the round-trip rather than to be a polished assistant. Without it, a scripted template writes the reply. Redaction runs the same either way.

03

Restore

Placeholders in the reply are swapped back to the original values on your device. You read a normal answer. The model only ever handled the placeholders.

The fine print

What on-device means here.

One download, then offline

On first visit the page downloads two models from Hugging Face: the redaction model and, where WebGPU is available, the LLM. That is the only network request the demo makes. After it completes, redaction, generation, and restoration all run in your browser.

Nothing you type is sent

There is no server behind this chat. Your message, the detected identifiers, and the mapping between real values and placeholders stay in the page. Close the tab and they are gone.

You can check

The evidence card beside the phone shows the exact redacted text the assistant received after every turn, and the values that were detected and kept off the wire. You can also confirm in your browser's network inspector that no request follows the model download.

Part rules, part model

Emails, phone numbers, and IDs are matched by exact rules and do not slip. Names and addresses come from an on-device model that catches the large majority but can miss unusual phrasing. Either way, the card beside the chat shows the exact text the model received, so you can see what it caught and what it did not.

About the phone frame

The iPhone shell is a visual cue that this approach is designed for native, on-device use. This page is a web demo; it does not run as a native iOS app.

For developers

Add it to your app.

curtain-privacy is an open-source library, MIT licensed, that runs the same redaction in the browser, in Node, and on iOS and Android. Install it from the repo, point it at the published model, and wrap your model calls.

bun add github:hackshare/curtain-privacy "@huggingface/transformers@^3.7.5"
import { createGuard } from "curtain-privacy";

const guard = await createGuard({
  model: "hackshare/curtain-privacy",
  revision: "v1.0.0",
});

const { text } = await guard.protect(userInput); // redact before the model
const reply = await yourModel(text);
const restored = guard.reveal(reply);            // put the real values back