Legal/Medical Document De-identification Workbench (Container Edition)

Productivity

A self-hosted document de-identification workbench: paste in a medical record, a case file or a contract and it marks up personal data item by item — names, email addresses, phone numbers, dates — together with hits from the legal/medical vertical rules for medical record numbers, national ID numbers, health insurance card numbers, court case numbers and policy numbers; the output can be replaced with category labels, asterisk masking or hashes; detection and de-identification happen inside your own container. Derived from a frozen snapshot of an MIT-licensed open-source personal-data detection engine, with a quick-start and a common-errors guide in Traditional Chinese.

SubscriptionUS$49 per month
Last run2026-11-02
In practice
Readiness5 / 5
What you need
Few changes needed3 / 5

Who it is for

Self-hosted: detection and de-identification happen inside the buyer's own compose containers, and the workbench's only outbound connections are the two engine services on the same network.

How to start

$ sh scripts/quickstart/init-env.sh
$ docker compose up -d --wait

Browse the files

Files in the product repository at the pinned commit. A few house files are left out of the zip.

File overview917 paths
▸docs275
NOTICE
ahds_integration.md
analyzer/
anonymizer/
api-docs/
api.md
api/
assets/
build_release.md
community.md
…
▸e2e-tests19
README.md
common/
pytest.ini
requirements.txt
resources/
tests/
▸overrides1
main.html
▸presidio3
README.md
presidio/
pyproject.toml
▸presidio-analyzer378
.dockerignore
Dockerfile
Dockerfile.dev
Dockerfile.stanza
Dockerfile.transformers
Dockerfile.windows
Pipfile
README.md
app.py
deploytoazure.json
…
▸presidio-anonymizer81
.dockerignore
Dockerfile
Dockerfile.dev
Dockerfile.windows
README.md
app.py
deploytoazure.json
entrypoint.sh
logging.ini
presidio_anonymizer/
…
▸presidio-cli17
.presidiocli
Pipfile
README.md
presidio_cli/
pyproject.toml
tests/
uv.lock
▸presidio-image-redactor77
.dockerignore
Dockerfile
Dockerfile.dev
Evaluation_Approach.md
README.md
app.py
deploytoazure.json
entrypoint.sh
img.png
presidio_image_redactor/
…
▸presidio-structured18
README.md
logging.ini
presidio_structured/
pyproject.toml
tests/
uv.lock
▸quickstart4
workbench/
▸scripts2
quickstart/
zensical_build.py
▫ATTRIBUTION.md
▫CHANGELOG.md
▫CODE_OF_CONDUCT.md
▫CONTRIBUTING.md
▫LICENSE
▫LICENSE-99LL.md
▫NOTICE
▫PRODUCT.md
▫QUICKSTART.md
▫README.MD
▫SECURITY.md
▫SECURITY.upstream.md
▫SUPPORT.md
▫compose.yaml
▫delivery-manifest.txt
▫docker-compose.upstream.yml
▫mkdocs.yml
▫pyproject.toml
▫Config and hidden files 24

Latest passing run

Clone → Checkout → Toolchain → Build images → Deidentify document

Pre-purchase Disclosure

What you are buying

Paste document text into the web interface and the system marks up every piece of personal data it detects, then gives you a de-identified version — replaced with category labels, asterisk masking or hashes; the built-in rules also cover legal/medical identifiers such as medical record numbers, national ID numbers, health insurance card numbers, court case numbers and policy numbers.

A derivative build on top of an MIT-licensed open-source personal-data detection engine; the end-to-end API, the web interface, the vertical rule file and the Traditional Chinese documentation are ours. Delivery is a frozen snapshot: one zip file, taken from the product repository at revision c737083.

Known limitations

  • No TLS and no login; it listens on port 8080 over plain HTTP by default. Serving it publicly means bringing your own reverse proxy, certificate and authentication
  • Processed documents are not stored: there is no history and no audit trail, so keeping records means extending it yourself
  • The first start builds the images and downloads the NLP model, fetching from Docker Hub, apt, PyPI and the spaCy release location; it cannot be built offline
  • Pinned to the delivered snapshot; it does not follow upstream.

The liability cap, the scope of what is promised and the statutory floor are governed by the Terms of Service.

Vetting record

Everything below was checked against the pinned commit 760d6c8. Every verdict carries its full reasoning, an evidence link and the checker; failures are published, not hidden — do not take our word for it, verify it yourself.

6 PASS0 WARN0 FAIL

Source ReviewPASS

The delivered execution surface was reviewed item by item: every file we added was read line by line (the three compose services, workbench/app.py, recognizers.yaml, the web interface, init-env.sh) — the workbench's only outbound connections are the two engine services on the same compose network, with no external network calls and no keys; de-identified results are not stored (nothing written to disk, no database). The upstream Python source was not read file by file; the basis is its high adoption (originally a Microsoft project) and container isolation (the engines expose no port, only the workbench opens one). The ollama service bound into upstream's newer compose is not part of this product, which avoids an extra external fetch surface.

Evidence ↗Checked in 2026Checked by claude-code build-product session B
Script SafetyPASS

Every script that runs on the buyer's delivery path was inspected one by one: init-env.sh is ours (read line by line; it writes a single .env and does nothing over the network); the two engine images use upstream's own Dockerfiles (read line by line: apt installs curl, pip installs uv, then uv sync --locked installs from the lock file, and upstream's install_nlp_models.py downloads the NLP model — no curl|sh style download-and-run, and it runs as a non-root user); the workbench image is built from python:3.12-slim, with pip installing four version-pinned packages.

Evidence ↗Checked in 2026Checked by claude-code build-product session B
RecencyPASS

Upstream is pinned at 760d6c8 (see the evidence link); this product is a frozen snapshot and does not follow upstream.

Evidence ↗Checked in 2026Checked by claude-code build-product session B
LicensePASS

SPDX:LicenseRef-99LL-Product

Upstream's LICENSE was read word for word (the evidence URL points at the file itself at the pinned commit): the standard MIT text, Copyright (c) Presidio Contributors — commercial use, modification, derivative works, redistribution and sale are permitted, and the obligation is to keep the copyright notice and the full licence text; upstream also carries a NOTICE (third-party component declaration), which is likewise kept verbatim in the zip. This is not determined from GitHub's licence field. For the product as a whole, the 99LL product licence template is attached: upstream's LICENSE and NOTICE are kept verbatim, and LICENSE-99LL.md is added as the sale and liability terms for the part we built; spdx is recorded as LicenseRef-99LL-Product.

Evidence ↗Checked in 2026Checked by claude-code build-product session B
Dependency LicensesPASS

Third-party Python packages are not redistributed in the zip: upstream declares its dependencies in pyproject.toml / uv.lock, and the four packages in our workbench are installed at pinned versions in its Dockerfile — all of them fetched from PyPI when the buyer builds. The base images (python:3.12-slim / 3.14-slim) are pulled by the buyer from the registry. Upstream's NOTICE file lists the third-party components it includes and their licences, and is delivered verbatim in the zip.

Evidence ↗Checked in 2026Checked by claude-code build-product session B
Weights / Data LicensePASS

The NLP model licence was checked directly, not taken from documentation: the model's own meta.json was read inside an analyzer container that had actually been built — en_core_web_lg 3.8.0, whose license field reads MIT. The model is downloaded from the spaCy release location at build time and is not redistributed in the zip. If the buyer swaps in a model for another language, that model's licence is the buyer's own responsibility.

Evidence ↗Checked in 2026Checked by claude-code build-product session B
HEALTH VERIFIED

Last verified passing: 2026-11-02

Subscribe for everything
US$49/ monthwas US$99

A subscription unlocks the whole catalogue; you do not buy this one separately.See what is included

Sign in with Google first; if you are signed out you will be sent to the sign-in page. Your subscription is billed to that same email address.

Already subscribed? This downloads straight away. Otherwise you are sent to the pricing page, or to sign in first.