What this tool removes
Every AI tell is a specific Unicode code point, so the rules are exact.
Invisible and zero-width: zero-width space (U+200B), zero-width joiner and non-joiner (U+200D, U+200C), word joiner (U+2060), soft hyphen (U+00AD), byte-order mark (U+FEFF), variation selectors (U+FE00 to U+FE0F), bidirectional marks (U+200E, U+200F), and the narrow no-break space (U+202F) behind the 2025 watermark scare.
Punctuation: em dash (U+2014) to a hyphen, comma, space or nothing. En dash (U+2013) to a hyphen. Curly quotes and apostrophes (U+201C, U+201D, U+2018, U+2019) to straight ASCII. Ellipsis (U+2026) to three periods.
Spacing: no-break space (U+00A0) and its typographic relatives to a normal space. Doubled spaces down to one. Extra blank lines trimmed.
Markdown leftovers: stray bold, italic and heading marks, plus bullet markers, for the times AI output lands in a plain-text field.
Lookalikes: NFKC normalization and homoglyph conversion turn a Cyrillic "а" or a Greek lookalike back into the Latin letter it imitates. NFKC on its own ignores em dashes, curly quotes and emoji, so each needs its own rule. Tools that stop at dashes miss most of the surface.
Originality.AI publishes a reference of 87 such characters with code points and replacements, the fullest public list of its kind.
Why the characters are there
The characters break real things downstream, which is the part nobody mentions. Python raises a SyntaxError on a curly quote. JSON rejects anything but straight ASCII double quotes around keys and values.
Invisible bidirectional controls power the [Trojan Source attack](https:
krebsonsecurity.com/2021/11/trojan-source-bug-threatens-the-security-of-all-code/) (CVE-2021-42574), where code reads one way to a reviewer and compiles another way. They survive copy-paste between editors and operating systems. Screen readers announce every emoji by name, so five fire emoji read as "fire fire fire fire fire".
They are a training artifact. The watermark story has a traceable origin: in April 2025 Rumi reported that o3 and o4-mini seemed to embed narrow no-break spaces in longer answers. OpenAI said the characters were "not a watermark" and called them "a quirk of large-scale reinforcement learning". The behavior disappeared after a model update the next day. A real watermark does not vanish in 24 hours, and one that find-and-replace defeats is pointless.
The em dash has a duller explanation. Training corpora lean on digitized print books from around 1900, and that prose uses far more dashes than we do. Markdown-heavy text reinforces them as structural marks, and preference tuning rewards the clipped style they produce. One study measured GPT-4.1 at about 10.6 em dashes per 1,000 words unprompted, and about 3.9 when told to stop. Smart quotes share the root: edited source text, no keyboard pushing the model back to ASCII.
OpenAI did ship a fix. GPT-5.1 arrived on November 12, 2025, and two days later Sam Altman announced a custom-instruction toggle for em dashes on the free and Plus tiers. It helps. Dashes still slip through, and it does nothing about the invisible characters.
How to use it
1. Paste your text into the box. ChatGPT, Claude, Gemini, Word and web pages all behave the same.
2. Press Clean for the default set, or flip individual toggles. Keeping en dashes in number ranges is a common choice.
3. Copy the result. The counters show how many hidden characters went and how many dashes were replaced.
This free tool vs Klipto
The web tool fixes one snapshot. On a Mac you can get it automatically on every paste with Klipto, whose Anti-LLM transform runs the same cleanup the moment you press ⌘V, in any app, offline.
One rule differs. Anti-LLM removes quote and apostrophe glyphs outright instead of converting them, so "don't" comes out as dont. The rest of the pass:
Punctuation and glyphs: em and en dashes become hyphens, the ellipsis glyph becomes three dots, semicolons become commas, and stray colons drop out. Clock times like 12:30 and the :// in a URL survive on purpose.
Invisible and fancy characters: zero-width characters, the byte-order mark and non-breaking spaces are removed. Full-width and ligature glyphs normalize to plain ASCII through NFKC. A literal \n pasted out of code turns back into a real line break.
Markdown and structure: bold, italic, strikethrough, inline code, headings, blockquotes, code fences and table pipes flatten to plain text. Links keep their address, so [docs](https://klipto.me) becomes docs klipto.me. List markers and inline (a)/(b) enumerations become bullets or commas, emoji and arrows come off, and runs of blank lines collapse.
| This free web tool | Klipto Anti-LLM | |
|---|---|---|
| Strips dashes, quotes, hidden characters | Yes, manually | Yes, in one pass |
| Runs on paste | No, copy back from the site | Yes, every ⌘V |
| Works system-wide | No, this page only | Yes, any macOS app |
| Needs a website or internet | Yes | No, native and offline |
| Privacy | Runs in your browser | On-device, network only for updates |
| Clipboard history, Stack, 20+ transforms | No | Yes |
| Platform | Any browser | macOS 14+ |
| Price | Free | Free tier, $19.99 one-time Pro |