The same post is cut in three different places on X

Brandon MarshallOctober 14, 2026
Postcheck: see your post exactly as X will show it. A phone preview of a post next to the headline.

I obsess over the details of a post. Where the hook lands, whether the spacing holds, which line gets cut. How a post looks when you say it is part of what you said.

None of that is visible in the composer, because the composer is not the screen anyone will read the post on. So we built Postcheck, which draws your post the way X draws it, on the web and on a phone, and shows you where the text will be cut. It is free, it runs in your browser, and it is open source under MIT.

Every rule below is one Postcheck applies, and every one of them came off a real post rather than a changelog.

One post, three cuts

A long post on x.com is cut at 280 characters, at the last word boundary that fits. A word ending exactly on 280 survives; a word straddling it is dropped, and so is an emoji straddling it. What is left gets an inline blue "Show more" that expands the text in place, in the timeline, with no page to navigate to and no way back.

The iPhone app does not count characters at all. It folds the body after nine rendered lines — exactly nine stays whole, ten folds after line nine — so the cut lands wherever your ninth line happens to end on that screen width. A 240-character post with short lines can be folded on an iPhone while sitting whole on the web.

The Android app does neither. It cuts at 280, to the same character as x.com, and shows a post of any length below that whole, however many lines it runs.

So the honest answer to "where does my post get cut" is three answers, and two of them depend on a screen you are not looking at.

The fold takes one more character than it needs

The iPhone's fold has a detail nobody would guess. When it folds a line, it drops at least one character even when the whole line would have fitted beside the token. A line reading "nine" comes back as "nin Show more". A line holding a single "a" comes back as just " Show more".

That is measured, on four posts written to test exactly that, captured off a real iPhone.

What a character costs

The 280 budget is not characters as you count them.

  • Every URL costs 23, whatever its length, because X rewrites all of them to t.co.
  • Every emoji costs 2, however many code points it is made of. The family emoji is eleven code points and costs 2.
  • Latin letters, digits and basic punctuation cost 1. Everything outside that, including CJK and accented characters, costs 2 — which makes 140 Japanese characters a full post.

A link, three emoji and an em dash can quietly spend fifty of your characters.

Bold and italic move the breaks, and the apps pretend they are not there

X's text styling posts only from a Premium account. Styled words cost no extra characters, so the counter does not move. Bold glyphs are wider than plain ones, though, and the line breaks move with them, so a post that fits on the web unstyled can break a line earlier in bold.

The phone apps do not draw the styling in the timeline at all. They show the post plain, which leaves the breaks and the nine-line fold exactly where they were without it. Tap Show more on an iPhone and the bold comes back; the post's own page has it too. That looks like a bug on X's side, and Postcheck draws the phones the way they behave rather than the way they ought to.

Things X does to the text you typed

Stacked blank lines collapse on posting. Four newlines between two paragraphs are stored as two, so the airy draft in the composer is not the post that ships. Repeated spaces inside a line survive; a trailing space does not.

Hyphens break differently per client: the web and the iPhone app both break a line after a hyphen inside a word, and the Android app never does.

A link printed longer than 30 characters is shortened in the display to its host plus the first 15 characters after it, then an ellipsis — so two different deep links can render as the same visible string.

And a post that opens with an @handle is stored as a reply to that account, with in_reply_to_screen_name set, even though it renders as an ordinary post with no "Replying to" line. Whether that changes who sees it, we have not measured, and the tool says so rather than repeating the folklore.

No account, and you can hand the preview to someone else

Postcheck has no sign-up. The Share button copies a link with the post encoded in the URL fragment, and a browser never sends a fragment to a server, so a colleague or someone on the legal team opens exactly the preview you are looking at and our side still never sees the draft.

How we know

The corpus is 152 real posts, each one captured three times: the lines x.com actually drew for it read out of the DOM, and the lines an iPhone and an Android phone drew, captured through iPhone Mirroring and over adb. Postcheck holds X's own data for the post alongside them. npm run verify types every one of them into the preview in a headless browser and diffs the line breaks, the Show more cut and the app fold against those captures. The run has to end at zero failures.

The registry that holds the rules says, for every single one, whether it was measured off a client, verified against a specific post, inferred from one sample, or assumed and not yet checked. The assumed ones are labelled assumed. A preview tool that cannot tell you which of its rules is a guess is asking for more trust than it earned.

What it is for

I draft every post I write in Postcheck. It has also turned into the thing I send to someone else on the team when they want to see a post before it goes out, which is why the share link had to work without an account.

It is MIT licensed and the source is on GitHub. There is real value in knowing what a post will look like on X before you send it, so please build on it.

Postcheck reads one post before it goes out. Vibewatch reads what gets said back, from inside your own Discord and Telegram, and writes your team a weekly report on it. Start a free trial.

Postcheck itself is at postcheck.vibewatch.io. Free, no account, nothing you type is stored.

Related articles

One weekly report on your community, with citations.

Start your free 7-day trial and see how your community feels. No credit card required.

Start Free Trial