Strip markdown and invisible characters

Markdown becomes plain text, and the characters you cannot see (no-break space, zero width, soft hyphen) are shown as dots, counted by type and removed. The before/after view stays on all the time, so you can check every mark before you copy.

ℹ️This tool does not tell you whether a text was written by an artificial intelligence. Nobody can tell from the characters: a text full of em dashes can be handwritten, and a spotless text can be generated. Here we fix the characters, that is all.

Settings

Markdown

Links become:
Bulleted lists become:
Tables become:

Invisible characters

Typography

0Characters before
0Characters after
0Invisible found
0Markdown marks

Before

After

In the «Before» panel the filled dots are the invisible characters being removed, the hollow ones those kept on purpose: tap one (or hover it with the mouse) and the name of the character shows up in the line just above; with the keyboard you reach the panel with the tab key and move from one dot to the next with the arrow keys. The pink background marks the markdown that disappears, the yellow one the punctuation that changes. In the «After» panel green is what gets added.

🔒 The text stays in your browser: it is never saved or sent anywhere.

What it does, in two passes

The first pass looks at the characters you cannot see: it counts them one by one, tells you what type they are and either removes them or turns them into a normal space. The second turns markdown into plain text: heading hashes go away and the heading stays on its own line, bold and italic become text, lists stay lists, tables become readable lines, links become «text (address)» or just the text, and quotes lose the greater-than sign. Inside code blocks, both the ones between three backticks and the ones indented by four spaces, markdown is not converted and the spaces stay as they are. Last comes the typographic pass, which only goes one way: from curly quotes to straight ones, from the em dash to the plain hyphen, from the ellipsis character to the three dots you type. The opposite direction, the one a typesetter wants, is not what this tool is for. One choice made on purpose: invisible characters and typography, once you switch them on, are fixed inside code too, because a no-break space or a curly quote inside a string is exactly what breaks a program.

The characters you cannot see, and why they cause damage

The no-break space (U+00A0) is the one that keeps «10 kg» on the same line: it looks like a space, but to a program it is a different character. Inside a code string it breaks compilation, inside a business software field it gets the value rejected, and in a comparison between two identical texts it makes them come out different. The zero width space (U+200B) and the U+FEFF mark do not even take up room: they are completely invisible, and they ride along with copy and paste from a web page or an editor. The soft hyphen (U+00AD) is a hyphenation hint that only shows up when the word wraps, but it stays in the data. Direction marks belong to Arabic and Hebrew text and in a Latin text they almost always ended up there by mistake. Control characters should not be there at all. For each of these the page tells you how many there are and what happened to them: this is not blind cleaning.

The exceptions: two invisible characters that must NOT be removed

Two zero width characters are real content, not dirt. The first is the zero width joiner (U+200D): it is what holds composed emoji together. A family is written as four separate figures glued by three joiners, a profession as a person plus an object, and taking that character away splits the emoji in front of the reader. The second is the zero width non-joiner (U+200C): in Persian and in the Indic scripts it is not an ornament but a letter, because it stops two letters from joining and changes the written word. The two switches are here, they are off to begin with, and even when you turn them on the tool leaves the legitimate ones alone: a joiner between two pictographic signs and a non-joiner next to an Arabic, Persian or Indic letter are never touched. They still show up in the count, as hollow dots, so you know they are there.

Why the before/after view is always on

Because markdown is not an unambiguous language, and whoever converts it has to be able to check. In «3 * 4 * 5» the asterisks are multiplications, in long_user_name the underscores are part of the name, and in a footnote the square brackets are not a link. This page is cautious by construction: an asterisk opens bold only if it has no space after it and no letter or digit before it, so multiplications and variable names survive. But caution is not a guarantee on a text it has never seen: in the «Before» panel every mark that is about to disappear is coloured, so you see it before you copy, not after you have pasted it somewhere else.

It does not tell you whether a text was written by an AI

Many people arrive here looking for that, and the honest answer is that the characters cannot tell you. The em dash, the curly quotes and the single ellipsis character are put there by your phone's autocorrect, by Word, by any page layout program, and by everyone who writes for a living. The other way round, a generated text that has been tidied up has nothing recognisable left. The programs that promise that verdict are often wrong, and they are wrong most of all against people writing in a language that is not their own. This tool does one thing and does it fully: it fixes the characters.

What it does not do, stated up front

It does not strip HTML tags: for that there is Remove HTML tags. It does not repair mangled accents (the «perché» kind), which are an encoding problem and are solved by Fix broken characters. If all you need is double spaces and indents, Remove extra spaces is more direct. It does not add markdown where there is none and does not convert the other way. It leaves footnotes and reference style links ([text][1]) alone, because touching them would do more harm than good, and it leaves tabs alone, since they are often the structure of the data. A code block opened and never closed is reported rather than guessed. The before/after view stops at the first 20,000 characters so it does not choke a phone, while the text you copy and download is always complete; past 200,000 characters the tool stops and says so. Everything happens in your browser: the text is never uploaded anywhere.