Text artifacts
Zero-Width Space Watermark: Real Technique, Wrong Mechanism
Encoding a hidden message in invisible characters is a genuine, decades-old steganography trick. It is not the mechanism behind any confirmed AI provider watermark, because SynthID Text and Claude's watermark both live in word choice rather than in characters. Strip every zero-width character from a passage and you destroy the first kind completely while leaving the second entirely untouched.
Key takeaways
- Zero-width steganography encodes bits as characters: a zero-width joiner (U+200D) standing in for one value, a zero-width non-joiner (U+200C) for the other, building a payload one bit at a time with nothing rendering on screen.
- It's fragile in a way real watermarks aren't. Delete the characters, or run the text through almost any cleaner, and the hidden message is gone completely.
- Deployed watermarks work the opposite way. SynthID Text runs as a logits processor during generation, and Anthropic says Claude weaves an imperceptible watermark directly into the text itself, so there's no character to find and delete in the first place.
- Zero-width characters show up in ordinary, non-adversarial text constantly through copy-paste, emoji rendering, and Arabic-script formatting, so finding one proves nothing about a document's origin.
- Commenters on r/singularity floated at least seven possible mechanisms for the Claude watermark, hidden Unicode among them. Anthropic's own support article names none of them.
Text watermark workflow
How text watermark removal is evaluated
Generate
Claude, Gemini, or another LLM produces text.
Mark
A watermarking layer can influence token choices or attach provenance.
Clean / transform
Text is normalized, edited, rewritten, or translated.
Check
A detector compares the before and after signal strength.
Why this matters for removal tools
Hidden-character cleanup is immediate. Statistical text watermark removal becomes stronger when paired with provider-specific detection and before/after confidence checks.
How a zero-width message actually works
ConfirmedYou'll get the real encoding scheme, in enough detail to see why it's both clever and brittle.
Pick a character with zero visual width. The zero-width joiner (U+200D) and zero-width non-joiner (U+200C) are the usual choices.
Then let one stand for a 1 and the other for a 0. Slot them between ordinary letters and you build a payload one bit at a time.
Nothing renders on screen. A program that knows the scheme reads the sequence straight back out.
This is general-purpose text steganography, and it long predates modern AI. Hiding information in imperceptible formatting is an old idea that happens to work unusually well in Unicode.
What the shipping systems do instead
ConfirmedHere's where Google's and Anthropic's real watermarks actually live, and it's nowhere near your invisible characters.
SynthID Text doesn't add anything to finished text. It runs as a logits processor during generation itself.
After ordinary Top-K and Top-P sampling narrows the field of candidate next tokens, it reshapes which of them the model is likely to pick. The signal ends up spread across dozens of word choices instead of sitting in any single character.
Anthropic describes Claude's watermark the same way in spirit. A supported model weaves "an imperceptible watermark directly into the text itself" while generating it, not as a separate character tacked on afterward.
Neither system touches zero-width Unicode at all. That's the whole reason stripping invisible characters and defeating a watermark are different activities.
Why the guessing keeps happening
Community discussionHere's the gap that zero-width theories grow in, plus the one adjacent claim that's really about a different trick.
When Claude's watermark rolled out, an r/singularity thread summarizing the announcement drew the same follow-up question over and over: how does a text watermark even work?
The theories commenters offered ran wide.
- hidden Unicode or invisible characters
- statistical word-choice patterns
- overrepresented n-grams
- first-letter or sentence-position patterns
- token-probability nudges
- something SynthID-like
- a hybrid of several signals at once
Anthropic's own support article names none of them. Real curiosity meeting an unpublished mechanism is exactly the soil zero-width theories grow in.
One adjacent claim is worth naming precisely because it describes a different technique. An independent blogger has written that Claude Code once used Unicode homoglyphs, characters that look identical to ordinary ones but carry different code points, inside date strings as an internal flag that was later discontinued.
That's homoglyph substitution, not zero-width steganography. It comes from a single source, and the follow-up article that might have corroborated it returned an error when checked.
So it stays interesting and unresolved, and it isn't evidence about zero-width spaces either way. Until a provider ties a specific character to a specific scheme in writing, an invisible character in copied AI text is evidence of ordinary text handling and nothing more.
Removing them, and what removal actually buys you
ConfirmedHere's what a cleaner does for you, plus the one rule that separates a good cleaner from a text mangler.
This site's text cleaner strips zero-width spaces, zero-width joiners and non-joiners, byte-order marks, and their relatives directly in your browser. Nothing is uploaded anywhere.
If a stray invisible character is breaking search-in-page, corrupting a paste into code, or tripping a duplicate-content check, that fixes it in seconds.
What none of this does is touch a real statistical watermark. If SynthID Text or Claude's watermark is present, it lives in which words were chosen, so cleaning invisible Unicode stays a hygiene job, not a removal one.
FAQ
Does removing zero-width characters count as removing an AI watermark?
No. It's useful text hygiene, fixing broken search indexing and copy-paste artifacts, but no major provider has documented zero-width characters as its watermarking mechanism. Google's SynthID Text and Anthropic's Claude watermark both work by shaping which words a model picks during generation, not by inserting an invisible character afterward.
How does zero-width steganography actually hide a message?
By treating the presence or absence of an invisible character as a binary digit. A common version inserts a zero-width joiner (U+200D) after certain letters to mean one bit and a zero-width non-joiner (U+200C) to mean the other, building a payload character by character with no glyph rendering on screen. It's a decades-old idea that predates modern AI entirely.
Has any AI provider ever used invisible Unicode characters as part of a real watermark?
None has documented doing so. Speculation on r/singularity floated hidden Unicode as one guess among several, alongside statistical word-choice patterns, overrepresented n-grams, and token-probability nudges, but Anthropic's own support article names none of them. One blogger has separately claimed Claude Code once used homoglyphs in date strings as a since-discontinued internal flag, which is uncorroborated and describes a different technique.
Is stripping zero-width characters good for anything besides watermark paranoia?
Yes. They can break search-in-page, mess up pastes into code or spreadsheets, and occasionally trip duplicate-content checks, so clearing them is reasonable hygiene independent of any watermarking question.
Next steps
- Paste a passage into the free in-browser cleaner to see which invisible characters it contains, with a count for each. Clean your text
- See why finding an invisible character in AI output identifies almost nothing about its source. Hidden Unicode, explained
- Read how statistical watermarking bends token probabilities during generation, which is the mechanism zero-width theories keep getting mistaken for. Statistical text watermarking
- Read Anthropic's own wording on what Claude embeds and what it doesn't. Anthropic's support article
Sources and citation status
- OfficialUnicode Consortium: General Punctuation code chart (U+2000 to U+206F, includes zero-width space, joiners, word joiner)
- OfficialGoogle AI Developers: SynthID Text
- OfficialAnthropic Help: how Claude marks AI-generated content
- CommunityReddit r/singularity: Claude now embeds invisible watermarks in all text outputs + signed metadata on files
- CommunityHacker News: SynthID discussion thread on detection and sample size