Stdlib-first · MIT · Python 3.10+

Remove what shouldn't
be hiding in your files.

A provenance-hygiene tool with a hard line drawn in code, not just marketing: what it removes reliably and verifiably, versus what it can only ever attempt, best-effort, never certified.

$ pip install -e ".[dev]"
$ claude-watermark-remover clean-file photo.png -o clean.png
Read this first

Three different things, three different guarantees.

The name is broad on purpose — so the README, and this page, exist to scope it accurately before anything else. "Watermark removal" means three unrelated things here.

01

Statistical text watermark

The word-choice pattern is keyed by the vendor. Detecting or certifying its removal from outside the vendor is cryptographically impossible, not just unimplemented. Module 2 offers a best-effort, quality-costing disruption — never a guarantee.

best-effort · unprovable
02

C2PA file provenance

Signed metadata on images, PDFs and SVGs — not a hidden watermark, per Anthropic's own documentation. Detected by real JUMBF box structure, not text matching, and removed deterministically for PNG, JPEG, WebP, and most PDF embeddings.

reliable · verifiable
03

Invisible marks & metadata

Zero-width characters, bidi-override tricks, tag-character steganography, and stray EXIF/XMP/doc-properties left behind by AI tooling generally — deterministic, byte-diff tested, no cryptographic barrier involved.

reliable · verifiable
ChannelReliableBest-effort
Invisible Unicode / bidi / tag-character carriersLayer A, unit-tested
C2PA manifest — PNG / JPEG / WebPStructural JUMBF/UUID validation
C2PA manifest — PDF (non-attachment)exiftool + qpdf structural rewrite
C2PA manifest — PDF file attachmentDetection onlyRemoval out of scope (needs a full PDF library)
File metadata — PDF/PNG/JPEG/WebP/DOCX/SVG/HTML/MDYes
Claude's statistical text watermarkCryptographically impossibleModule 2, disrupts, never certifies
Supported formats

Every cleaner is fixture-first, byte-diff tested.

No format was shipped until a real, structurally valid marked sample proved the marker's bytes are actually gone from the output — not just that the tool exited 0.

PDF
exiftool + qpdf
PNG
stdlib chunks
JPEG
stdlib segments
WebP
stdlib RIFF
DOCX
docProps edits
SVG
byte-span removal
HTML
meta / JSON-LD
Markdown
frontmatter keys
Quickstart

Inspect before you clean. Always.

Every finding is classified confirmed / probable / informational — only confirmed is removed by default, so the false-positive rate stays measurable instead of asserted.

# install $ python3 -m venv .venv && .venv/bin/pip install -e ".[dev]" # text: invisible Unicode carriers $ claude-watermark-remover inspect draft.md $ claude-watermark-remover clean draft.md -o draft.cleaned.md # files: C2PA / EXIF / XMP / doc-properties $ claude-watermark-remover inspect-file photo.png $ claude-watermark-remover clean-file doc.pdf -o doc.cleaned.pdf --stats # best-effort statistical-watermark disruption (Module 2) $ claude-watermark-remover rewrite draft.md --backend ollama --model llama3.2

The honest limit

Without the vendor's signing key, no tool — this one included — can detect or certify removal of a keyed statistical watermark. That's a cryptographic property of the scheme, not an engineering gap. Anyone selling "guaranteed" or "detector-proof" text-watermark removal is selling something that cannot exist.