Skip to content
Ghostchars

About Ghostchars

A small, free tool that finds hidden characters, refuses to guess who wrote your text, and shows its working.

What it is

Ghostchars reveals and removes hidden Unicode characters in text and in documents. It began as a single Python file with no dependencies, written to answer a specific question — what exactly is in this string that I cannot see — and it stayed that way. The website is the same engine compiled for the browser, with a page around it.

There is no account, no upload, no queue and no API key. You paste text, you see what is in it, and you decide what to remove.

Why it exists

Search for a way to find invisible characters and you land on tools that promise to detect AI watermarks and hand you a confidence percentage. The percentage is not measuring anything: no character in a text can tell you who wrote it, and the tools that say otherwise are usually reporting a fixed number.

The honest version of the product is narrower and more useful. Hidden characters are real, they cause real problems — broken search, failed comparisons, invisible instructions aimed at language models — and they can be found exactly, with no guessing at all. That is what this does. Where a character is ambiguous, the page says so; where a claim cannot be supported, it is not made.

How Ghostchars decides what to strip

The rules it is built to

Nothing is uploaded

The site is a set of static files and the engine runs on your device. There is no server-side processing, so there is nothing for anyone to log, keep or leak.

Nothing is claimed that cannot be shown

No AI detection, no probabilities, no "removes AI watermarks". The page that says what the tool cannot do ships alongside the one that says what it can.

Every decision is visible

Each finding carries its line, column, codepoint, Unicode name, category and what happened to it — removed, replaced, kept because it is load-bearing, or found but not targeted. Nothing is changed silently.

The browser and the CLI agree

Golden fixtures generated from the Python implementation pin the browser engine to it. If the two ever disagree on any fixture, the build fails.

Open source

The engine, the tests and this website are open source under the MIT licence. The command-line tool is one file with no dependencies beyond the Python standard library, and it has a `--check` mode that exits non-zero when a file contains something hidden, which makes it usable as a pre-commit hook or a CI step.

./strip_invisible.py --show draft.md
./strip_invisible.py --check *.md

Privacy

Nothing you paste or upload is transmitted anywhere, because there is nowhere to transmit it to. Analytics are optional, consent-gated, EU-hosted and proxied through this domain, and no event ever carries text content — only counts and which options were on. If you say no, nothing is loaded at all.

Read the privacy policy

Contact and corrections

If a page here is wrong about a codepoint, a script or a technique, that is worth fixing — corrections, bug reports and additions to the character index are taken as issues against the source repository, and are corrected.