Keep blank lines and indents in your social posts
This generator swaps the blank lines, the indents at the start of a line and the runs of extra spaces in your post for characters that whitespace cleanup does not delete. With the default settings, every blank line gets one Braille blank (U+2800), and every two spaces of indentation or extra spacing become one Braille blank. A Braille blank looks empty on screen, but Unicode does not class it as a whitespace character, so it has a good chance of surviving when an app strips spaces.
Paste your text into the box above and the post preview on the right updates right away. Press Pasted as is above the preview to see the lines that disappear when you paste the original into an app that cleans up whitespace, then press Pasted after converting to see them come back. Hidden characters you added are hatched, and the bars below show how much of the Instagram, Threads, X and TikTok character limits they use. If you only need a single blank character, tap it in the space character shelf at the bottom to copy it.
Why blank lines vanish and when you need this
Many apps tidy whitespace before they save or show a post. The default web rules (CSS) collapse only the regular space (U+0020), the tab and line breaks, and leave other spaces such as the no-break space and the ideographic space alone. A function like JavaScript's trim, on the other hand, also removes Unicode space separators (Zs) such as the no-break space and the ideographic space from both ends of a line. Trimming line edges wipes out indents, and in apps that also delete blank lines, a line with nothing on it or with only spaces disappears too.
So a blank line needs one character that is not whitespace if the line is to stay. These are the usual situations:
- Paragraph breaks in captions: photo captions, reviews and announcements read better with an empty line between paragraphs.
- Bio layout: keep the indent when you want a bio to start a little in from the edge or sit roughly in the middle.
- Indented lists: packing lists, steps and menus with sub-items that should not collapse into one flat line.
- Hashtags set apart: leave several empty lines between your text and a block of hashtags so only the text shows first.
- A single blank character: for a display name, a bullet or a name field that needs one invisible character, copy it from the space character shelf.
How to use it
- Paste the post you want to publish into the text box. Leave blank lines, indents and extra spaces as you normally type them.
- Pick what to convert in the settings table. In the Blank lines row, choose whether to keep them and which character to use; in the Spacing row, choose whether to keep indents and multiple spaces and which spacing character to use. Everything starts on, with the Braille blank.
- Switch between Pasted as is and Pasted after converting in the preview and check that the lines which used to vanish now stay. If you pick a spacing character that counts as whitespace, a warning tells you how many lines could be cleaned up.
- Look at the character bars to make sure you stay under the limit of the place you are posting to. When you go over, the bar and the number change color.
- Press Copy result, paste it into the app, and check that app's own preview once more before you post.
What gets replaced
Conversion works line by line. Spacing is measured in columns: one whitespace character such as a regular space or a no-break space is 1 column, one ideographic space is 2 columns and one tab is 4 columns. This tool counts one Braille blank or one ideographic space as 2 columns and one no-break space as 1 column. Real widths depend on the font; the space character box shows the width measured on your screen.
| What | How it is detected | How it is replaced | Example |
|---|---|---|---|
| Blank line | An empty line or one with only whitespace | A line holding a single blank-line character | empty line → ⠀ |
| Indent at the start of a line | Spacing columns at the very start of a line | Columns ÷ 2 (rounded up) Braille blanks | 4 spaces → ⠀⠀ |
| Multiple spaces inside a line | 2 or more spaces between words | (columns − 1) ÷ 2 (rounded up) Braille blanks + 1 regular space | 4 spaces → ⠀⠀␣ |
| Trailing spaces | Spaces after the last character of a line | Removed | Tidies an invisible tail |
| Blank lines at the very start or end | The start and end of the whole text | Dropped | Cleans up lines that came along when you copied |
| Already converted spacing | Spacing made only of the chosen character | Left as is | Converting twice gives the same result |
The last gap in a run of spaces stays a regular space because of hashtags and mentions. TikTok's developer documentation says hashtags (#) and mentions (@) in a caption are separated by spaces or line breaks. If the two spaces between '#fall' and '#hiking' were both hidden characters, the tags could read as one block, so a regular space follows the hidden characters. With the no-break space (U+00A0) as your spacing character, n spaces of indentation become n no-break spaces, and n spaces in the middle of a line become n − 1 no-break spaces plus one regular space; with the ideographic space, two columns count as one character, just like the Braille blank.
Ten space characters compared
The table lists the ten characters in the space character shelf, using Unicode 18.0 character data. Whitespace means the character has the Unicode White_Space property. Default ignorable means it has the Default_Ignorable_Code_Point property, which tells software to skip drawing the character when it does not support it. Widths come from the Unicode character list; the real width depends on the font.
| Character | Code | Category | Whitespace | Default ignorable | X count | Width (character list note) |
|---|---|---|---|---|---|---|
| Braille blank | U+2800 | Symbol (So) | No | No | 2 | Drawn as a fixed-width blank in many fonts, does not act as a space |
| Hangul filler | U+3164 | Letter (Lo) | No | Yes | 2 | Depends on the font (usually a wide blank in Korean fonts) |
| Zero-width space | U+200B | Format (Cf) | No | Yes | 1 | No width, a marker for line-break opportunities |
| No-break space | U+00A0 | Space (Zs) | Yes | No | 1 | Same width as a regular space |
| Ideographic space | U+3000 | Space (Zs) | Yes | No | 2 | Width of one CJK character (wide space) |
| Em space | U+2003 | Space (Zs) | Yes | No | 1 | Same as the font size (1 em) |
| En space | U+2002 | Space (Zs) | Yes | No | 1 | Half an em |
| Figure space | U+2007 | Space (Zs) | Yes | No | 1 | Same width as the digit 0 |
| Thin space | U+2009 | Space (Zs) | Yes | No | 1 | 1/5 to 1/6 em |
| Hair space | U+200A | Space (Zs) | Yes | No | 1 | 1/10 to 1/16 em |
In the table, only the Braille blank is neither a whitespace character nor default ignorable. That is why the tool uses it as the default for blank lines and spacing. An older approach alternated the no-break space, the en space and the hair space; those three have different widths, so the gaps came out uneven, and since all three are whitespace characters they get stripped together by line-edge cleanup.
Which characters survive each kind of cleanup
Most apps do not publish how they clean up whitespace. The common rules, though, are written down in standards, so you can tell in advance which characters survive which cleanup.
| Cleanup | What it removes or collapses | What survives (of the ten in the shelf) |
|---|---|---|
| Whitespace collapsing on screen (CSS) | Only the regular space (U+0020), the tab and line breaks, folded into one | All ten |
| Trimming line edges (JavaScript trim) | Unicode whitespace characters (all of Zs), tabs and the BOM | Braille blank, Hangul filler, zero-width space |
| Whitespace test (Java isWhitespace) | Whitespace characters, except the no-break spaces (U+00A0, U+2007, U+202F) | Braille blank, Hangul filler, zero-width space, no-break space, figure space |
| Filtering hidden characters | Default ignorable characters (U+200B, U+3164 and others) | The Braille blank and the whitespace characters |
Even "strip the spaces" does not mean the same thing everywhere. JavaScript treats the no-break space as whitespace, while Java's Character.isWhitespace leaves it out. Text indented with no-break spaces can therefore survive in one app and vanish in another. The Pasted as is and Pasted after converting previews assume the strictest case: an app that removes whitespace at both ends of each line, collapses repeated spaces into one and deletes empty lines.
Character limits and hidden characters
Hidden characters count toward the limit. The table shows the limits and counting rules in each platform's public developer documentation. Instagram's documentation does not name a unit, so this tool counts Unicode characters (code points).
| Where | Limit | How it counts | One Braille blank |
|---|---|---|---|
| Instagram caption | 2,200 | Up to 2,200 characters, 30 hashtags, 20 @ tags (unit not stated) | 1 |
| Threads post | 500 | 500 characters, emoji counted as UTF-8 bytes | 1 |
| X post | 280 | Code points 0–4351, 8192–8205, 8208–8223 and 8242–8247 count 1, all others count 2, emoji 2, links 23 | 2 |
| TikTok caption | 2,200 | UTF-16 units | 1 |
For the same reason CJK characters count as 2 on X, the Braille blank (U+2800 = 10240) counts as 2. The zero-width space (U+200B = 8203) falls in the range 8192–8205, so it counts 1, and the no-break space (U+00A0 = 160) also counts 1. Converting the default example "Weekend hike" adds 8 hidden characters; on Instagram the total stays at 129, because the spaces that were replaced make up for the new blank-line characters, while on X the count goes from 129 to 137.
Example: a weekend hike post
This is the first example loaded in the workspace, converted with the default settings. Each hatched cell is one Braille blank and ␣ is a regular space. The "Pasted as is" column imitates an app that trims line edges, collapses repeated spaces and deletes blank lines.
| Line | Original | Converted | Pasted as is |
|---|---|---|---|
| 1 | Saturday hike log | Unchanged | Unchanged |
| 2–3 | 2 blank lines | 2 lines of ⠀ | Gone |
| 4 | Went a little farther than planned. | Unchanged | Unchanged |
| 5 | ␣␣· Steps 14,200 | ⠀· Steps 14,200 | Indent gone |
| 6 | ␣␣· Time 2h 10m | ⠀· Time 2h 10m | Indent gone |
| 7 | blank line | ⠀ | Gone |
| 8 | The air felt␣␣␣␣perfect. #fall␣␣#hiking | The air felt⠀⠀␣perfect. #fall⠀␣#hiking | One space each |
Pasted as is, the 8 lines shrink to 5 and the list indent disappears; the converted text keeps all 8 lines and the indent. If you switch the spacing character to the no-break space, the indents on lines 5 and 6 and the gaps on line 8 become whitespace characters again, so the same cleanup would erase them.
Common mistakes
- Filling a blank line with regular spaces only: a line you padded with the space bar is a whitespace-only line, so cleanup removes it just like an empty one.
- Indenting with no-break spaces: it looks the closest to the original, but it is still whitespace and can be stripped at the start of a line. If the warning appears, switch to the Braille blank.
- Filling the space between hashtags with hidden characters: with nothing to separate them, two tags can run together. This tool keeps the last gap as a regular space.
- Leaving a blank line at the end of the post: a hidden character on the last line leaves an invisible tail. This tool drops blank lines at the start and the end.
- Editing converted text and posting it as is: a blank line you add inside the app is an ordinary blank line again. Put the edited text back in the text box and convert it again.
- Checking the X limit with Instagram's rules: X counts CJK characters and the Braille blank as 2. Check the X row of the character bars separately.
Limits
- How apps clean up whitespace is not public and can change with updates. The preview is a model of the strictest case and does not reproduce any particular app's screen.
- The widths of the Braille blank and the Hangul filler are decided by the font. The widths in the space character shelf are measured with the font on your screen, so they can differ on another device.
- The Braille blank is a Braille symbol in Unicode. A screen reader may read its name aloud and search may treat it as a letter, so avoid sprinkling it all through a long text.
- Some services block names or posts made of invisible characters. Check the service's rules before you use a character from the shelf as a name.
- The character limits come from public developer documentation checked on October 21, 2026. An app's on-screen limit can differ from the documentation, and Instagram's documentation does not state the counting unit.
- This tool treats only addresses that start with http:// or https:// as links and counts each as 23 on X. On X, a bare domain such as roberin.com may also turn into a link and count as 23.
Sources
Basis: character properties come from Unicode 18.0 character data, whitespace cleanup rules from the ECMAScript, CSS Text 3 and Java SE 21 documents, and character limits from each platform's developer documentation, all checked on October 21, 2026.
- 01Unicode 18.0 — PropList.txtWhite_Space property: U+0020, U+00A0, U+2000–200A, U+3000 and others; U+200B, U+2800 and U+3164 are not included
- 02Unicode 18.0 — DerivedCoreProperties.txtDefault_Ignorable_Code_Point: includes U+200B and U+3164, not U+2800
- 03Unicode 18.0 — NamesList.txtU+2800 is "imaged as a fixed-width blank in many fonts, it does not act as a space"; width notes for U+00A0, U+2002, U+2009 and U+200A
- 04Unicode Standard Annex #44 — Unicode Character DatabaseDefault ignorable code points: ranges that software skips drawing when it does not support them
- 05ECMAScript Language Specification — White SpaceWhiteSpace = TAB, VT, FF, ZWNBSP and all of Zs; the range String.prototype.trim removes
- 06CSS Text Module Level 3 — 4.1 White Space Processing RulesWhite space processing applies only to U+0020, U+0009 and segment breaks
- 07Java SE 21 — Character.isWhitespaceAmong space characters, U+00A0, U+2007 and U+202F are not treated as whitespace
- 08Meta — Instagram Graph API, IG User Mediacaption: up to 2,200 characters, 30 hashtags, 20 @ tags
- 09Meta — Threads API, PostsText posts up to 500 characters, emoji counted as UTF-8 bytes
- 10X — Counting characters280 characters, emoji 2, links 23, CJK characters 2
- 11twitter-text — config/v3.jsonWeight 1 for ranges 0–4351, 8192–8205, 8208–8223 and 8242–8247; 2 for everything else
- 12TikTok — Content Posting API, Direct Posttitle (caption) up to 2,200 UTF-16 units; hashtags and mentions are split by spaces or line breaks
Frequently asked questions
Why do blank lines disappear when I post on Instagram?
Many apps trim spaces at the start and end of each line and collapse repeated spaces into one when they save or show a post. A line with nothing or only spaces counts as empty in that cleanup and can vanish. If you put a Braille blank (U+2800), which is not a whitespace character, on the line, it becomes a line with a character on it and has a good chance of staying. Apps do not publish how they really process text, so check the preview before posting.
What is the difference between the Braille blank (U+2800) and the Hangul filler (U+3164)?
The Braille blank is classed as a symbol (So) and is neither a whitespace character nor default ignorable. The Unicode character list says many fonts draw it as a fixed-width blank but it does not act as a space. The Hangul filler is classed as a letter (Lo) but is default ignorable, so services that filter invisible characters may delete or block it.
Why does the tool warn me when I choose the no-break space?
The no-break space (U+00A0) is as wide as a regular space, so it looks closest, but it has the Unicode White_Space property. A cleanup that trims line edges, such as JavaScript's trim, wipes out the indent, and a cleanup that collapses repeated spaces turns a run into one space. The warning tells you about that risk, and one tap switches back to the Braille blank.
Do hidden characters add to my character count?
They can. Each blank line adds one character, while an indent shrinks because two spaces become one Braille blank. X weights each character, so U+2800, U+3164 and U+3000 count as 2 and U+200B and U+00A0 as 1. The hatched part of the character bars is the share used by the hidden characters you added.
What happens to the spaces between hashtags?
When a run of spaces is converted, the last gap stays a regular space. For example, the two spaces between '#fall' and '#hiking' become one Braille blank and one regular space. Hashtags and mentions are separated by spaces or line breaks, so replacing every space with hidden characters could glue two tags together.
How do I copy just one invisible character?
Tap the character you want in the space character shelf under the workspace and that one character is copied. Each cell shows its width in your screen's font, whether whitespace cleanup keeps it, whether hidden-character filters target it and how many characters X counts. Some services block empty names, so check their rules first.
Is it safe to paste text that is already converted?
Yes. Spacing made only of the chosen character, and characters such as the Braille blank, are not converted again, so two conversions with the same settings give the same result. If you add new blank lines or spaces while editing converted text, only those parts change.
Where is my text stored?
Nowhere. Conversion and character counting happen inside this browser, and your text is not sent to a server or kept in the address or in storage. The Paste button reads the clipboard only when the browser allows it.