Can you send a blank message or an empty text message?
Yes, by sending one invisible character rather than nothing at all. No messaging app accepts a body of zero length, so a blank message is never actually empty.
The message contains a real character that renders as nothing. It satisfies the length check the client runs before enabling the send button, and it displays as blank in the conversation, in the notification and in the chat list preview.
Why the send button stays greyed out
The client trimmed your input and measured a length of zero. The send button is disabled by a check that runs on your device as you type, before any request reaches the server.
The client checks the body before the server does
A messaging client typically evaluates body.trim().length > 0 on every keystroke and enables the send button only when the result is true. Anythingtrim() removes is invisible to that check.
trim() removes every character whose Unicode propertyWhite_Space is Yes. That includes all 17 Space Separator characters — the plain space U+0020, the Em Space U+2003, and the No-Break Space U+00A0 among them. Pressing the spacebar twelve times leaves a trimmed length of zero and a disabled button.
Characters in General Category Cf, Lo and So haveWhite_Space=No. trim() does not touch them, so the trimmed length is greater than zero and the button enables.
The three checks a message body passes
A message crosses three separate gates, and an invisible character can fail any one of them while passing the others.
The trimmed-length check runs in the composer and decides whether the send button activates. It removes White_Space=Yes characters first, so every space variant fails here.
The rendered-width check runs in a minority of clients and measures how wide the text draws rather than how many characters it holds. U+200B Zero-Width Space fails this one, because its width is zero. U+2800 and U+3164 pass, because both draw at a fixed non-zero width.
The server-side check runs after send and can reject a message the client accepted. A message that appears to send and then vanishes from the conversation failed here. Switching from a Zs character to a So character clears it.
A character passing all three is what "reliable" means for a blank message. U+2800 passes all three on every app covered here.
Which character to use, and which to avoid
Use U+2800 Braille Pattern Blank. It hasWhite_Space=No, so no client trims it, and it has a fixed non-zero width, so no client measures it as empty. NFKC leaves it unchanged, so it survives normalization intact.
U+3164 Hangul Filler is the second choice and behaves the same way in a message body. U+200B Zero-Width Space works on Discord and Telegram, though clients that measure rendered width rather than string length reject it, because its width is zero.
Do not use a no-break space
U+00A0 No-Break Space is the character most often recommended for blank messages, and it is among the worst choices. Its White_Space value is Yes, sotrim() removes it exactly as it removes a plain space. NFKC folds it to U+0020.
The name causes the confusion. Non-breaking describes line wrapping — the character prevents a line break at that point. It says nothing about trimming, and every trimming function treats U+00A0 as whitespace. Verify this and the other 28 characters on the Unicode invisible characters table.
Choose your app
Pick your app below — each one runs a different send-button check. Each guide covers one app: the character it accepts, how its send-button check behaves, and the exact steps on mobile and desktop.