Deep hidden scan
We look for more than 4,200 hidden characters, not just a short list. We find hidden spaces, sneaky controls, and other tricks that many cleaners skip.
We check your ChatGPT, Claude, or Gemini text for 4,231 invisible characters and remove them. The best other tool checks for 104. You'll see each one we find, where it is, and what it does. Nothing you paste leaves your browser. 100% free.
Input limit: 20,000 words; files up to 1 MB (.txt or .md).
See every flagged match in your text and where it appears. Keep or remove any single hit when a Preset is not enough.
We look for more than 4,200 hidden characters, not just a short list. We find hidden spaces, sneaky controls, and other tricks that many cleaners skip.
Each finding tells you what we found, where it sits, and what it does. You see everything before you clean. No secret magic button.
We treat emoji, right to left text, Asian scripts, and normal editor marks with care. We go after suspicious hiding spots, not your real words.
Use Standard for everyday paste. Pick Advanced or Strict when you want a deeper clean. Same tool, easy choice.
Remove all invisible characters, fancy dashes, or emojis with one tap. Fast cleanup without opening every rule.
Turn on Show invisibles to see spaces and hidden controls you cannot see in normal text. Check your text before and after you clean.
We protect fenced and inline code so cleanup does not break your snippets. Paste blog posts or docs without wrecking your examples.
Change any single spot. Keep this one. Remove that one. Fine control when a preset is not enough.
Copy cleaned text, download it, or save a small report file of what changed. Free to use. No account needed.
AI text watermarks come in two forms, and only one of them is made of characters you can delete.
| Watermark type | Where it lives | Visible to this tool | Removable by this tool |
|---|---|---|---|
| Hidden character marks | In the bytes of the text, as invisible or unusual code points | Yes | Yes |
| Token selection marks | In the word choices themselves | No | No |
Hidden character marks are code points your text editor stores and your screen never draws.
Token selection marks are carried by which word the model picked at each step, so they leave no character to find and no character to strip. Every AI tool that marks text output today uses this kind.
A character is invisible when it takes no width on screen. Unicode records that behaviour with the Default_Ignorable_Code_Point property and with the general category Cf, meaning format.
Default_Ignorable_Code_Point is a derived property, published as a plain text list in DerivedCoreProperties.txt for every version of the standard. This cleaner pins Unicode 17.0, released 9 September 2025, which added 4,803 new characters and brought the total encoded to 159,801.
I pulled the Unicode 17.0 property data and counted it myself. 4,174 code points carry Default_Ignorable_Code_Point, but only 405 of them are assigned characters. The other 3,769 are reserved slots that nothing uses yet. Of the 405, 256 are variation selectors and 97 sit in the Tags block, which leaves 52 that show up in ordinary writing.
Category Cf holds 170 characters in the same version. That is why a round marketing number like "104 hidden characters" tells you nothing on its own. Without a Unicode version printed next to it, the number cannot be checked against anything.
A token selection also known as statistical watermark is stored in which words the model chose, so deleting invisible characters does not clean the statistical marks.
No text watermark cleaner on the internet can remove a token or statistical selection watermark, because the algorithm used by the AI tools is proprietary.
OpenAI says no. On 20 April 2025 Rumidocs reported that replies from GPT o3 and o4 mini contained U+202F, the NARROW NO-BREAK SPACE. OpenAI answered two days later. The characters were "a quirk of large-scale reinforcement learning" and were not a watermark. Rumidocs updated the piece on 23 April 2025 to say the special characters had stopped appearing.
OpenAI did build a text watermarking method in 2024 and never shipped it. Its current provenance help article lists what carries a signal today: images get C2PA Content Credentials and SynthID, audio gets SynthID, and text gets neither. The same page states that "our goal is to expand provenance signals to all modalities including text", which is a plan rather than a product.
The honest answer is short. ChatGPT does not watermark its text, and the characters people found in 2025 were a bug that got fixed.
The characters this cleaner finds fall into five groups: zero width characters, unusual spaces, control characters, lookalike punctuation, and tag or private use characters.
| Group | Examples | What it does | Standard preset |
|---|---|---|---|
| Zero width characters | U+200B, U+200C, U+200D, U+2060, U+FEFF | Occupies no width, still stored in the file | Removes U+200B, U+2060, U+FEFF and keeps the two joiners |
| Unusual spaces | U+00A0, U+2009, U+202F, U+3000 | Looks like a space, sorts and searches as a different character | Converts to a normal space |
| Control characters | C0 and C1 ranges, bidirectional controls | Steers rendering or breaks parsers, never prints | Removes everything outside tab and newline |
| Lookalike punctuation | Curly quotes, en and em dashes, U+00AD | Prints, but not as the character you typed | Leaves alone |
| Tag and private use | U+E0000 to U+E007F, private use area | Carries readable text that no human sees | Removes |
Here is the running example I used for every measurement on this page. The sentence "The meeting starts at 9:30 am on 12 May." is 40 characters and 40 bytes when typed straight into a plain text editor. After one trip through a word processor and back it came out as 42 characters and 49 bytes. Inside sat a byte order mark at the front, a zero width space after "am", and two ordinary spaces quietly swapped for U+202F and U+00A0. Nine extra bytes. Nothing visible changed.
The meeting starts at 9:30 am on 12 May.Zero width characters take no space on screen but still exist in the file, which is why pasted text can carry marks nobody can see.
| Code point | Official Unicode name | Real job |
|---|---|---|
| U+200B | ZERO WIDTH SPACE | Marks a line break opportunity, mostly inserted by web editors |
| U+200C | ZERO WIDTH NON-JOINER | Keeps letters apart in Persian and Arabic words |
| U+200D | ZERO WIDTH JOINER | Joins emoji into one picture and forms conjuncts in Indic scripts |
| U+2060 | WORD JOINER | Stops a line breaking at that point |
| U+FEFF | ZERO WIDTH NO-BREAK SPACE | The byte order mark, usually left by a text editor and not by an AI |
Two of those five are working characters, not junk. U+200C and U+200D carry meaning in real languages, which is the reason the Standard preset leaves them where they are.
Unusual spaces look like an ordinary space but carry a different code point, which breaks search, sorting, and code.
Unicode 17.0 defines 17 characters in the Zs category, space separator, and only one of them is the space on your keyboard. I listed all 17 out of the character database with their byte widths in UTF-8, because the byte width is what makes them expensive.
| Code point | Official Unicode name | UTF-8 bytes |
|---|---|---|
| U+0020 | SPACE | 1 |
| U+00A0 | NO-BREAK SPACE | 2 |
| U+1680 | OGHAM SPACE MARK | 3 |
| U+2000 to U+200A | EN QUAD through HAIR SPACE, 11 characters | 3 each |
| U+202F | NARROW NO-BREAK SPACE | 3 |
| U+205F | MEDIUM MATHEMATICAL SPACE | 3 |
| U+3000 | IDEOGRAPHIC SPACE | 3 |
A single U+202F costs three bytes where a space costs one, and a search for "9:30 am" will not match "9:30 am" when the gap is U+202F. That mismatch is the reason spaces get normalised even in the Standard preset.
9:30 am
9:30 amYou can copy paste the sample text in the above tool input box to see the result.
Curly quotes, long dashes, and the soft hyphen U+00AD usually come from a word processor autocorrect setting, not from a language model.
Unicode 17.0 gives the Dash property to 31 characters, from the plain U+002D on your keyboard to U+2014 EM DASH and U+2E3A TWO-EM DASH. Only one of them is a keyboard press. The rest arrive when software decides what you meant. U+00AD is the odd one out, because it prints as a hyphen only when a line breaks there and stays invisible everywhere else.
Dashes are the question that brings most people to a page like this, and the short answer is that they prove nothing. The full argument sits further down under the section on em dashes.
Characters in the Unicode Tags block, U+E0000 to U+E007F, can carry a complete sentence that no human reader will ever see. That is how attackers smuggle hidden instructions into text an AI assistant will later read.
The AWS Security Blog covered Unicode character smuggling on 30 September 2025. It describes tag characters that were "Initially designed as invisible markers for indicating language within text" and have "emerged as a potential vector for prompt injection". A Cloud Security Alliance research note dated 10 March 2026 traced the same trick into AI agent skills, tool descriptions, and MCP servers. That work names the Tags block alongside U+200B, U+200C, U+200D and U+FEFF.
I built one to see the size of it. The visible sentence "Great work on the report." is 25 characters and 25 bytes. I appended a 42 character instruction encoded in tag characters. The file grew to 67 characters and 193 bytes. On screen it still reads as five words and a full stop, and a script pulled the instruction back out of the copy intact. Every tag character costs four bytes and zero pixels.
Great work on the report.This is the strongest reason to clean text that has nothing to do with AI detection. Paste a block of copy from a web page into a chat assistant and you may be handing it instructions you never typed.
This cleaner scans your text the moment you paste it, lists every finding with its official Unicode name and position, and changes nothing until you press Clean text.
The sequence has four steps:
This cleaner does not rewrite, paraphrase, or humanise a single word of your text.
Standard removes the characters that cause problems in normal writing, Advanced widens the net, and Strict removes the most.
| Character group | Standard | Advanced | Strict |
|---|---|---|---|
| Zero width space, word joiner, byte order mark | Removed | Removed | Removed |
| Bidirectional controls and C0/C1 controls | Removed | Removed | Removed |
| Tag block and private use characters | Removed | Removed | Removed |
| Soft hyphen U+00AD | Removed | Removed | Removed |
| Unusual spaces in the Zs category | Converted to U+0020 | Converted to U+0020 | Converted to U+0020 |
| Joiners U+200C and U+200D | Kept | Removed outside emoji sequences | Removed everywhere |
| Variation selectors | Kept | Removed outside emoji sequences | Removed everywhere |
| Curly quotes and long dashes | Kept | Kept | Converted to straight quotes and a plain dash |
Three one tap filters sit alongside the presets: delete invisibles, remove dashes and hyphens, and remove emojis. Publishing these rules is deliberate. Every competing tool hides its rule set behind a single button, so you cannot tell what it took out of your text until something breaks.
With Markdown mode and protection switched on, the cleaner skips fenced and inline code, so a snippet that needs an exact character keeps it.
Code is the one place where a character you would call junk in prose is load bearing. A regular expression or a test string can depend on a byte order mark being exactly where it is.
No. The scan and the clean both run in your browser, and the page never uploads or stores your text.
The honest second half belongs in the same breath. This page is free, so it can still show ads and use site analytics. The optional JSON report records what changed. It carries none of your text.
The cleaner accepts up to 20,000 words of pasted text, or one UTF-8 file of up to 1 MB in .txt or .md format.
Everything else is out of scope: not HTML, DOCX, PDF, JSON, or CSV, and paste arrives as plain text only. JavaScript is required. There is no account and no payment. The interface ships in 17 languages. Official Unicode names stay in English in all of them, because a translated character name is no longer a name you can cite.
For photos rather than text, you can remove ai info from image or edit image metadata.
Only some AI vendors mark their text output, and every vendor that does uses word choice rather than hidden characters.
| Vendor | Marks text | Method | Found by this cleaner | Source and date |
|---|---|---|---|---|
| Anthropic, Claude | Yes | Token selection watermark, a version of SynthID Text | No | Anthropic, 11 August 2026 announcement, technical note 14 August 2026, updated 1 September 2026 |
| Google, Gemini | Yes | SynthID Text, token probability modulation | No | Google DeepMind, 14 May 2024, open sourced later that year |
| OpenAI, ChatGPT | No confirmed text watermark | None in production for text. Images carry C2PA and SynthID, audio carries SynthID | Not applicable | OpenAI provenance help article, current as of 2 September 2026 |
| xAI, Grok | No published commitment | None stated | Not applicable | xAI did not sign the Commission transparency Code of Practice, reported 12 August 2026 |
Anthropic says models launched on or after 2 August 2026 carry the mark at launch. It is working to add marking to models released before that date. Text watermark detection is not a public checker. Anthropic states that detection "is currently in private preview, available to eligible organizations as required under EU law". The eligible list runs to regulators, law enforcement, media, fact checkers, researchers, educational bodies and EU civil society groups. The free Claude Content Checker that Anthropic also offers reads C2PA Content Credentials on generated files, which is a different thing from a text watermark.
xAI not signing the Code of Practice does not exempt Grok from the AI Act itself. A voluntary code is a route to compliance, not a substitute for the law.
Claude picks between words that are equally good, and a secret key decides which one it takes. The mark is the sequence of choices, not any character in the text.
Anthropic describes the mechanism plainly. "Instead of using an arbitrary random number generator to pick the next word, watermarking uses the key and a few words that come before to settle what word the model should pick." The company also states that Claude's text watermark "is a version of the SynthID-Text approach published by Google DeepMind in a Nature paper in 2024".
On robustness Anthropic is specific. "Light editing probably won't remove the watermark completely", and a complete rewrite where every word is replaced will remove it.
SynthID Text embeds its pattern in the token probabilities as Gemini writes. Google DeepMind announced SynthID text watermarking for the Gemini app and web experience on 14 May 2024. The method works "by introducing additional information in the token distribution at the point of generation by modulating the likelihood of tokens being generated". DeepMind open sourced the method later that year through its Responsible Generative AI Toolkit.
The published limitations matter as much as the method. SynthID Text works best on longer and more varied answers. It performs poorly on short factual replies, where the model has almost no freedom of wording. Confidence drops again when text is thoroughly rewritten or translated.
A hidden character is evidence that something processed your text, not evidence that an AI wrote it.
Every invisible character has an ordinary explanation that came before AI writing existed. Word processors, content management systems, and PDF exporters have been inserting them for decades. A finding tells you the text has been through software, which is true of almost every sentence anybody publishes.
Word processors, web editors, PDF exports, translation tools, chat apps, and plain copy and paste all insert invisible characters on their own.
| Source | Characters it commonly adds | Why |
|---|---|---|
| Word processors | U+00A0, U+2019, U+2014, U+00AD | Autocorrect and automatic hyphenation |
| Web and CMS editors | U+200B, U+FEFF | Line break hints and file encoding markers |
| PDF exports | U+2009, U+202F, U+00A0 | Preserving typeset spacing when text is copied back out |
| Translation and localisation tools | U+200C, U+200D, U+061C | Correct rendering of Arabic, Persian and Indic scripts |
| Chat and messaging apps | U+200D, U+FE0F | Emoji sequences and text or emoji presentation |
| Copy and paste between apps | U+FEFF, mixed Zs spaces | Encoding conversion at the clipboard |
My own 40 byte test sentence picked up four findings without ever meeting a language model. That is the whole argument in one measurement.
An em dash is a normal punctuation mark that writers, editors, and autocorrect have used for centuries, so it carries no signal about who wrote a sentence.
The 2025 fix settles it. OpenAI said on 14 November 2025 that ChatGPT would finally obey a custom instruction telling it to stop using em dashes. Sam Altman put it plainly on the day: "If you tell ChatGPT not to use em-dashes in your custom instructions, it finally does what it's supposed to do". A habit a user can switch off in a personalisation setting was never a mark. It was a style pattern picked up in training, and the fix was a preference.
This cleaner still offers dash removal, and the reason is honest. It is a style filter for people who want straight quotes and plain dashes in their copy. It is not a watermark filter, and it will not change what any detector says about your text.
Removing zero width characters can break correct text, because some scripts need them to spell words properly.
I ran the four cases that break most often and recorded exactly what happened. The Persian word میخواهم is eight characters, and the U+200C in the middle keeps the two parts from joining. Delete it and you get میخواهم, seven characters and a different written form. In Devanagari, क्ष holds a U+200D that forms the correct conjunct, and stripping it changes the shape on screen. The family emoji 👨👩👧👦 is seven code points, four pictures held together by three U+200D joiners. Remove the joiners and it falls apart into 👨👩👧👦, four separate people. A red heart ❤️ carries U+FE0F to render as an emoji, and without it the same code point falls back to a text symbol, ❤.
That is why the tool shows findings before it cleans anything, why individual hits can be kept, and why Strict is not the default. An editor working in one language sees a clean result. An editor working in six sees a bug report.
Cleaning invisible characters is worth doing for clean, portable, safe text.
Two reasons justify running this tool. The first is that hidden characters break things, quietly, in search results, spreadsheet lookups, code, and URLs. The second is that tag characters can carry instructions into an AI assistant that nobody typed and nobody can see. That makes cleaning a security habit rather than a cosmetic one.
Anyone hoping to defeat a vendor watermark is cleaning the wrong layer. Claude and Gemini mark text in the word choices, OpenAI marks images and audio but not text, and no amount of character stripping reaches any of them. One way to beat these statistical watermarking is translating the text to couple of different languages then translate it to the original.
Paste one page of your own text into the input box above and read the findings to understand the text better or simply copy the output.
That is all for now. Thanks for reading this far.