Skip to main content

Japanese-first PII scanner for source repositories with gitleaks/trufflehog-like UX

Project description

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).

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.

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pleno_pii_scanner-0.1.1.tar.gz (22.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pleno_pii_scanner-0.1.1-py3-none-any.whl (24.1 kB view details)

Uploaded Python 3

File details

Details for the file pleno_pii_scanner-0.1.1.tar.gz.

File metadata

  • Download URL: pleno_pii_scanner-0.1.1.tar.gz
  • Upload date:
  • Size: 22.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pleno_pii_scanner-0.1.1.tar.gz
Algorithm Hash digest
SHA256 6bf4b38e8443641e82d5189c0b56bd7a81f8e086ea09c9fa1967727c807880ce
MD5 176379e901b3a652ca8704bc01bb8075
BLAKE2b-256 70e9f9143ad43a46e2fbf10913351f8c0c75216e189df65f405914cdab9d6799

See more details on using hashes here.

Provenance

The following attestation bundles were made for pleno_pii_scanner-0.1.1.tar.gz:

Publisher: release-pypi.yml on plenoai/pleno-anonymize

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pleno_pii_scanner-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for pleno_pii_scanner-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 aa40f586870733afcfe71cb5e1b8afdb6ece1457b82b5d09ba19d1f8366ca351
MD5 1c378e1e01b554494263bd9c77de3855
BLAKE2b-256 d779270f40e47d033956d0ecf3d7b360f7491fa6897b8a24ec21a8e69f20f346

See more details on using hashes here.

Provenance

The following attestation bundles were made for pleno_pii_scanner-0.1.1-py3-none-any.whl:

Publisher: release-pypi.yml on plenoai/pleno-anonymize

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page