Standard
Regex floor, zero model
must-mask F1 · instant · none
Privacy-first AI infrastructure.
A privacy tool is only as good as the data it misses. So we scored the engine against 1,800 labelled spans across nine languages, using the exact models the apps ship, and published the leak, including the part that still gets past us.
Comparecen ⟦PERSON_1⟧, mayor de edad, con NIF ⟦NIF_1⟧, y ⟦PERSON_2⟧, para formalizar la transmisión del inmueble sito en ⟦ADDRESS_1⟧. El pago se domicilia en la cuenta ⟦IBAN_1⟧ a nombre de M. Arregui, por importe de 200.000 €.
Everything under a bar is restored only on your machine. The one span left exposed is a miss. At the Maximum tier, about one must-mask span in 1,500 slips past. That number is the point of this page.
Every figure is the must-mask F1 and residual leak, averaged across all nine languages. Must-mask F1 scores only the data the policy is meant to hide. Organisations and places it deliberately keeps are left out, so the number reflects the privacy job and nothing else.
Regex floor, zero model
must-mask F1 · instant · none
Regex + on-device NER
must-mask F1 · ~140 ms per document · bundled, offline
Regex + GLiNER on documents, Privacy Filter on source files
must-mask F1 · ~350 ms per document · ~2.9 GB local models
Standard is the free regex floor: instant and exact where it fires, but blind to the names and places only context reveals. High is the default the apps ship with. Maximum adds the full model for the lowest leak we measured.
The residual leak is always in the fuzzy, contextual types, like a name the model scored just under threshold. The structured identifiers never leak: they are matched deterministically from their published checksums. Across the whole gold set these scored 100% precision and 100% recall:
Maximum tier (regex + full NER). Leak = share of must-mask spans missed; lower is safer.
The table above is measured on nine languages we build country packs for, in the document shapes those packs target. That is the number that applies if your documents look like the ones Velum was tuned for, and it is the one the app is held to. It is not the whole picture, so we also score 900 contracts and statements in 6 languages from gretelai/synthetic_pii_finance_multilingual, published under Apache-2.0, which nobody here had a hand in. Unfamiliar formats are harder, and the tiers separate sharply:
Which number applies to you depends on your documents, and we cannot tell from here. If they resemble the corpora our country packs target, expect the first table. If they are formats nobody has tuned for, expect closer to the second. The licence is permissive and the build script ships in the repository, so both are yours to reproduce.
Any tool can reach high recall by redacting everything that looks like a date, a place or a link. What comes back is a document the model can no longer reason about, and you paid for the privacy with the answer. Velum draws the line at what actually identifies a person: a date of birth is masked, an ordinary date is left in place; a link carrying a credential is masked, a link to a public page is left in place.
The gold set carries 83 ordinary dates and 83 plain links that are deliberately left unlabelled, so a tier that masks them loses precision rather than passing unnoticed. This is how each tier scores against them:
Every tier leaves every one of them in place, and getting there took a correction. The span model at Maximum carries its own date-of-birth label, and on its own that label is not selective enough to tell a birth date from an invoice date: it took 27 of these 83 dates. It is now held to the same test the regex floor uses, and a date with no birth word beside it is recorded as an ordinary date rather than masked. The span is still found and still typed, so a policy that asks for every date still gets every date.
Separately from the tiers, Velum keeps locations, organisations, job titles, nationalities, ages, ordinary dates and plain links in plaintext by default. They are weak identifiers on their own and strong context for the model. If your documents need them gone, the policy is one setting away, and linkage escalation masks them automatically as soon as a direct identifier appears alongside them in the same document.
The gold data is seeded and version-controlled, the models are pinned by hash, and the run is one command. If you are evaluating Velum and want to grade it yourself, ask us for the gold set and we will send it.
Both are fetched from public HuggingFace repositories and verified against these hashes; the run uses the exact files the apps ship.
pnpm --filter @velumprivacy/core bench:leak --chains regex,regex+lite,regex+full,regex+pfThe two pinned models are fetched, then the engine’s own bench harness scores them against the gold set. The engine makes no network calls at runtime. A static scan and a runtime network-block test enforce that in the build.
Tell us what you work with and we will walk you through it on a call, on your own files. Nothing leaves your machine while we do.
Your address is used to reply to you, and for nothing else.