The characters this finds
Zero-width family: U+200B zero-width space, U+200C zero-width non-joiner, U+200D zero-width joiner, U+2060 word joiner, U+FEFF byte-order mark. These render as nothing at all and are the most common carriers for hidden data in text.
Unicode tag characters: U+E0000 to U+E007F. This block mirrors ASCII but renders as absolutely nothing, which means an entire readable message can be encoded in it and hidden inside an innocuous-looking sentence. If your text contains a run of these, someone put a payload in it.
Variation selectors: U+FE00 to U+FE0F, plus U+E0100 to U+E01EF. These normally modify how a preceding character displays. Free-floating, with no base character in front of them, they are a known channel for encoding bytes.
Bidirectional controls: U+202A to U+202E and the isolate characters. Invisible, and capable of reordering how text is displayed relative to how it is stored. Legitimate in mixed right-to-left text; suspicious in plain English prose.
Private-use area: U+E000 to U+F8FF and the supplementary private planes. These have no standard meaning by definition, so they are only ever present because something deliberately put them there.
Space homoglyphs: non-breaking, narrow no-break, thin, hair, en, em, ideographic spaces. Visible as whitespace but not the character a keyboard produces.
Why a naive "delete all invisible characters" tool corrupts text
Most tools in this category run a regular expression over the text and delete everything in the format category. That works fine on English prose and quietly destroys everything else, which is why it is worth explaining what this one does differently.
The zero-width non-joiner is not decoration in Persian. It is orthography. "میروم" needs it; without it the word is wrong. The same applies to conjunct control in Devanagari and several other Indic scripts.
The zero-width joiner is what holds a multi-person emoji together. Delete it from 👨👩👧 and you get three separate people instead of a family.
Regional flag emoji are literally built out of tag characters, from the same U+E0020 block used to hide messages. A tool that strips all tag characters turns 🏴 into a plain black flag.
Mongolian free variation selectors, Khmer inherent vowels, Hangul jamo fillers are all invisible, all load-bearing in their own scripts.
This tool checks the surrounding context for each of these before deciding. A zero-width joiner between two emoji is kept; the same character floating between two Latin letters is removed. If you want the aggressive behaviour anyway, there is a checkbox for it. It is off by default, and it is off for a reason.
Where invisible characters come from
Deliberate marking is one source, and the one people arrive here worrying about. It is not the most common one.
Copying from PDFs is a large source: PDF text extraction routinely inserts soft hyphens and zero-width spaces at line-break positions. Web pages contribute non-breaking spaces and word joiners used for typographic control. Google Docs and Notion add their own, as do most rich-text editors. Email clients add more. Translation and transliteration tools add bidi marks.
Stray invisible characters are a common and easily confirmed explanation when a document behaves strangely: a find-and-replace that will not match, a word that will not break correctly, a checker flagging text you genuinely wrote.