No invisible characters in Claude, ChatGPT or Gemini output
By Claude Watermark Research · Updated
We copied real responses out of Claude, ChatGPT and Gemini through their actual web interfaces, captured both clipboard formats, and ran roughly 820 words through an artifact checker. The result: zero zero-width characters, zero non-breaking spaces, zero exotic spaces. Not a low rate — none at all. That matters because an entire category of tools sells removal of exactly those characters from AI text. One thing is genuinely there: Claude’s HTML clipboard format carries class names containing “claude” and twelve data attributes. ChatGPT and Gemini carry nothing identifying.
Check your own text for these artifacts. Runs in your browser, no account, nothing uploaded.
Why nobody had measured this
The artifacts live in the clipboard, not in the model output. A response is not a file you download; it is HTML rendered in a browser, and what lands on your clipboard is produced by the browser at the moment you press copy. So the only valid way to measure it is to copy text out of a rendered chat interface the way a person does, which means being logged in and using the mouse.
It also means capturing both clipboard formats. Every copy puts two versions on your clipboard at once: `text/plain` and `text/html`. Paste into a plain textarea and you get the first. Paste into Google Docs, Word, Notion, Substack or AO3’s editor and you get the second. They are completely different bytes, and almost everything written about this topic only ever looks at one of them.
What we did
Same prompt to each provider, asking for two short paragraphs of plain prose with no lists or headings. Select the response with the mouse, press copy, paste into a local page that captures both clipboard formats from the paste event, then run both through the open-source detection engine.
Claude Opus 5, ChatGPT Instant and Gemini Flash, on 17 August 2026, macOS Chrome. About 820 words in total. For Claude we captured two paths separately: selecting the text and pressing copy, and clicking Claude’s own copy button.
Finding 1: not one invisible character, anywhere
Across all three providers and both clipboard formats: zero zero-width characters, zero non-breaking spaces, zero exotic spaces.
This is the empirical answer to the question an entire product category is built on. Tools in this space advertise removal of “hidden zero-width characters, invisible spaces, and other unicode markers” from Claude text. We copied Claude text out of Claude and looked. There is nothing of that kind to remove.
It also lines up with the other direction. We separately ran 40,080 words of human-authored prose — news, government, RFCs, documentation, Gutenberg — and the provider classes never fired once. Both sides are now measured: these characters are neither in human writing nor in chat-interface output.
Finding 2: only Claude signs the clipboard
Claude’s `text/html` format carries `font-claude-response`, `standard-markdown`, and twelve `data-` attributes including `data-is-streaming`. That is a real, deterministic fingerprint, and it is the thing the AO3 detector skin actually looks for.
ChatGPT’s HTML was 718 bytes for 636 bytes of text: paragraph and span tags, no classes, no data attributes, nothing identifying the provider. Gemini carried one attribute, `data-path-to-node`, and no identifying class.
So the “look for claude in a class name” approach works against Claude and only Claude, and only when the HTML format is what gets pasted.
Finding 3: the copy button and Cmd+C give different results
Selecting Claude’s response and pressing copy produced HTML carrying three class names. Clicking Claude’s own copy button on the same message minutes later produced a bare wrapper with zero classes.
That is the most directly useful thing here. If you are pasting Claude output into a rich-text editor and would rather not carry provider markup into it, use the copy button in the interface rather than selecting the text.
What this does not show
It says nothing about Anthropic’s statistical watermark. That mark lives in word choice rather than in characters, nobody outside Anthropic can currently verify it, and none of this measures it in either direction.
It is also one sample per provider. Enough to show these characters are absent from real copied output; not enough to publish a rate. If a provider changes its front end tomorrow the answer could change, which is why the method is written out rather than just the numbers.
Questions
- Do AI chatbots hide invisible characters in their text?
- Not in what we measured. Across roughly 820 words copied from Claude, ChatGPT and Gemini through their real interfaces, in both clipboard formats, there were zero zero-width characters, zero non-breaking spaces and zero exotic spaces.
- So what do watermark removers actually remove?
- Usually zero-width and invisible Unicode characters. In real copied chat output those characters were not present, and they have nothing to do with Anthropic’s statistical watermark, which lives in word choice rather than in characters.
- What does Claude actually leave behind?
- HTML class names containing “claude” plus twelve data attributes, but only in the HTML clipboard format. That matters when pasting into Google Docs, Word, Notion or AO3. Pasting through a plain-text editor first discards all of it.
- Does this apply to ChatGPT and Gemini too?
- Their output was clean in both formats. ChatGPT’s HTML carried no classes or data attributes at all; Gemini carried one non-identifying attribute. Neither leaves anything that identifies the provider.
Check your own text. Free, unlimited, no account, and it runs in your browser so nothing is uploaded.
Open the checker






