DEV Community

Breno Alvim
Breno Alvim

Posted on

no-watermark: your text may already carry an invisible mark, here's how to check

Anthropic confirmed it this month: Claude now embeds an imperceptible watermark into the text it generates. Quoting their own help center article, "you won't see it, and it doesn't change the meaning, quality, or readability." It travels with the text through copy-paste, and it covers the Claude app, Claude Code, Claude Cowork, Claude Tag, the API, and the AWS/Google Cloud/Microsoft Foundry integrations, worldwide. Files get signed C2PA provenance metadata on top of that. The trigger is Anthropic signing Article 50(2) of the EU AI Act, the Code of Practice on Transparency of AI-Generated Content. Models shipped from August 2, 2026 onward carry the mark from day one, and older models are getting it retrofitted.

This isn't unique to Claude. Invisible-character watermarking has been circulating in AI-generated text for a while: zero-width space/joiner, variation selectors, tag-block encoding, bidi controls, anomalous non-ASCII spaces, alternate line-break characters. None of it shows up on screen. All of it survives a copy-paste into your document, your PR description, your customer email.

I built no-watermark to inspect and strip that layer through deterministic character normalization, not a model guessing at patterns.

What it strips

  • Format characters: zero-width space/joiner/non-joiner, word joiner, BOM, bidi controls
  • Variation selectors (U+FE00-FE0F, U+E0100-E01EF)
  • Tag block characters (U+E0000-E007F)
  • Anomalous spaces: all 16 non-ASCII Unicode "Zs" space characters, normalized to a regular space
  • Line separator variants: NEL, LINE SEPARATOR, PARAGRAPH SEPARATOR, converted to newlines
  • Soft hyphens, Mongolian vowel separator, combining grapheme joiner

On top of the invisible-character layer, it also targets stylistic AI-writing tells that trip detectors: overused em dashes, formulaic structure.

Safety guards

Zero-width joiners are also how legitimate emoji sequences work (family, couple, flag combos), and ZWNJ has real linguistic use in Indic scripts. Both are preserved by default. Pass --no-emoji-guard if you want unconditional removal instead.

What it doesn't do

Anthropic's own writeup admits their mark isn't proof of authorship, just a signal content "may have been processed by Claude," and it breaks under heavy editing, paraphrasing, translation. My tool has a similar boundary: statistical token-distribution watermarking (Kirchenbauer-style green/red list methods) is out of scope. That kind of mark isn't a set of extra characters, it's a bias in which tokens got picked during generation, so removing it requires paraphrasing, not character stripping.

Usage

pip install -e .

nowatermark detect suspicious.txt
nowatermark clean suspicious.txt -o clean.txt --report
echo "text" | nowatermark clean -
Enter fullscreen mode Exit fullscreen mode

Python, tested with pytest, MIT licensed. Ships with a Claude Code skill, so you can run detection straight from a conversation and see what's embedded in the text you're working with.

It's early and functional, and the invisible-marking landscape just got a lot more mainstream. Repo's at https://github.com/obrenoalvim/no-watermark. Issues and PRs welcome. Have you checked what's hiding in text you've copied from an AI tool recently?

Top comments (0)