Graffiti Generator
Make graffiti

unicode · platforms · guides

How to Make Invisible Text That Actually Works

Invisible text that works needs the right Unicode code point for each platform. Learn zero-width chars, Discord vs Instagram behavior, and what gets stripped.

Published · 1 min read

A dark abstract void with a faint letter silhouette dissolving into empty space, no readable text.

Most invisible text fails. You copy a string from a random generator, paste it into a bio or chat box, and it vanishes on refresh. Or worse, it looked blank in the composer but still ate your character limit while showing nothing useful. The gap is almost never the clipboard. It is the mismatch between the code point you copied and what the target app keeps after normalization.

Invisible text that works starts with picking the right Unicode character for the job, then confirming what survived after save. This walkthrough covers zero-width and blank code points, a six-step copy workflow, why Discord and Instagram treat them differently, how platforms strip them, and where the ethical line sits.

What counts as invisible Unicode in a paste string?

Zero-width and blank Unicode characters are assigned code points in the standard that either print no visible glyph or print an empty cell that still occupies space in the line box. The Unicode General Punctuation block (U+2000 through U+206F) holds zero-width space at U+200B, zero-width non-joiner at U+200C, zero-width joiner at U+200D, and word joiner at U+2060. Braille pattern blank lives at U+2800 in the Braille Patterns block. Hangul filler sits at U+3164 in the Hangul Compatibility Jamo block. Each is a real character your clipboard can hold even when your eyes see nothing.

The distinction that matters is width versus height. U+200B adds no box width and splits tokenization between visible words on one line. U+2800 adds a blank cell with line height, which is why five copies can read as an empty row in chat. U+3164 is a Korean compatibility filler some clients count as a lone display glyph until signup validation runs. U+2060 stops line breaks without showing a space. They are not interchangeable.

Concrete example: type the word blank and map each letter to braille blank. You get five U+2800 cells in a row. The string is not empty. A code-point inspector lists U+2800 U+2800 U+2800 U+2800 U+2800. In a permissive chat client that counts U+2800 as printable, the message can send as a blank-looking line. Map the same word to zero-width space instead and you get five U+200B code points with no glyph boxes. Same source text, different on-screen behavior.

CharacterCode pointVisible boxTypical survival
Zero-width spaceU+200BNoneCaption gaps; often dropped from handles
Zero-width non-joinerU+200CNoneScript shaping; rare in Latin bios
Word joinerU+2060NoneLong tokens that should not wrap
Braille blankU+2800Empty cell with heightBlank chat lines in permissive clients
Hangul fillerU+3164Blank glyph slotDisplay names until revalidation

Which invisible character fits which field type?

Match the code point to what the field validates, not to what looked blank in a screenshot. Chat message boxes that reject totally empty payloads often accept U+2800 because it carries a printable glyph slot. Bio captions that need hidden spacing between two visible words usually want U+200B or U+2060, not a full row of braille blanks. Searchable usernames and @mention handles strip both, so invisible Unicode is a poor fit there no matter which character you pick.

Discord sits in the chat column. A message built only from U+200B may fail send validation or collapse in the sidebar preview because zero-width code points contribute no measurable width. A line of U+2800 often passes because the client treats it as printable UTF-8. Instagram sits in the profile column. Fields that normalize input on save tend to drop format characters and zero-width code points that would break tokenization for search and mentions.

Use the Invisible Text Generator to map visible source text to each character type, preview boxed placeholders or raw code points, and copy the real string before you test a field.

How do you copy invisible text that survives saving?

Follow the six steps in order. Skipping the reopen step is how most guides lie to you.

Step 1. Open the Invisible Text Generator and choose a character type. Braille blank for blank chat rows. Zero-width space for hidden gaps between visible words. Hangul filler only when you accept that signup forms may reject it on the next login.

Step 2. Type or paste source text. Each letter becomes the selected invisible character while regular spaces stay as spaces. Toggle raw preview if you want to see U+200B or U+2800 listed on their own rows.

Step 3. Copy from the tool. Do not retype invisible characters by hand.

Step 4. Paste into the target field and save or send the way a normal user would.

Step 5. Close the view, reopen it, and inspect the stored string. Character counters that tick up on a blank-looking line usually mean the code points are still there.

Step 6. If the string reverted, switch character types before you blame the tool. A trick that works with U+2800 in chat may fail in a searchable name field that strips U+200B on write.

I've pasted braille-blank rows into Discord test channels and watched them survive while the same U+200B string never sent, which is why I always match character type to field type before I copy anything public.

How do Discord and Instagram treat invisible paste differently?

Chat clients and profile editors apply different normalization rules because they solve different problems. Discord message pipelines need to accept arbitrary UTF-8 in channel text while keeping the sidebar readable, so a lone printable blank like U+2800 can pass validation and render as an empty-looking row. Instagram bios are indexed for search and @mentions, so editors that normalize input on save tend to strip format characters and zero-width code points that would break tokenization.

On Discord, invisible text that works for empty-looking messages usually means braille blank, not a pure zero-width string. Zero-width-only messages often collapse in previews because U+200B contributes no measurable width. ZWSP still helps between two visible words when you want a hidden break on one row.

Instagram behaves like a searchable profile store, not a free-form chat buffer. Normalization on save frequently drops non-printing characters from name fields and bio counters while leaving visible words intact. A line that looked spaced in the composer can read as plain text after you refresh. Log out and back in before you trust any blank trick. Mobile paste handlers sometimes strip format characters even when a web editor would have kept them.

For strikethrough and other combining-mark tricks in plain fields, see How to Create Strikethrough Text in Notion and Slack.

Where does invisible Unicode get stripped on save?

Platforms detect invisible Unicode by running pasted strings through normalization and sanitation steps that remove format characters, control code points, and non-printing joiners before values reach search indexes or mention tables. The goal is not aesthetic. It is to stop homoglyph impersonation, duplicate accounts, broken @mentions, and bio counters inflated with code points that render as nothing.

Registration pipelines trim U+200B, U+200C, U+200D, and U+2060 from usernames and email fields because those strings must become canonical plain-text keys. Moderation tools flag high densities of format characters for the same reason zalgo text gets clipped. A hangul filler name that saved once can disappear after the client revalidates on sync.

Paste into the generator's input with raw preview enabled, or into any Unicode chart tool that lists scalar values. Stripped text shows only visible letters and ordinary spaces. Unstripped text still lists U+200B or U+2800 on their own rows. Screen readers may announce format characters by name or skip them unpredictably, which makes invisible bios rough for accessibility even when sighted users see the spacing.

What should you not use invisible text for?

Do not use invisible text to hide identity, spoof mentions, evade moderation, or inflate metrics in fields other people rely on to find you. Blank Unicode is layout glue between visible words. It is not a cloak for handles, not a way to ping someone with an unreadable label, and not a reliable method to dodge character limits on platforms that normalize on save.

Apps that normalize input on save will keep stripping non-printing characters from searchable names because lookup tables need plain text. Hangul filler display names and zero-width padded handles sit squarely in that bucket. Even when a trick works once, the next login or policy pass can wipe it without warning.

Honest limitation: if your use case requires the string to stay hidden from search, moderation, and code-point inspection, invisible Unicode will not deliver. Pick a visible style from another generator when you want flair that survives indexing, or accept a readable handle when you need people to find you.

Which invisible character should you pick for each goal?

Use this decision table before you copy anything. Wrong character type is the number one reason invisible text that works in one screenshot fails in the next app.

Your goalCharacterCode pointSkip if
Hidden gap between two visible words in a captionZero-width spaceU+200BThe field is a searchable username
Blank-looking line in Discord chatBraille blankU+2800You need the row to collapse on mobile preview
Prevent a long token from wrapping mid-wordWord joinerU+2060You are pasting inside an @mention
Empty display name trickHangul fillerU+3164You care about moderation or signup terms

Word joiner at U+2060 is underrated for keeping a long vaporwave or cursive string on one row without inserting a visible space. It is still a format character, so name fields strip it the same way they strip U+200B. Keep it for caption body text between visible words, not inside handles.

Braille blank rows also cost more toward message limits than a single U+200B gap because each U+2800 cell is its own printable code point. Five blanks is five characters on Discord's counter even though the channel looks empty. That is still lighter than a zalgo stack, but heavier than zero-width spacing between visible letters.

Common questions about invisible text that works

What is the difference between U+200B and U+2800?

U+200B is zero-width space in the Unicode General Punctuation block (U+2000 through U+206F). It adds no visible box width and only breaks word boundaries inside a line. U+2800 is braille pattern blank in the Braille Patterns block. It renders as an empty cell that still occupies line height in most fonts. Pick U+200B when visible words should stay on one row with a hidden gap between them. Pick U+2800 when you need a blank row in chat that does not collapse to zero height.

Why does braille blank work for Discord empty messages?

Discord message validators treat U+2800 as a printable character with width, so a message containing only braille blanks can pass the send check and render as an empty-looking line in the channel. A string built only from U+200B often fails that check or collapses in the sidebar preview because zero-width code points carry no glyph box. Moderators still see message metadata, so blank posts are a layout trick, not a way around rules.

Can invisible text hide your Instagram username?

No. Apps that normalize profile input on save strip non-printing characters from searchable handles because mention indexes and discovery search need plain-text tokens. U+200B or U+3164 between two visible words in a bio caption sometimes survives longer than a lone invisible character in the name field, but blank-name tricks fail once the server revalidates the string.

How do you know if invisible characters are still in pasted text?

Paste the string into an editor that lists code points, or use the raw preview mode on the Invisible Text Generator with your clipboard contents in the input box. Zero-width and format characters show up as U+200B, U+200C, U+2060, and similar entries even when the line looks empty. If the inspector shows nothing but spaces, the platform already stripped the non-printing code points on save.

Why do @mentions break when you insert zero-width spaces?

Mention parsers tokenize handles on plain ASCII boundaries. Insert U+200B or U+2060 inside a username and the platform no longer matches the string to an account ID even though it looks identical on screen. The same normalization that protects search also breaks hidden spacing tricks inside tags. Keep mentions plain and use invisible characters only outside handles.

Is using invisible Unicode against platform rules?

Most platforms allow invisible spacing in captions and chat when it does not spoof identity, bypass paywalls, or harass users with unreadable pings. Blank display names built on hangul filler U+3164 or homoglyph stacks often violate signup terms because they interfere with moderation and lookup. Treat invisible text as layout glue between visible words, not as a cloak for handles people are meant to search.

What to read next if blank Unicode keeps failing on save

About the author

Written by Alex Morgan, a front-end engineer specializing in Unicode text tools since 2019. Last updated: .

About Graffiti Generator