Your name is none of the model's business.

curtain-privacy removes names, email addresses, and other identifiers from a chat message before any model sees it, 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.

How it works

Redact, generate, restore.

01

Redact

Before your message goes anywhere, a small on-device model finds names, email addresses, and other identifiers 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. 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.

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