--- license: other license_name: desert-ant-labs-source-available-1.0 license_link: https://license.desertant.ai/1.0 language: - bg - hr - cs - da - nl - en - et - fi - fr - de - el - hu - ga - it - lv - lt - mt - pl - pt - ro - sk - sl - es - sv tags: - pii - redaction - token-classification - on-device - litert - tflite - core-ml - multilingual pipeline_tag: token-classification --- # redact: on-device multilingual PII redaction Detects and redacts personal data (names, addresses, emails, phone numbers, cards, IBANs, national IDs and more) in text across **all 24 official EU languages** (Latin, Greek and Cyrillic scripts). A BIOES token classifier plus a portable, dependency-free deterministic layer for structured IDs. The deployable model is **~11.6 MB** (4-bit Core ML on Apple) or **~24 MB** (int8 LiteRT `.tflite` on Android, Linux and the web). > `"Call Anna Kovács at anna@example.hu, IBAN GB29NWBK60161331926819"` → > `"Call [GIVEN_NAME] [SURNAME] at [EMAIL], IBAN [BANK_ACCOUNT]"` ## Try it All platforms ship from one repo: **[Desert-Ant-Labs/redact](https://github.com/Desert-Ant-Labs/redact)** (Swift, Kotlin, and JavaScript in a single codebase). - **Live demo:** [desert-ant-labs/redact-demo](https://huggingface.co/spaces/desert-ant-labs/redact-demo): paste text and watch PII get highlighted or masked, fully in your browser. - **iOS / macOS / tvOS / visionOS:** the Swift SDK (Swift Package Manager) with a built-in demo app. It bundles the compiled Core ML model below. - **Android / JVM (Kotlin):** Maven Central `ai.desertant:redact` — LiteRT (`.tflite`), with the model downloaded on demand or bundled via `ai.desertant:redact-tflite-resources`. - **Node / browser (JavaScript / TypeScript):** `npm i @desert-ant-labs/redact @litertjs/core` — a local WebAssembly pipeline with [LiteRT.js](https://www.npmjs.com/package/@litertjs/core) inference; fetches the model from this repo and caches it. ```swift import Redact let redact = Redact() let r = try await redact.redaction(of: "Email Anna Kovács at anna@example.hu.") r.redactedText // "Email [GIVEN_NAME_1] [SURNAME_1] at [EMAIL_1]." ``` ## Files | File | Format | Size | Contents | |---|---|---:|---| | `redact.tflite` | LiteRT / TFLite (int8) | ~24 MB | Dynamic-range int8, fixed `[1, 256]` window; runs on Android, Linux and the web (used by the Kotlin and JavaScript SDKs) | | `redact.mlmodelc` | Compiled Core ML (4-bit) | ~11.6 MB | Palettized model, ready to load on Apple platforms (used by the Swift SDK) | | `redact.pt` | PyTorch checkpoint | ~90 MB | Full-precision weights + config (for retraining / other runtimes) | | `config.json` | JSON | tiny | Transformer + label config | | `tokenizer.json`, `tokenizer_config.json` | JSON | ~2.3 MB | EU-trimmed (31,475-piece) SentencePiece tokenizer (XLM-R lineage) | | `redact_tokenizer.bin` | Binary | ~0.4 MB | Compact SentencePiece vocab bundled by the SDKs | | `labels.json` | JSON | tiny | BIOES `id2label` / `label2id` | | `redact_meta.json` | JSON | tiny | Public labels, deterministic-owner labels, recommended thresholds, base-model info | Older revisions (tags `v0.2.x`) additionally carry `redact.onnx` for SDK versions that predate the LiteRT migration. ## Taxonomy (20 public labels) `GIVEN_NAME`, `SURNAME`, `STREET_NAME`, `BUILDING_NUMBER`, `SECONDARY_ADDRESS`, `CITY`, `STATE`, `ZIP_CODE`, `EMAIL`, `PHONE`, `CREDIT_CARD`, `BANK_ACCOUNT`, `ROUTING_NUMBER`, `IP_ADDRESS`, `URL`, `GOVERNMENT_ID`, `PASSPORT`, `DRIVERS_LICENSE`, `TAX_ID`, `SSN`. The deterministic layer additionally emits `IMEI` (device identifier), a deterministic-only label outside the 20-label neural head. ## Architecture - **Encoder:** Multilingual-MiniLM (XLM-R lineage) truncated to 6 layers with an EU-script-trimmed vocab (~23 M params), fine-tuned for BIOES tagging. - **Deterministic layer:** a pure-stdlib post-processor owns high-confidence structured labels (email, URL, IP/MAC, card, IBAN/BIC, VIN, SSN, routing, tax id, government id, passport, driving licence, IMEI) with real validation (Luhn, ISO-13616 IBAN, ISO-7064, per-country checksums) and reconciles them with the model's contextual predictions. EU structured coverage includes **checksum-validated national IDs for all 24 EU countries, all 27 EU VAT numbers, IMEI, and per-country driving-licence numbers**. The same layer is ported byte-for-byte to the JS and Swift runtimes (span-for-span parity). - Recommended runtime: `min_score = 0.6`, `max_length = 256`, `stride = 64`. ## Benchmark On a fair, all-label, 24-language evaluation (external WikiANN + MultiNERD for names/places, plus a neutral format-valid structured-PII set): fair composite **leak-safe recall 88.8, typed F1 85.4, strict F1 71.0**, best among on-device models by a wide margin, with better labeling accuracy and precision than models 100×+ its size. ## License [Desert Ant Labs Source-Available License](https://license.desertant.ai/1.0). Free for most apps; a commercial license is required at scale. Full terms are at the link. Licensing: .