Inspector
Invisible characters appear as labeled tags. Underlines mark lookalike letters and typographic substitutions. Hover anything for details. Dashed tags are legitimate (emoji, non-Latin scripts) and stay untouched.
Cleaning settings
Cleaned text
Why pasted text is not what it looks like
Unicode contains dozens of characters with zero width. They render as nothing, yet they count as real characters everywhere it hurts: string comparisons, database keys, URLs, YAML indentation, git diffs. A product name with a zero-width space in it will never match a search for the same name without one. A config value with a trailing word joiner fails validation with an error message that looks impossible.
AI writing tools made this an everyday problem. Chat models are trained on typographically rich text, so their output mixes curly quotes, em dashes, single-character ellipses, and unusual space characters into content that people then paste into code editors, CMS fields, terminals, and billing systems. Some of those characters are also used deliberately, as watermarks or worse.
What this tool finds
| Character | Code | What goes wrong |
|---|---|---|
| Zero width space | U+200B | Splits words invisibly. Breaks search, matching, and deduplication. |
| Narrow no-break space | U+202F | Appears in AI chat output around times and units. Looks like a space, fails ==. |
| Soft hyphen | U+00AD | Invisible until a line wraps. Corrupts identifiers and product codes. |
| Bidi overrides | U+202A..U+202E | Reorder displayed text. Can make exe.txt read as txt.exe. |
| Tag characters | U+E0000..U+E007F | Carry an invisible ASCII payload. Used for watermarking and hidden instructions. |
| Lookalike letters | various | A Cyrillic ะพ inside a Latin word defeats search, filters, and reviews. |
| Smart punctuation | U+2018..U+2026 | Fine in prose. Breaks shell commands, JSON, and code snippets. |
The narrow no-break space
If one character deserves its own paragraph, it is U+202F. ChatGPT and similar tools insert it between numbers and units, and around times, where a typographer would. Almost nobody types it on purpose. When you find one in a support macro, a WHMCS email template, or a spreadsheet formula, it almost certainly arrived through a paste. It is also why "9:30 AM" sometimes refuses to match "9:30 AM" even though both look identical on screen.
Hidden payloads
Unicode tag characters were designed for language tagging and later deprecated. Each one maps to an ASCII character, and all of them are invisible. That makes them a convenient channel for hiding text inside text: watermarks that survive copy-paste, or instructions smuggled into content that a person approves without ever seeing them. This tool decodes any tag run it finds and shows you the payload. The bidirectional overrides in the table above are the display-reordering cousins of this trick, documented as Trojan Source (CVE-2021-42574).
What gets left alone
Most cleanup scripts strip every invisible character they can match. That destroys real content, because several of these characters do essential work:
- Zero-width joiners hold emoji families together. Remove them and ๐จโ๐ฉโ๐ง becomes three separate people.
- The zero-width non-joiner is required spelling in Persian and appears throughout Hindi, Tamil, and other scripts. Stripping it mangles words.
- Variation selectors decide whether โค renders as text or as the red emoji heart, and select glyph variants in Japanese names.
- The flags of Scotland, Wales, and England are built from tag characters. A naive tag stripper deletes the flag.
- An en dash between digits, as in 2019โ2024, is correct typography and stays put.
This cleaner checks context before it touches anything, and the inspector shows kept characters with a dashed outline so you can see the decision instead of trusting it blindly.
Questions people ask
Is this an AI detector?
No. It finds characters, not authorship. Clean text is not proof a person wrote something, and hidden characters are not proof a machine did. What the tool removes are the mechanical artifacts that cause practical problems and false assumptions.
Will cleaning make AI text read as human?
Only at the character level. Wording, rhythm, and structure are still yours to edit. If you rewrite the words but keep the invisible characters, you keep the problems too, which is the part most people miss.
Is my text uploaded anywhere?
No. The page is static, the analysis runs in your browser, and there are no network requests after the page loads. You can disconnect from the internet and it keeps working, or run it locally from the source.
Can I use the detection rules in my own project?
Yes. The ruleset ships as machine-readable JSON and the engine is a dependency-free ES module under the MIT license.
Why I built this
While cleaning up my own GitHub profile I went through every public file removing the typographic tells that AI tools leave behind, one em dash at a time. Halfway through it occurred to me that the invisible characters were the bigger risk, and that I had no way to see them. This is the tool I wanted that afternoon.