AI Text Cleaner
How it works
What gets cleaned
Four groups of typography are normalized to plain ASCII: curly quotes (single, double, low-9, guillemets) become straight quotes; the dash family (em, en, figure, horizontal bar, minus sign, hyphen variants) becomes a plain hyphen; the ellipsis character becomes three dots; and exotic spaces (no-break, narrow no-break, the whole U+2000 block) become a regular space. Separately, invisible characters are removed: zero width space, BOM, word joiner and soft hyphen always; zero width joiners and directional marks only where both neighbors are ASCII, so a family emoji (which is glued together by zero width joiners) and legitimate RTL text survive untouched. The ideographic space U+3000 used for CJK indentation is deliberately left alone.
Strip Markdown, join lines, tidy whitespace
Three opt-in passes for CLEAN mode. Strip Markdown turns chat-assistant output into plain text: headings lose their # marks, **bold**, *italic*, ~~strike~~ and `code` lose their markers, links become 'text (url)' so the address is kept, images keep their alt text, blockquote markers, horizontal rules, code fences and table separator rows are removed, table cells are joined by tabs (paste-ready for a spreadsheet), and * or + bullets become '- '. Code inside fences and backticks is passed through untouched, and snake_case names or 2*3*4 are not mistaken for emphasis. Join wrapped lines merges the hard line breaks that PDFs, emails and terminals insert mid-sentence, keeping blank lines between paragraphs and list items, headings, quotes and tables on their own lines. Tidy whitespace converts CRLF to LF, removes trailing spaces, collapses runs of spaces inside a line (leading indentation is kept), allows at most one blank line in a row and trims blank lines at the start and end.
Why invisible characters end up in your text
Copying from rendered web pages and PDFs drags along soft hyphens and directional marks; word processors insert no-break spaces around punctuation; and text passed through LLMs can carry zero-width spaces — sometimes discussed as a way to watermark or fingerprint generated text. None of them are visible, but they break string comparison, grep, deduplication and diff, and they survive copy-paste indefinitely. INSPECT shows each one with its codepoint and line/column position, so you can see exactly what a 'clean-looking' string actually contains.
Why smart quotes break code
Word processors and LLMs both emit typographic quotes: “ ” instead of " ". Paste those into a shell, a JSON document, a config file or source code and the parser sees an unknown character, not a string delimiter — JSON.parse throws 'Unexpected token', bash reports 'command not found' on what looks like a perfectly quoted argument. The same goes for the em-dash pasted into a CLI flag (–verbose is not --verbose). Cleaning them back to ASCII makes text safe for any technical context.
Examples
| “It’s done” — finally… | "It's done" - finally... |
| ## Summary\n**Bold** and a [link](https://example.com) (Strip Markdown) | Summary\nBold and a link (https://example.com) |
| This line was\nhard wrapped. (Join wrapped lines) | This line was hard wrapped. |
| invisiblemarker (contains U+200B) | invisiblemarker |
| INSPECT mode | line 1, col 10 U+200B ZERO WIDTH SPACE |
FAQ
How do I remove the asterisks and # symbols from ChatGPT text?
Tick Strip Markdown and paste the text. Those characters are Markdown formatting that chat interfaces render as bold and headings but that show up literally when the text is pasted into an email, a document or a form. The words are kept; only the syntax goes. Links keep their address as 'text (url)', and code in backticks or fences is left as written.
How do I fix broken line breaks from a PDF?
Tick Join wrapped lines. PDFs and some email clients break lines at a fixed width, so a pasted paragraph arrives as many short lines. The pass joins lines inside a paragraph with a space and keeps blank lines, list items and headings as separate lines. Add Tidy whitespace to collapse double spaces and extra blank lines in the same step.
Will cleaning break my emoji?
No. Multi-person emoji like 👨👩👧 are glued together with zero width joiners. Those joiners are removed only when both neighbors are plain ASCII — inside an emoji sequence the neighbors are emoji, so the sequence is left intact.
Does this remove AI watermarks?
It removes the specific mechanism sometimes described as text watermarking: invisible Unicode characters (zero width spaces, joiners, directional marks) hidden between visible letters. INSPECT shows where they are; CLEAN strips them. Statistical watermarks embedded in word choice are a different thing and no character-level tool can touch those.
Why is my text 'identical' but fails comparison?
Two strings can render identically and differ in bytes: one has a no-break space or a zero-width character where the other has nothing or a plain space. Run both through INSPECT to see the difference, or CLEAN both and compare again — the Text Diff tool on this site works well for the before/after.
Is Chinese / Japanese / RTL text safe?
Yes, by design. The ideographic space (U+3000) used for CJK indentation is never touched, and joiners or directional marks are only removed when surrounded by ASCII on both sides — inside Arabic, Hebrew or Indic text they are preserved.
Is my text uploaded to a server?
No. The page ships a strict Content-Security-Policy: connect-src 'none' blocks fetch, XHR, WebSockets and beacons, while default-src 'self' and form-action 'none' block every other way markup could send data off-site. Cleaning happens in your browser and cannot leave it.