--- title: promptshield sdk: static pinned: false license: mit short_description: Document anonymization that runs on your device --- # promptShield Document anonymization that never uploads your documents. We build an offline PII detection and redaction tool for contracts, financial statements and medical records. The desktop app runs a local engine; the web app runs the **entire pipeline in the browser** — PDF parsing, OCR, entity detection and redaction — so a document never leaves the device it was opened on. That constraint is why we publish here. Running detection client-side makes model size a product decision: every megabyte is a first-visit download, paid by the user before they have seen anything work. ## Models - **[bert-base-multilingual-cased-ner-hrl-latin](https://huggingface.co/promptshield/bert-base-multilingual-cased-ner-hrl-latin)** — Davlan's multilingual NER model with the vocabulary a Latin-script deployment can never tokenize removed. **178.5 MB → 139.6 MB with provably identical output**: 0 entity differences across 2,219 entities, max logit delta 0.0000000000. Not a distillation — no encoder weight is touched. ## The idea, if you only read one thing In `bert-base-multilingual-cased`, the 119,547-token embedding table is **~92 MB of the 178 MB file** — more than half the model. Most deployments ship a handful of the 104 languages it covers and download the rest anyway. Dropping the unreachable rows is exact, not approximate: the embedding is per-tensor quantized and read by a `Gather`, so surviving rows keep their values *and* their dequantization. Verified by comparing raw logits, not entity lists — those can agree by luck. 🔗 [promptshield.ca](https://promptshield.ca)