Twitter Thread Splitter – Break Long Text Into Numbered Posts
A thread splitter turns one long piece of writing into a sequence of posts that each fit a per-post character limit. Cutting text every N characters is a two-line loop, and it is wrong in several ways at once: it slices words in half, tears links apart, breaks emoji into replacement glyphs, and forgets that the 1/12 counter you bolt on afterwards is itself part of the post. This tool exists to get those details right, entirely inside your browser.
Characters mean what a reader sees
Ask JavaScript for the length of 😀 and it says two. Ask for the family emoji 👨👩👧👦 and it says eleven, because that single glyph is four people joined by invisible zero-width joiners. An é typed as e plus a combining accent counts as two. All of those are one character to a reader, and splitting inside any of them produces mojibake rather than text.
This tool counts grapheme clusters using Intl.Segmenter, so the number it shows is the number of characters a person would count by eye, and every split point sits on a cluster boundary. That is why the count here can disagree with a plain text editor — the disagreement is the whole point. Segmentation is also pinned to a single locale, so the same text always produces the same thread on every machine.
Where the splits land
Each post is filled to the budget and then the splitter walks backwards to the best boundary it can find, in a fixed order of preference:
- Manual — a line containing only
---, which forces a break and is removed from the output. - Paragraph — a blank line.
- Sentence — a real sentence end, not merely a full stop.
- Line — a single newline.
- Word — a genuine word gap.
Links are treated as single unbreakable tokens, so a URL always lands whole inside one post. The label under each card names which of these rules applied, which makes it obvious when a small edit to your source text would give you a tidier break.
The numbering problem
Adding 1/9 to a post costs three characters. Adding 10/12 costs five. The width of the counter depends on how many posts there are, and how many posts there are depends on how much room the counter leaves — a genuine circular dependency. Splitting first and numbering afterwards is the classic bug: a thread that fits in nine posts grows to ten once the counter widens, and some posts quietly end up over the limit.
This splitter resolves that loop before it cuts anything, repeatedly re-splitting until the post count stops changing and sizing every post against the widest counter the thread will use. Afterwards it re-measures every finished post against the limit and flags anything that still does not fit, rather than handing you an invalid thread.
Counting links
Some platforms bill every link at a fixed length no matter how long the address really is. You can switch that behaviour on and set the number yourself, and the readout then shows both figures so you can see the substitution working. The limit and the per-link figure are both editable fields rather than baked-in constants, because these numbers are set by the platform, differ between account tiers, and have changed before.
What it does not do
The splitter leaves your words alone. It does not reformat, reflow, suggest hashtags, add mentions, schedule anything, or connect to an account, and it makes no network requests of any kind — detected links are used only for counting and for keeping a split away from them. The only changes it makes are trimming whitespace at a split boundary and applying the numbering you chose.
For that reason it also takes no view on how long a post ought to be. No trustworthy source establishes what length performs best, so the tool reports what fits inside the limit and leaves the judgement to you.