LinkedIn Post Formatter – Draft, Count and See the Fold
A feed post is written in a box that shows you everything and published into a card that shows almost nothing. Somewhere in the first line or two the text stops and a …see more link takes over. This LinkedIn post formatter rebuilds your draft, counts it the way a reader counts it, and draws a neutral feed card with a rule across the body marking exactly where the cut falls. Everything happens in your browser — nothing is uploaded and no network request is made.
Where the cut falls, and why it moves
The fold is not a fixed number of characters. It is whatever fits in the space the app gives a post before collapsing it, so it shifts with viewport width, font size, accessibility settings, language and whichever build of the interface a reader is served. That is why there are two thresholds rather than one — a narrow default of 140 and a wide default of 210 — and why both are editable. The Mobile / Desktop toggle switches between them and re-renders the card at a matching column width, because wrapping changes what fits. The text that survives the cut is printed underneath as a copyable string with its own count.
The character limit is reported, not published
The familiar 3,000-character post limit is widely repeated and not documented to us, so the limit here is an editable input rather than a constant hidden inside the arithmetic. Each default carries the date it was last checked, and every figure on the page follows whatever you type. Going over produces a neutral note that you are over your own limit by so many characters — never a claim about what the platform will accept.
Counting the way a reader counts
A family emoji is eight UTF-16 code units, a flag is four, and é written as e plus a combining accent is two. Counting with String.length would disagree with the person reading the post, so every character figure here is a count of grapheme clusters, measured with Intl.Segmenter on a locale pinned to English so the same text can never count differently on two machines. The UTF-16 number is shown beside it, clearly labelled, because that is what many input fields actually cap on. Neither is presented as "the" count, and nothing is ever cut mid-emoji, mid-accent or mid-URL: when the threshold lands inside a web address the preview snaps back to the start of that address and says so.
Line breaks, bullets and hashtags
The composer offers no bold, no italic and no list markup at all, so a bullet is simply a bullet character typed into the text. The inserter drops •, ▸ and → at the cursor as plain characters that cost exactly what they look like. Carriage returns are normalised, trailing spaces are flagged per line — invisible, but they still count and still shift the fold — and hashtags can be gathered into a trailing block, in order and deduplicated. The inventory reports how many hashtags, mentions, links and emoji the post contains. It reports; it does not advise, and it offers no score.
Mentions, links and stylised text
An @mention pasted as text stays plain text: the composer only links one chosen from its own autocomplete. Every address in the preview is checked against an http/https allow-list before it is rendered as a link, and anything else is drawn as inert text. The optional stylised-text pass — the Unicode symbols people use to fake bold — defaults to off and carries a permanent warning when on, because screen readers cannot read those symbols and search will not match them. Hashtags, mentions and links are always excluded from it, since styling them stops them working.