10.7k stars · MIT · 2.2.364 on PyPI (2026-07-22); GitHub release 2.2.362 (2026-03-18)
Detects and masks names, emails, phone and card numbers in text before anything is sent to a model.
▶Repo detailsthe review · specs · pros & cons · install
What it is
Microsoft's open framework for finding and removing personal data in text: names, emails, phone numbers, card numbers, national identifiers and more, through a mix of pattern matching, checksums, context words and NLP models. It can redact, mask, hash or replace what it finds, and you can add your own recognisers.
Why it matters
Think about who actually has a four-hundred-message thread worth mapping. It is somebody working: a consultant with a client discussion, a manager with a project channel, a researcher with interview notes. Every one of them hesitates at the same moment, and the hesitation is not about your features — it is "what happens to this text?" Grasppy already has the strong answer, because Docling and BERTopic run locally on your own box. Presidio lets you go one step further and say something specific: names, emails and numbers are detected and masked before any text is sent to a model for labelling. That is a sentence on your landing page, a paragraph in your docs, and a genuine feature — and it separates you from every competitor whose pipeline is a thin wrapper around somebody else's API. It is also the honest engineering position: if you are going to send chunks to an LLM to name topics, you should know what is in them. Do not oversell it in your copy — call it a reduction of risk, not a guarantee, because that is what it is.
- MIT, from Microsoft, actively released, and squarely aimed at the exact step your ingest pipeline performs
- Turns a vague trust claim into a demonstrable behaviour — the best kind of marketing, because it is true and checkable
- Extensible with your own recognisers, so a client code or an internal project name can be masked as easily as an email address
- Detection is statistical, never complete. It will miss things and it will flag things that are not personal data — promising more than "significantly reduced" would be dishonest and eventually costly
- The good detection needs an NLP model (spaCy or a transformer) loaded in memory, which is a real cost on a small VPS. Start with the light spaCy model and measure it with beszel
- Russian coverage is much thinner than English. Test on real Russian text before you make any claim that covers both languages
source venv/bin/activate pip install presidio-analyzer presidio-anonymizer python -m spacy download en_core_web_lg