Privacy Mask
Detect and mask sensitive information in images locally before they leave your machine.
Prerequisites
This skill requires the privacy-mask CLI to be pre-installed on the system.
If it is not available, inform the user that they need to install it first:
- Install via pip:
pip install privacy-mask
- Ensure Tesseract OCR is installed:
brew install tesseract (macOS) or apt install tesseract-ocr (Linux)
- Set up the Claude Code hook:
privacy-mask install
- Verify:
privacy-mask --version
After install, all images are automatically masked before upload. No further action needed.
When to use
- User sends a screenshot or image file (
.png, .jpg, .jpeg, .bmp, .tiff) that may contain private data
- User mentions privacy, masking, 脱敏, or 打码
- You need to analyze an image but want to redact sensitive info first
- IF the user shares a screenshot for debugging, THEN run
privacy-mask mask <path> --dry-run first to check for PII
Manual usage
Mask an image:
privacy-mask mask /path/to/screenshot.png
privacy-mask mask /path/to/screenshot.png --in-place
privacy-mask mask /path/to/screenshot.png --dry-run # detect only
privacy-mask mask /path/to/screenshot.png --detection-engine regex # regex only, skip NER
Output is JSON:
{
"status": "success",
"detections": [{"label": "PHONE_CN", "text": "***", "bbox": [10, 20, 100, 30]}],
"summary": "Masked 1 regions: 1 PHONE_CN"
}
What it detects
- IDs: Chinese ID card, passport, HK/TW ID, US SSN, UK NINO, Canadian SIN, Indian Aadhaar/PAN, Korean RRN, Singapore NRIC, Malaysian IC
- Phone: Chinese mobile/landline, US phone, international (+prefix)
- Financial: Bank card, Amex, IBAN, SWIFT/BIC
- Developer keys: AWS, GitHub, Slack, Google, Stripe tokens, JWT, connection strings, API keys, SSH/PEM keys
- Crypto: Bitcoin, Ethereum wallet addresses
- Other: Email, birthday, IP/IPv6, MAC, UUID, license plate, MRZ, URL auth tokens
- NER (optional): Person names, street addresses, organizations, dates of birth, medical conditions
Constraints
- Do NOT send unmasked images to any external API or cloud service
- Do NOT skip masking when detections are found
- Do NOT modify the original image unless
--in-place is explicitly requested
Important
- All processing is local and offline — no data leaves the machine
- The hook intercepts images before upload to cloud API
- Configure rules in the bundled
config.json or pass --config for custom rules
1---2name: privacy-mask-23description: Mask, redact and anonymize sensitive information (PII) in screenshots and images — phone numbers, emails, IDs, API keys, crypto wallets, credit cards, passwords, and more. 100% local, 100% offline. Uses OCR with 47 regex rules and optional NER. Use when receiving screenshots that may contain private data, or when the user mentions privacy/masking/脱敏/打码.4license: MIT5---67# Privacy Mask89Detect and mask sensitive information in images locally before they leave your machine.1011## Prerequisites1213This skill requires the `privacy-mask` CLI to be pre-installed on the system.14If it is not available, inform the user that they need to install it first:15161. Install via pip: `pip install privacy-mask`172. Ensure Tesseract OCR is installed: `brew install tesseract` (macOS) or `apt install tesseract-ocr` (Linux)183. Set up the Claude Code hook: `privacy-mask install`194. Verify: `privacy-mask --version`2021After install, all images are automatically masked before upload. No further action needed.2223## When to use2425- User sends a screenshot or image file (`.png`, `.jpg`, `.jpeg`, `.bmp`, `.tiff`) that may contain private data26- User mentions privacy, masking, 脱敏, or 打码27- You need to analyze an image but want to redact sensitive info first28- IF the user shares a screenshot for debugging, THEN run `privacy-mask mask <path> --dry-run` first to check for PII2930## Manual usage3132Mask an image:33```bash34privacy-mask mask /path/to/screenshot.png35privacy-mask mask /path/to/screenshot.png --in-place36privacy-mask mask /path/to/screenshot.png --dry-run # detect only37privacy-mask mask /path/to/screenshot.png --detection-engine regex # regex only, skip NER38```3940Output is JSON:41```json42{43 "status": "success",44 "detections": [{"label": "PHONE_CN", "text": "***", "bbox": [10, 20, 100, 30]}],45 "summary": "Masked 1 regions: 1 PHONE_CN"46}47```4849## What it detects5051- **IDs**: Chinese ID card, passport, HK/TW ID, US SSN, UK NINO, Canadian SIN, Indian Aadhaar/PAN, Korean RRN, Singapore NRIC, Malaysian IC52- **Phone**: Chinese mobile/landline, US phone, international (+prefix)53- **Financial**: Bank card, Amex, IBAN, SWIFT/BIC54- **Developer keys**: AWS, GitHub, Slack, Google, Stripe tokens, JWT, connection strings, API keys, SSH/PEM keys55- **Crypto**: Bitcoin, Ethereum wallet addresses56- **Other**: Email, birthday, IP/IPv6, MAC, UUID, license plate, MRZ, URL auth tokens57- **NER** (optional): Person names, street addresses, organizations, dates of birth, medical conditions5859## Constraints6061- Do NOT send unmasked images to any external API or cloud service62- Do NOT skip masking when detections are found63- Do NOT modify the original image unless `--in-place` is explicitly requested6465## Important6667- All processing is **local and offline** — no data leaves the machine68- The hook intercepts images **before** upload to cloud API69- Configure rules in the bundled `config.json` or pass `--config` for custom rules