Skip to main content

pleno-pii-scanner

CLI that detects Japanese PII in repository contents, commit history, and staged hunks.

Setup

Run straight from PyPI — no clone, no uv sync:

uvx pleno-pii-scanner --help

The ja_ner_ja spaCy model is downloaded into the uvx-managed environment on first NER invocation. To pin a persistent install, use uv tool install pleno-pii-scanner instead. Workspace contributors get the model wheel preinstalled via uv sync (it lives in the dev dependency group).

Higher-precision HF backend (opt-in)

For DLP-grade workloads where false-positive <ORGANIZATION> masks are unacceptable, opt into the HuggingFace token-classification backend (model model/v0.13.0, 0xhikae/ja-ner-onnx@v0.13.0). It applies a per-label confidence floor (default ORGANIZATION=0.99) — overall F1 0.452 → 0.701 vs the spaCy baseline on the v0.12.0/ja adversarial corpus.

PLENO_PII_SCANNER_BACKEND=hf \
  uvx --with 'pleno-pii-scanner[hf]' pleno-pii-scanner dir <path>

Tunables:

  • PLENO_PII_SCANNER_THRESHOLDS=ORGANIZATION=0.99,PERSON=0.0 — per-label confidence floor (default ORG=0.99).
  • PLENO_PII_SCANNER_HF_MODEL / PLENO_PII_SCANNER_HF_REVISION — pin to a custom HF Hub repo / revision (default 0xhikae/ja-ner-onnx@v0.13.0).

The HF backend adds ~600 MB of torch + transformers; the default install stays lightweight.

Subcommands

uvx pleno-pii-scanner dir <path>                # walk a directory
uvx pleno-pii-scanner git <path>                # working tree plus commit history
uvx pleno-pii-scanner github <owner>/<repo>     # shallow clone, then scan
uvx pleno-pii-scanner github --org <org>        # enumerate org repos via gh CLI, then scan all
uvx pleno-pii-scanner baseline <path>           # write current findings as a suppression list
uvx pleno-pii-scanner protect                   # scan only staged hunks for pre-commit hooks

Local vs. offload

Default mode runs Presidio, spaCy NER, and regex on this machine. Pass --base-url to offload the same pipeline to a remote pleno-anonymize endpoint.

uvx pleno-pii-scanner dir ./my-repo --base-url https://pleno-anonymize.fly.dev
PLENO_BASE_URL=... uvx pleno-pii-scanner dir ./my-repo
uvx pleno-pii-scanner dir ./my-repo --base-url ... --api-key "$PLENO_API_KEY"

Both modes return the same entity set. Git history scans always use regex only, since per-line NER is not worth the cost on short diff lines.

Detected entities

NER from ja_ner_ja plus Presidio: PERSON ADDRESS ORGANIZATION DATE_OF_BIRTH BANK_ACCOUNT

Regex plus checksum: PHONE_NUMBER MY_NUMBER MY_NUMBER_CORPORATE CREDIT_CARD PASSPORT DRIVER_LICENSE HEALTH_INSURANCE RESIDENCE_CARD POSTAL_CODE EMAIL_ADDRESS IP_ADDRESS URL

URL, HEALTH_INSURANCE, and DRIVER_LICENSE are excluded from the default profile because they fire too often in source repos. Pass --entities ALL to include them, or --entities PHONE_NUMBER,EMAIL_ADDRESS to scan a specific subset.

Verification

Each finding carries one of three labels.

  • passed — checksum validated by Luhn, My Number, or corporate-number rules, or a contextual keyword sits within range.
  • failed — checksum failed; likely a false positive.
  • unverified — no validator matched and no contextual keyword was found.

--only-verified keeps passed only.

Output

--report-format Use case
human default colorized table on stdout
json machine-readable
sarif SARIF 2.1.0 for GitHub Code Scanning

--report-path FILE writes to a file. Exit code is 0 for no findings, 1 when findings are present, 2 for usage errors.

DB-cluster mode (recommended for repo audits)

Repository-level PII risk follows database shape, not single mentions. A contact email in a CODE_OF_CONDUCT is one identifiable person, not an exfiltration target; a CSV row with name + phone + email + my_number is.

--db-only keeps a finding only when its file or folder forms a cluster of co-occurring detections with multiple distinct values:

uvx pleno-pii-scanner dir ./my-repo --db-only
uvx pleno-pii-scanner github owner/repo --db-only

Tunables (defaults shown):

Flag Default Meaning
--db-file-threshold 2 Minimum findings in one file to qualify as a DB cluster.
--db-folder-threshold 3 Minimum findings in one folder (for sharded-DB shape).

verification=failed findings (e.g. ISBN matched as MY_NUMBER) are excluded from cluster computation so an awesome-list of book links can not promote a folder to DB-shaped. On the v0.2.4 ten-repo Japanese eval, this mode takes 6/10 repos from "findings to triage" to zero while keeping every real exposure (resumes, PII fixture banks, contributor lists).

Suppression

A .plenoignore file at the repo root is read automatically.

docs/samples/**          # path glob in gitignore syntax
PHONE_NUMBER             # entity-wide
finding:7a3b8c9d         # specific finding fingerprint

Inline directives:

SUPPORT_PHONE = "0120-123-456"  # pleno:ignore PHONE_NUMBER
EXAMPLE_EMAIL = "user@example.com"  # pleno:ignore

pleno-pii-scanner baseline writes a fingerprint list of current findings; passing --baseline FILE later suppresses those known findings.

Key flags

Flag Default Role
--entities default profile restrict detection set, PHONE,EMAIL or ALL
--language ja analysis language, ja or en
--base-url unset offload to a remote pleno-anonymize
--api-key unset Bearer token for offload
--concurrency 8 parallel HTTP requests in offload mode
--include / --exclude unset gitignore-style file filters
--max-file-size 1 MB files larger than this are skipped
--only-verified off keep passed findings only
--report-format human human, json, or sarif
--baseline unset fingerprint JSON of known findings to suppress

.gitignore, a built-in skip list for .git, node_modules, .venv, dist, build, vendor, and similar directories, and a NUL-byte binary check are all on by default.

Metadata

Release files for pleno-pii-scanner 0.3.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pleno-pii-scanner 0.3.2
File Size Uploaded
pleno_pii_scanner-0.3.2.tar.gz 275.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pleno-pii-scanner 0.3.2
File Interpreter ABI Platform
pleno_pii_scanner-0.3.2-py3-none-any.whl Python 3 none any Details

Total release size: 501.3 kB

Release files / pleno_pii_scanner-0.3.2.tar.gz

Download URL pleno_pii_scanner-0.3.2.tar.gz
Size 275.9 kB
Tags Source
SHA-256 checksum
How to use checksums
0be2e017255a51d8314de90918ec705dcf415853953b6e57bf883eb21492ccc3
BLAKE2b-256 checksum
How to use checksums
3c63f8cf795208b501aa05f627adcd7bea2f9efd9d108a9280e8a9b29575fd46
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 6, 2026.

Transparency log

Release files / pleno_pii_scanner-0.3.2-py3-none-any.whl

Download URL pleno_pii_scanner-0.3.2-py3-none-any.whl
Size 225.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3bde73e7f5f15df6f96410ca46c470f1153ee0897c847e165eaf3b029537b32e
BLAKE2b-256 checksum
How to use checksums
a4d0f9349f372d2250b6ab4edf891a99858e601eeef4c076a70ab058e8d78917
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 6, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.2 This release

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page