Can you hide a message in plain sight? In an emoji? Inside a picture? Try it, reveal the trick, and discover why different kinds of secrets need different ways of finding them.
Start anywhere, or follow all three stops. Each experiment gets its own little guide. Prefer to explore? All the toys are below.
Use Reveal hidden characters in the sentence above. The visible sentence stays familiar, but extra characters carry a message.
Try the hidden sentenceNotice: looking at the sentence and inspecting its characters give different answers.
In What a scraper reads, choose White on white, then compare the rendered page with the extracted text.
Try the disappearing wordsNotice: ordinary text can be hidden by rendering rules. A character scan alone cannot explain what the viewer sees.
Choose Hide it in the pixels, inspect the amplified difference, then choose Read it back.
Hide a secret in a pictureNotice: the message lives in pixels, so a text inspector has no payload to examine.
Ready to apply the idea? Try the detector challenge, or explore any layer below.
Four ways to feel the technique instead of reading about it: a guessing game you cannot win by looking, the model’s side of a prompt injection, a survivability test you run through your own apps, and a leak tracer.
Everything above hides data in characters. These five hide it somewhere else entirely — in the order characters display, in what a renderer chooses not to show, in what your clipboard receives, in what a string becomes after it is normalised, and in the low bit of an image. Same shape of failure every time: two readers of one artefact disagree, and only one of them is you.
Back to the ghost tour · Detector challenge
textContent, or a scraper reading the DOM, gets every word of it. This is how prompt injection actually arrives on the open web.echo "Boo! Just passing through."
Back to the ghost tour · Detector challenge
Hide a message to reveal its pixel footprints. Black means unchanged; coloured squares show changed channels. The zoom shows the top-left corner, where the message starts.
Six short scenarios. Choose the inspection suited to each example, then read why. These are teaching cases, not guarantees about every detector implementation.
7 October 2026 · Related technology
Google announced global access in English to its SynthID Detector for images, video, and audio, including watermarks from participating providers. It offers a real-world example of the lesson behind the image-pixel demonstration: an invisible signal needs a detector designed for that signal.
Ghost Ink carries a message in image low bits; SynthID embeds watermarks to help identify AI-generated or edited media. Ghost Ink’s Unicode inspector and image decoder do not detect, remove, or test SynthID watermarks.
What about text? SynthID’s separate text-watermarking method adjusts token probabilities during generation. It does not depend on inserting invisible Unicode characters. The October announcement concerns the public detector for images, video, and audio.
Primary sources: Google’s announcement · How SynthID works. Reporting: Ars Technica. These links open external sites; the demonstration runs locally.
Compare the inspection each trick needs. The Inspect & clean panel can expose unusual characters; tricks in CSS, clipboard transfers, and image pixels need other checks.
Survivability is a general expectation, not a measurement. The survivability lab is there so you can measure the paths you actually care about instead of trusting this column.
Unicode reserves a block called Tags from U+E0000 to U+E007F. Almost all of it mirrors plain ASCII: U+E0041 stands in for “A”, U+E0061 for “a”, U+E0020 for a space. The characters exist in the text and travel with it, but fonts render them to nothing, so a person sees only the cover text.
This is not a party trick. The exact carrier this page demonstrates — the Unicode Tags block — is a live technique known as ASCII smuggling. It has had two lives, and a user’s suspicions are never raised in either one.
Malicious instructions are written in invisible tags and pasted into an email, a web page, or a document an LLM will process. The model reads the hidden commands as ordinary text; the human reviewing the same content sees nothing. This is a stealthy form of prompt injection, and it’s where the technique first drew attention.
Spammers slip invisible tags inside trigger words so a filter no longer recognizes them, while the recipient reads the word normally. Same mechanism, inverted goal: instead of adding a hidden instruction, they’re hiding a visible keyword from the machine that scores it.
In early 2026, Microsoft watched the second use explode. Hits on its ASCII-smuggling hunting signature in Microsoft Defender for Office 365 rose from roughly 21,000 on Sunday 8 February 2026 to more than 1.3 million the next day, and to more than 2.3 million on 11 February. The campaign then held a strict weekly cadence — heavy on weekdays, collapsing to near zero on Sundays — and reached its peak of 2.37 million messages on 26 February 2026. Elevated volumes persisted for about three months before dropping sharply after 15 May. The bulk of it was finance-themed spam: fake pre-approvals for credit lines and “bridge funding.”
One figure from the same research is worth more than the spike: Microsoft reports that over 99% of these messages were caught anyway — by sender, IP, URL and domain reputation, ML classification, brand-impersonation checks and authentication, not by noticing the invisible characters. The Unicode trick defeated one layer, and the other layers held. That is the shape of a working defence, and it is the argument this whole page is making.
The email angle is subtler than plain hiding, and it is aimed squarely at machine-learning classifiers. A word like funding is a clean, familiar unit to a model’s tokenizer. Slip an invisible U+E0020 into the middle and the tokenizer may split it into fun and ding, or emit rare tokens the model has never weighted — while the recipient still reads “funding.” The lure survives; the filter’s view of it does not. Want to see it? Load the spam lure in the Inspect & clean panel above and X-ray it.
The property that makes tag characters useful for smuggling instructions into a model is the same property that makes them useful for hiding a keyword from a filter: they are invisible to a person and present to everything that processes text. The intent is inverted; the mechanism is not. — the mechanism in summary. Not a quotation; see REFERENCES for the sources.
Camouflaging trigger words isn’t new — spammers have leaned on zero-width and non-breaking spaces for decades to break literal-string matches. What’s new is the target. The bigger prize is no longer defeating a keyword search; it’s defeating the ML- and NLP-based models that now drive spam and phishing classification. Unless a filter renders the message to an image and runs OCR over it, the invisible tags can quietly change what the model “reads.”
All telemetry figures are taken from the primary source: “ASCII smuggling crosses over from AI prompt injection to phishing evasion,” Microsoft Security Blog, 3 September 2026. Secondary reporting: Dan Goodin, “Once popular for attacking AI, ASCII smuggling is embraced by spammers,” Ars Technica, 4 September 2026. This page is an independent educational demo and is not affiliated with either.
The Inspect panel above is a friendly version of checks that already ship in tools you probably use every day. Trojan Source is why most of them exist.
editor.unicodeHighlight.* (invisibleCharacters, ambiguousCharacters, nonBasicASCII). The closest productised sibling to this page’s detector.xn-- form the browser would fall back to.These defences act at different layers: editors expose suspicious characters, compilers diagnose source, browsers choose how to display addresses, and mail systems classify messages. The Inspect panel illustrates one part of that defence: making hidden characters visible for review.
This exhibit includes character, rendering, interaction, transformation, and image-pixel demonstrations. The comparison table records which inspections catch each one. These neighbouring techniques remain outside its implemented scope:
Real primitives, no simulated math. Crypto via WebCrypto SubtleCrypto. Everything runs client-side.