Google · web chat
Gemini Watermark Remover for Canvas and Docs
Gemini is unusual among chat assistants in how often a document editor sits in the path, because it is wired into Docs, Sheets and Gmail alongside the standalone app. That matters here: the moment code becomes a Doc, it enters a rich text model where non-breaking spaces and typographic quotes are ordinary content. This page covers the Gemini web app, Canvas, the Workspace surfaces and the developer routes, and what each is capable of introducing.
Scan your Gemini code now
Free, and it reports every removal by codepoint and line.
What we measured
68
code-generation calls
17
provider and model targets
59,486
characters generated
0
contained a hidden character
On 2026-08-12 we sent identical code-writing prompts to every model our own gateway can reach and scanned each raw API response. Not one of them contained a zero-width character, a bidirectional control, or a tag character.
3 of the 68 answers contained typographic punctuation, and only in the prose-heavy prompts rather than in the plain code one. The most common was the non-breaking hyphen, which is visible but still breaks a copied command. 2 left trailing whitespace.
The useful conclusion is the boring one: raw model output is essentially clean, so when you do find hidden characters in your file, they almost certainly came from the path the text travelled rather than from the model. That is what the section below is about.
Scope: this measured API output from models we can reach directly. It did not measure the Gemini web app, which is the point being made, since the browser is where the characters get added.
How code gets out of Gemini, and what each path adds
The copied string is assembled from the rendered page, so it carries whatever the page typography contained: no-break spaces holding a line together, soft hyphens, and any zero-width characters that were already in the output. A code block is the safer thing to copy from, since prose is where curly quotes and dashes are applied deliberately.
Canvas holds a document or a piece of code in an editable pane beside the chat, and it can push the result onward rather than only onto the clipboard. Every one of those hand-offs is a format conversion, and format conversions are exactly where a straight quote becomes a curly one and an ordinary space becomes a no-break space. Check anything that has been through Canvas twice, once for what the model wrote and once for what the conversion did.
Inserting a response straight into a document places it in a format that stores non-breaking spaces, soft hyphens and typographic quotes as first-class content, and that applies automatic substitution as text is entered. Anything you later copy out of that document comes back carrying them. If code has passed through a Doc at any point, assume it needs cleaning before it is committed.
Both skip the browser text layer entirely: the API returns the model string, and the CLI writes into your working tree. What remains is what the model emitted plus anything that arrived through the prompt, and retrieved web pages are a common carrier for bidirectional controls and tag-block sequences. Scan files an agent has written before you review them, since a terminal will not show you any of it.
The advice for Gemini turns on one question that does not really arise for other chat products: has this text been a document yet? Docs and Gmail are the risky step, not the model, because they are the part of the chain that legitimately stores and inserts the characters you are trying to remove. Google AI Studio deserves a separate note, since it looks like a developer tool but its response pane is still a web page, so copying from it is a browser copy rather than an API read. If you want the raw string from AI Studio, take the generated client code or call the API and read the response, rather than selecting the text on screen.
What this does not do
It does not remove statistical watermarking. Schemes of the SynthID family add no characters at all: they bias which token the model samples, so the signal lives in word choice across the whole output and nothing you can delete carries it. Attacking that means rewriting the text, which for source code risks changing what it does.
This is a hygiene and security tool, not an attribution bypass. Formatters already normalise surface signals, and what identifies generated code is structure and style rather than hidden bytes. Disclose AI assistance wherever you are asked to.
Gemini questions
Why does code break after it has been through a Google Doc? +
A document format is designed to preserve typography, so it keeps non-breaking spaces and applies quote substitution as a feature rather than a bug. Copy back out and you get straight quotes replaced by curly ones and some spaces that are not U+0020. Compilers and shells reject both, and neither is visible in the editor you are reading.
Is Canvas safer than copying from the chat pane? +
Not inherently. Canvas is an editing surface, so it adds a place where formatting can be applied on the way in and on the way out, in exchange for a more convenient workspace. If the end point is a source file, the shortest path from the model to your disk stays the safest one, and everything else should be scanned.
Does this remove SynthID? +
No. SynthID for text watermarks by adjusting the sampling of tokens, so it inserts no characters and no character-level edit can affect it. This tool only reports and deletes codepoints that are present but invisible. It is not a detection-evasion tool and should not be described as one.
I use the Gemini API directly and still find zero-width characters. Where do they come from? +
From the prompt side, usually. Retrieved pages, PDFs, scraped documentation and pasted logs all carry watermarks, and a model that has them in context can reproduce them in its answer. Cleaning your inputs cuts the problem off at the source, and scanning the output catches the rest.