See what's hiding in your text
Invisible characters embedded in text survive copy and paste but never show up on screen. This finds them and takes them out, entirely on your machine, with no key and no upload.
Source
Cleaned
Reveal
Every hidden character, materialized where it sits. Hover for details.
Findings
| Codepoint | Name | Kind | Count | Kept | Offsets |
|---|
Some models bias their own token sampling with a secret key, so the watermark is the word choices, so there is nothing to delete. A second model rewrites the prose from its own distribution, and the original pattern does not carry over.
Your text
Rewritten
Result
Prompt
Byte-for-byte what would be sent. Nothing else is added.
What gets found
Each button loads real text into the Strip tab. Nothing is simulated.
Two different problems
Layer A, invisible characters. Zero-width spaces, joiners, bidi controls, variation selectors and Unicode tag characters can be embedded in text without showing on screen. Tag characters can carry a whole hidden string. Removing them is deterministic and lossless: they are either present or they are not, and you can verify the result by running the scan again. This runs in your browser, in JavaScript, with no key.
Layer B, statistical watermarks. A model can bias its own token sampling with a secret key. Kirchenbauer's KGW scheme hashes preceding tokens to split the vocabulary into a green list and a red list, then nudges green tokens upward. Google's SynthID-Text runs a tournament between candidates instead. Either way the mark is the word choices, so there is nothing to delete. A second model rewriting the prose samples from its own distribution and does not reproduce the first model's pattern.
What this does not do
- Layer B is not a guarantee. It displaces a token-level watermark; it does not prove absence. It is weaker against paragraph-level schemes such as SemStamp and PostMark than against the token-level ones currently deployed. Nothing here makes text “undetectable”.
- Rewriting costs quality. If you would rewrite with a cheaper model anyway, generating with that model directly is simpler. Layer B is useful when you wanted a stronger model's reasoning and will spend a paraphrase pass on hygiene.
- Use a different vendor. Rewriting Claude output with Claude, or Gemini output with Gemini, can re-apply the same mark.
- This page is text only. Files, image metadata, C2PA manifests and PDFs need the local tool.
Where your data goes
Layer A never leaves your browser. Layer B sends your text to whichever provider you choose, using your key, directly. This site has no backend to route it through. The opt-in in-browser model sends nothing anywhere, but downloads model weights from a CDN on first use.
Providers
A browser can only call providers that permit cross-origin requests. These were verified by preflight; the ones that block browsers still work in the local app, where a Python process makes the call and CORS never applies.
| Provider | From this page | Notes |
|---|
The full toolkit
This page is the text half. The local tool also strips C2PA manifests, EXIF, XMP and document properties from PNG, JPEG, WebP, SVG, PDF, DOCX, ODT, HTML and Markdown, and ships a CLI, an HTTP service and an agent skill. Source and install instructions.