{"id":47606738,"url":"https://github.com/taoq-ai/wuming","last_synced_at":"2026-04-01T19:30:33.366Z","repository":{"id":345563449,"uuid":"1186400345","full_name":"taoq-ai/wuming","owner":"taoq-ai","description":"无名 (The Nameless) is a zero-config PII detection and redaction library for Go. 75+ detectors across 14 locales with compliance presets for GDPR, HIPAA, LGPD, APPI, PIPL, and more.","archived":false,"fork":false,"pushed_at":"2026-03-20T08:39:27.000Z","size":243,"stargazers_count":1,"open_issues_count":13,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-20T08:42:20.123Z","etag":null,"topics":["anonymization","compliance","data-privacy","data-protection","gdpr","go","golang","hexagonal-architecture","hipaa","open-source","personally-identifiable-information","pii","pii-detection","pii-redaction","privacy","regex","security","sensitive-data"],"latest_commit_sha":null,"homepage":"https://taoq-ai.github.io/wuming/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/taoq-ai.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-19T15:30:09.000Z","updated_at":"2026-03-20T08:39:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/taoq-ai/wuming","commit_stats":null,"previous_names":["taoq-ai/wuming"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/taoq-ai/wuming","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoq-ai%2Fwuming","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoq-ai%2Fwuming/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoq-ai%2Fwuming/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoq-ai%2Fwuming/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/taoq-ai","download_url":"https://codeload.github.com/taoq-ai/wuming/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taoq-ai%2Fwuming/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291143,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anonymization","compliance","data-privacy","data-protection","gdpr","go","golang","hexagonal-architecture","hipaa","open-source","personally-identifiable-information","pii","pii-detection","pii-redaction","privacy","regex","security","sensitive-data"],"created_at":"2026-04-01T19:30:32.542Z","updated_at":"2026-04-01T19:30:33.357Z","avatar_url":"https://github.com/taoq-ai.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 无名 wuming\n\n\u003e **The Nameless** — A Go library for detecting and removing PII from text\n\n*\"The nameless (无名) is the origin of heaven and earth\"* — Tao Te Ching, Chapter 1\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/taoq-ai/wuming.svg)](https://pkg.go.dev/github.com/taoq-ai/wuming)\n[![Go Report Card](https://goreportcard.com/badge/github.com/taoq-ai/wuming)](https://goreportcard.com/report/github.com/taoq-ai/wuming)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![CI](https://github.com/taoq-ai/wuming/actions/workflows/ci.yml/badge.svg)](https://github.com/taoq-ai/wuming/actions/workflows/ci.yml)\n[![Coverage](https://img.shields.io/badge/coverage-TBD-yellowgreen)](https://github.com/taoq-ai/wuming)\n\n---\n\n## Features\n\n- **Zero-config detection** — a single function call catches all PII globally, no setup required\n- **Global coverage** — 14 locales, 75+ detectors spanning every major region (Americas, Europe, Asia-Pacific)\n- **11 compliance presets** — preconfigured profiles for GDPR, AI Act, HIPAA, PCI-DSS, LGPD, APPI, PIPL, PIPA, DPDP, PIPEDA, and Privacy Act\n- **Locale-aware registry** — filter detectors with `WithLocale()` so only relevant patterns run\n- **Hexagonal architecture** — clean separation between domain logic, ports, and adapters\n- **Pluggable replacers** — redact, mask, hash, or bring your own replacement strategy\n- **Concurrent detection** — run multiple detectors in parallel with configurable concurrency\n- **Confidence scoring** — every match includes a confidence score; filter by threshold\n- **Zero dependencies** — pure Go standard library, no external modules\n\n## Quick Start\n\n### Zero-Config (catches everything)\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"log\"\n\n    \"github.com/taoq-ai/wuming\"\n)\n\nfunc main() {\n    ctx := context.Background()\n\n    // Zero config — one line, catches everything.\n    redacted, err := wuming.Redact(ctx, \"SSN 123-45-6789, email john@acme.com\")\n    if err != nil {\n        log.Fatal(err)\n    }\n    fmt.Println(redacted)\n    // Output: SSN [NATIONAL_ID], email [EMAIL]\n}\n```\n\n### Compliance Preset\n\n```go\n// Configure for GDPR compliance — only EU/EEA locales and PII types.\nw := wuming.New(wuming.WithPreset(\"gdpr\"))\nresult, err := w.Process(ctx, \"Steuer-ID 12345678911, email jan@example.de\")\n```\n\n### Locale-Specific\n\n```go\n// Only Dutch + common detectors.\nw := wuming.New(wuming.WithLocale(\"nl\"))\nresult, err := w.Process(ctx, \"BSN 123456782, call 06-12345678\")\n```\n\n## Installation\n\n```sh\ngo get github.com/taoq-ai/wuming\n```\n\nRequires **Go 1.22** or later.\n\n## Supported Locales\n\n| Locale   | Package                          | Key Patterns                                              |\n|----------|----------------------------------|-----------------------------------------------------------|\n| common   | `adapter/detector/common`        | Email, Credit Card, IBAN, IP Address, URL, MAC Address    |\n| us       | `adapter/detector/us`            | SSN, ITIN, EIN, Phone, ZIP, Passport, Medicare            |\n| nl       | `adapter/detector/nl`            | BSN, Phone, Postal Code, KvK Number, ID Document          |\n| eu       | `adapter/detector/eu`            | VAT Number, Passport MRZ                                  |\n| gb       | `adapter/detector/gb`            | NIN, NHS Number, UTR, Phone, Postcode                     |\n| de       | `adapter/detector/de`            | Steuer-ID, Sozialversicherungsnummer, Phone, PLZ, ID Card |\n| fr       | `adapter/detector/fr`            | NIR, NIF, Phone, Postal Code, ID Card                     |\n| br       | `adapter/detector/br`            | CPF, CNPJ, Phone, CEP, PIS/PASEP, CNH                    |\n| jp       | `adapter/detector/jp`            | My Number, Corporate Number, Phone, Postal Code, Passport |\n| in       | `adapter/detector/in`            | Aadhaar, PAN, Phone, PIN Code, Passport, GSTIN            |\n| cn       | `adapter/detector/cn`            | Resident ID, Phone, Postal Code, Passport, USCC           |\n| kr       | `adapter/detector/kr`            | RRN, Phone, Postal Code, Passport                         |\n| au       | `adapter/detector/au`            | TFN, Medicare, ABN, Phone, Postcode                       |\n| ca       | `adapter/detector/ca`            | SIN, Phone, Postal Code, Passport                         |\n\n## Compliance Presets\n\nPresets bundle the right locales and PII types for a specific regulation. Use them to get compliant detection without manual configuration.\n\n| Preset        | Regulation                                               | Locales                        |\n|---------------|----------------------------------------------------------|--------------------------------|\n| `gdpr`        | EU General Data Protection Regulation                    | common, eu, nl, de, fr, gb     |\n| `ai-act`      | EU AI Act (Articles 10, 15)                              | all 14 locales                 |\n| `hipaa`       | US Health Insurance Portability and Accountability Act   | common, us                     |\n| `pci-dss`     | Payment Card Industry Data Security Standard             | common                         |\n| `lgpd`        | Brazil Lei Geral de Protecao de Dados                    | common, br                     |\n| `appi`        | Japan Act on the Protection of Personal Information      | common, jp                     |\n| `pipl`        | China Personal Information Protection Law                | common, cn                     |\n| `pipa`        | South Korea Personal Information Protection Act          | common, kr                     |\n| `dpdp`        | India Digital Personal Data Protection Act               | common, in                     |\n| `pipeda`      | Canada Personal Information Protection and Electronic Documents Act | common, ca          |\n| `privacy-act` | Australia Privacy Act                                    | common, au                     |\n\n```go\nw := wuming.New(wuming.WithPreset(\"gdpr\"))\nresult, err := w.Process(ctx, text)\n```\n\n## Replacer Strategies\n\n| Strategy | Type                    | Description                                        | Example Output          |\n|----------|-------------------------|----------------------------------------------------|-------------------------|\n| Redact   | `replacer.NewRedact()`  | Replace with type placeholder                      | `[EMAIL]`               |\n| Mask     | `replacer.NewMask()`    | Mask characters, preserve last N                   | `****5678`              |\n| Hash     | `replacer.NewHash()`    | Deterministic SHA-256 hash (truncated)             | `a1b2c3d4e5f67890`     |\n| Custom   | `replacer.NewCustom(…)` | User-defined replacement function                  | *(anything you want)*   |\n\n```go\n// Use a mask replacer instead of the default redact\nw := wuming.New(\n    wuming.WithDetectors(common.NewEmailDetector()),\n    wuming.WithReplacer(replacer.NewMask()),\n)\n```\n\n## Architecture\n\nWuming follows a hexagonal (ports \u0026 adapters) architecture:\n\n```\n┌─────────────────────────────────────┐\n│         Public API (wuming.go)      │\n├─────────────────────────────────────┤\n│         Internal Engine             │\n├──────────┬──────────────────────────┤\n│  Ports   │  domain/port/            │\n│          │  - Detector interface    │\n│          │  - Replacer interface    │\n│          │  - Pipeline interface    │\n├──────────┼──────────────────────────┤\n│  Domain  │  domain/model/           │\n│          │  - PIIType, Match        │\n│          │  - Severity              │\n├──────────┼──────────────────────────┤\n│ Adapters │  adapter/detector/{loc}  │\n│          │  adapter/replacer/       │\n│          │  adapter/preset/         │\n│          │  adapter/registry/       │\n└──────────┴──────────────────────────┘\n```\n\nThe public API delegates to an internal engine that orchestrates detectors (through the `port.Detector` interface) and replacers (through the `port.Replacer` interface). Each locale lives in its own adapter package, making it straightforward to add new locales without touching existing code.\n\nFor a deeper dive, see [ARCHITECTURE.md](ARCHITECTURE.md).\n\n## Contributing\n\nContributions are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, coding standards, and how to add new detectors.\n\n## Security\n\nFor responsible disclosure of security issues, see [SECURITY.md](SECURITY.md).\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaoq-ai%2Fwuming","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftaoq-ai%2Fwuming","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaoq-ai%2Fwuming/lists"}