Build a perfectly spaced Instagram bio. Add invisible line-break separators so blank lines actually show up, control the gap between every line, and copy it in one click.
Click a symbol to insert it at the cursor in the last focused line.
Replaces your current bio lines with a starter structure.
Your Instagram bio is the first thing a potential follower reads. A well-spaced bio with clear visual hierarchy — a title on one line, a value proposition below, then a clean call-to-action — converts profile visitors into followers far more effectively than a wall of text on a single line. The problem is that Instagram deliberately collapses blank lines: any empty line you type gets stripped the moment the bio is saved, leaving everything crammed together.
This generator solves the spacing problem by inserting an invisible Unicode character — the Braille Pattern Blank (U+2800, rendered as ⠀) — on each intended blank line. Instagram does not recognise this character as whitespace, so it passes through the save process intact, creating a visually blank line that actually holds space. The tool gives you a line-by-line editor so you can write each bio section separately, choose the exact spacing between them, drop in symbols and dividers, and see the result in a live profile preview before you copy.
Bio output construction — the bioOutput computed getter assembles the final string from the lines array. It starts with lines[0].text, then for each subsequent line checks the previous line's spaceAfter value:
\n then the next line's text (lines appear directly adjacent).\n⠀ (newline + Braille blank), then \n + the next line's text. Result: one visually empty line between the two content lines.\n⠀\n⠀, giving two blank lines. The expression uses ('\n' + IB_SEP).repeat(n) to handle any count cleanly.Character counting — all characters in bioOutput are counted, including \n newlines (1 char each) and ⠀ separators (1 char each). A "1 blank line" gap therefore adds 3 characters (\n⠀\n) before the next line, and a "2 blank lines" gap adds 5 characters. The counter reflects this so you won't hit Instagram's 150-character limit by surprise.
Symbol insertion at cursor — each line input fires @focus="onLineFocus(i)", storing the index of the most recently focused input in _focused (a plain non-reactive property). When a symbol button is clicked, insertSymbol(sym) reads selectionStart from the DOM node at that index, splices the symbol into the string at that position using String.slice, then restores the cursor via $nextTick. The element must be re-focused since the click event moved focus to the symbol button.