> source text
Drop in the text
Paste it or load a .txt, .docx or .pdf. Anonymous scans take up to 2,000 characters and the scan never leaves your browser.
TWO LAYERS, NOT ONE
Zero width spaces and lookalike letters are real characters you can find and delete. The Claude watermark isn't a character at all. Here's how to tell them apart.
Today
MacBook Pro
PASTED FROM CLAUDE
SCANNING
PASTED FROM CLAUDE
SCANNING
Short answer
THE CHARACTER LIST
These are the invisible and lookalike code points a scan looks for. None of them is the Claude watermark.
X-RAY A PARAGRAPH
Seven characters you cannot see in this text
The paragraph below holds real invisible and lookalike characters. Switch on x-ray, then tap one to inspect it.
As it looks on screen
Our cafe opens at 7 am. Order ahead in the app and skip the line. Pastries are baked fresh every morning, and the cold brew is made in smаll batches. Family packs 👨👩👧 feed four. Prices include tax and tip.
Copy the paragraph with x-ray off and the characters come with it. The emoji family is three emoji glued by two ZWJs.
Inspector
U+202F
NARROW NO-BREAK SPACE
NNBSP
UTF-8 bytes
ClaudeClean
Replaced with a space
| Code point | Unicode name | What it does | ClaudeClean |
|---|---|---|---|
| U+200B | ZERO WIDTH SPACEZWSP | Invisible word separation and line break control, with no width. | Deleted |
| U+200C | ZERO WIDTH NON-JOINERZWNJ | Stops two letters from joining. Needed in Persian and some Indic scripts. | Deleted, mind the script |
| U+200D | ZERO WIDTH JOINERZWJ | Joins characters. It glues emoji ZWJ sequences like family emoji together. | Deleted, can split emoji |
| U+200E, U+200F | LEFT-TO-RIGHT and RIGHT-TO-LEFT MARKLRM, RLM | Invisible direction hints for mixed Latin and Arabic or Hebrew text. | Deleted |
| U+2060 | WORD JOINERWJ | A zero width non-breaking space, the preferred way to say 'don't break here'. | Deleted |
| U+FEFF | ZERO WIDTH NO-BREAK SPACEBOM | A byte order mark at the start of a data stream. Mid-text, it's leftover junk. | Deleted |
| U+00AD | SOFT HYPHENSHY | An invisible marker for a possible hyphenation spot. | Deleted |
| U+00A0 | NO-BREAK SPACENBSP | Looks like a space, stops a line break between two words. | Replaced with a space |
| U+202F | NARROW NO-BREAK SPACENNBSP | A thin no-break space. Reported in some o3 and o4-mini answers in 2025. | Replaced with a space |
| U+2007 | FIGURE SPACE | A no-break space as wide as a digit, used to align numbers. | Replaced with a space |
| U+202A to U+202E, U+2066 to U+2069 | BIDI EMBEDDING, OVERRIDE AND ISOLATE CONTROLS | Change the order text is displayed in without changing the stored order. | Deleted |
| U+FE00 to U+FE0F | VARIATION SELECTORSVS1 to VS16 | Pick a glyph variant. VS16 asks for the emoji style of a symbol. | Deleted, can change emoji |
| U+0430, U+0435, U+043E, U+0440, U+0441 | CYRILLIC а, е, о, р, сHomoglyphs | Look identical to Latin a, e, o, p, c but are different letters. | Swapped to Latin inside Latin words |
U+200B
ZERO WIDTH SPACE ZWSP
Invisible word separation and line break control, with no width.
ClaudeClean: Deleted
U+200C
ZERO WIDTH NON-JOINER ZWNJ
Stops two letters from joining. Needed in Persian and some Indic scripts.
ClaudeClean: Deleted, mind the script
U+200D
ZERO WIDTH JOINER ZWJ
Joins characters. It glues emoji ZWJ sequences like family emoji together.
ClaudeClean: Deleted, can split emoji
U+200E, U+200F
LEFT-TO-RIGHT and RIGHT-TO-LEFT MARK LRM, RLM
Invisible direction hints for mixed Latin and Arabic or Hebrew text.
ClaudeClean: Deleted
U+2060
WORD JOINER WJ
A zero width non-breaking space, the preferred way to say 'don't break here'.
ClaudeClean: Deleted
U+FEFF
ZERO WIDTH NO-BREAK SPACE BOM
A byte order mark at the start of a data stream. Mid-text, it's leftover junk.
ClaudeClean: Deleted
U+00AD
SOFT HYPHEN SHY
An invisible marker for a possible hyphenation spot.
ClaudeClean: Deleted
U+00A0
NO-BREAK SPACE NBSP
Looks like a space, stops a line break between two words.
ClaudeClean: Replaced with a space
U+202F
NARROW NO-BREAK SPACE NNBSP
A thin no-break space. Reported in some o3 and o4-mini answers in 2025.
ClaudeClean: Replaced with a space
U+2007
FIGURE SPACE
A no-break space as wide as a digit, used to align numbers.
ClaudeClean: Replaced with a space
U+202A to U+202E, U+2066 to U+2069
BIDI EMBEDDING, OVERRIDE AND ISOLATE CONTROLS
Change the order text is displayed in without changing the stored order.
ClaudeClean: Deleted
U+FE00 to U+FE0F
VARIATION SELECTORS VS1 to VS16
Pick a glyph variant. VS16 asks for the emoji style of a symbol.
ClaudeClean: Deleted, can change emoji
U+0430, U+0435, U+043E, U+0440, U+0441
CYRILLIC а, е, о, р, с Homoglyphs
Look identical to Latin a, e, o, p, c but are different letters.
ClaudeClean: Swapped to Latin inside Latin words
Names and abbreviations from the Unicode code charts. The ClaudeClean column describes what the cleaner does by default; it also catches any other format or control character, while keeping tabs and line breaks.
The definitions come from the Unicode General Punctuation chart and the Latin-1 Supplement chart. The BOM entry follows the Unicode BOM FAQ, which says U+2060 WORD JOINER is strongly preferred over ZWNBSP for word joining.
Lookalike letters are tracked in Unicode's UTS #39 confusables data. Cyrillic а is U+0430, not Latin a at U+0061, even though most fonts draw them the same.
SIDE BY SIDE
No. Here is how the character layer and the statistical layer differ on every point that matters.
| Question | Hidden characters | Claude watermark |
|---|---|---|
| What is it? | Extra code points stored in the string | A pattern in which words Claude chose |
| Can you see it? | Not on screen, but code, hex views and scanners show it | No, and no tool you can run shows it |
| Who can detect it? | Anyone, with an editor or a scanner | Only Anthropic's key, via a private-preview API |
| Does copy and paste keep it? | Usually, though some apps normalize spaces | Yes, it travels with the words |
| How do you remove it? | Find and replace, or a cleaner | Only by changing the words; Anthropic says a full rewrite does it |
| Does it identify you? | No | No, Anthropic says it carries no identifying information |
Swipe to compare →
Claude watermark details from Anthropic's explainer. Hidden character behavior from the Unicode charts and the scanner rules described on this page.
SKIP THE REGEX
ClaudeClean scans for zero width characters, odd spaces, bidi controls, variation selectors and Cyrillic or Greek lookalikes, then cleans them, all in your browser.
THE O3 EPISODE
This is where the confusion started. A 2025 discovery about spaces got called a watermark long before any lab shipped one.
In April 2025, the startup Rumi reported that answers from OpenAI's o3 and o4-mini contained U+202F narrow no-break spaces, mostly in long responses and not in GPT-4o, according to Trending Topics. OpenAI made no public announcement, but Rumi later wrote that OpenAI told it the characters were not an intentional watermark.
Those spaces were visible in editors like VS Code and Sublime, and a find and replace took them out. That's the defining trait of the character layer: anyone can see it and anyone can clean it.
OpenAI's real text watermark arrived on October 5, 2026. Per BleepingComputer, textGrain is a statistical signal in word choice with no hidden characters, invisible spaces or unusual punctuation.
Don't treat odd spaces as proof
A U+202F in a document is not evidence that an AI wrote it. French typesetting, word processors, PDFs and web pages all produce no-break spaces of their own.
Going the other way, a clean string proves nothing either. Both Anthropic and OpenAI now mark text through word choice, which a character scan can't see. For the side-by-side, read ChatGPT vs Claude watermark.
APRIL 2025, REENACTED
Visible to an editor, gone after one replace
Build up over 8202Fweeks. Run 3 times a week, with one long run that grows by about 1202Fkm each week. Keep most runs easy enough to talk. In the last week, cut the distance in half and rest 2202Fdays before the race. On race day, start slower than feels right for the first 2202Fkm.
Find and replace
Sample answer written for this page. The character is real: U+202F, as Rumi reported in o3 and o4-mini output.
DO IT BY HAND
Six steps from a quick editor check down to raw bytes. You only need the first two for most documents.
Browser console snippet
const re = /[\u00A0\u00AD\u2007\u200B-\u200F\u202A-\u202F\u2060\u2066-\u2069\uFE00-\uFE0F\uFEFF]/g; [...text.matchAll(re)].map((m) => "U+" + m[0].codePointAt(0).toString(16).toUpperCase().padStart(4, "0"));
Run on "Hello", ZWSP, "world", NBSP, "and", NNBSP, "more", it returns U+200B, U+00A0 and U+202F. It doesn't cover lookalike letters, which need a confusables map.
STEPS 3 AND 4, RUN FOR REAL
What the hidden characters look like in bytes
The example from the snippet below, saved to a file and dumped with xxd. Highlighted bytes are the invisible characters.
$ printf 'Hello\u200Bworld\u00A0and\u202Fmore' > sample.txt
$ xxd sample.txt
00000000: 4865 6c6c 6fe2 808b 776f 726c 64c2 a061 Hello...world..a
00000010: 6e64 e280 af6d 6f72 65 nd...more
$ node snippet.js # the console snippet below
[ 'U+200B', 'U+00A0', 'U+202F' ]
3 hidden characters in 25 bytes.
# lookalike letters need a confusables map
$
MacBook Pro
$ printf 'Hello\u200Bworld\u00A0and\u202Fmore' > sample.txt
$ xxd sample.txt
00000000: 4865 6c6c 6fe2 808b Hello...
00000008: 776f 726c 64c2 a061 world..a
00000010: 6e64 e280 af6d 6f72 nd...mor
00000018: 65 e
$ node snippet.js # the console snippet below
[ 'U+200B', 'U+00A0', 'U+202F' ]
3 hidden characters in 25 bytes.
# lookalike letters need a confusables map
$
THE FAST WAY
Paste once and see each hidden code point before anything is deleted.
> source text
Paste it or load a .txt, .docx or .pdf. Anonymous scans take up to 2,000 characters and the scan never leaves your browser.
scan report
3 zero-width1 soft hyphencleanable signals2Zero width characters, odd spaces, soft hyphens, bidi controls, variation selectors and lookalike letters each get counted.
before → after
clearusefulanswerfocusedhelpfulresponse
Copied ✓Cleaning handles the character layer. For the word-choice layer, an optional rewrite runs through a non-Claude model with a diff.
PRICING
The scan and hidden-character cleanup are free. Pro adds room for rewrites and files.
CLAUDECLEAN PRO
Cancel anytime.
Free: 10 credits a month with an account, or try 2,000 characters right here without one. Strong rewrites cost 2× credits.
BEFORE YOU DELETE
In plain English prose, nearly all of them. A few carry real meaning in other contexts.
LOOKALIKE LETTERS, MAGNIFIED
Same shape, different letter
Pick a pair. The lens reads each letter's code point, and only the Cyrillic one lights up.
The word on screen
Most fonts draw both the same. The bytes differ: one byte for the Latin letter, two for the Cyrillic one in UTF-8.
THE KEY POINT
No. Cleaning the character layer and changing the word-choice layer are separate jobs.
Anthropic's explainer says nothing is added to the text and there are no hidden characters. There's nothing in the character layer for a cleaner to find.
The watermark only changes when the words change. Anthropic says light editing probably won't remove it, while a full rewrite that replaces every word will.
A cleaner still earns its place. Stray NBSPs break search and word counts, lookalike letters break spell check, and bidi controls can scramble how text displays.
What ClaudeClean does and doesn't do
It removes or normalizes the characters in the table above, in your browser. Its optional rewrite changes wording through a non-Claude model and shows a diff.
It can't read any provider's watermark, and rewriting is best effort. No detector result is promised. For the editing side, see does paraphrasing remove the Claude watermark.
TWO SHEETS, TWO JOBS
A cleaner reaches the top sheet only
Hidden characters sit on top of the text. The watermark is the text. Try both buttons.
Quarterly revenueNBSP grew steadilyZWSP across everySHY region.
Quarterlyrevenuegrewsteadilyacrosseveryregion.
Sample sentence written for this page. Tinting marks Claude's word choices for illustration; nobody outside Anthropic can see the real signal.
ZWSP, UP CLOSE
U+200B has real jobs outside AI text. Here's what it does, how to type one and how to find one.
PURPOSE
TYPING ONE
​ in HTML or \u200B in JavaScript, Python or JSON strings.FINDING ONE
For one-click copy, typing shortcuts and removal steps in VS Code, Word and Python, see the zero width space guide. To list every hidden code point in a text, use the invisible character detector.
WHY YOU CAN'T SEE IT
An 18-minute explainer that starts with red and green word lists and ends at SynthID-Text.
REFERENCES
Primary references for every code point and claim on this page.
Unicode
General Punctuation chart (U+2000 to U+206F)
ZWSP, ZWNJ, ZWJ, LRM, RLM, NNBSP, figure space, bidi controls and word joiner, with their annotations.
View sourceUnicode
Latin-1 Supplement chart (U+0080 to U+00FF)
No-break space, commonly abbreviated NBSP, and the soft hyphen, abbreviated SHY.
View sourceUnicode
UTF and BOM FAQ
What a byte order mark is and why U+2060 is preferred over U+FEFF for word joining.
View sourceUnicode
UTS #39: Security mechanisms
The confusables data behind lookalike letter detection, such as Cyrillic а versus Latin a.
View sourceVisual Studio Code
November 2021 release (1.63)
Default highlighting of invisible and confusable characters, and the settings that control it.
View sourceAnthropic
Claude text watermark explainer
Where Anthropic states that nothing is added to the text and there are no hidden characters.
View sourceFor what the watermark is and who can read it, start at the Claude watermark guide.
FAQ