Free tool

Every network cuts you off somewhere different

And none of them tells you where until the post is already rejected or already buried under a “see more”. Paste a post below. It gets counted five times, the way each network actually counts it, with a line drawn through whatever does not survive. Nothing you type leaves your browser.

Your post

369 in the editor

369 characters here is a different number on every network to the right. That is the point.

·

Tells

2 found
Shipped something I have wanted for months: the publish queue now retries a failed post with backoff instead of quietly giving up on the first 429, and it tells you when it has given up for real 👍🏽 no more finding out because a post never appeared. It handles token refresh seamlessly now too. Full change here: https://merge.tel/changelog/queue-retries-and-backoff
  • Em dash. End the sentence, or use a comma.
  • seamlesslyAI vocabulary. Use the plain word.
X337 / 280 · 57 over
Shipped something I have wanted for months: the publish queue now retries a failed post with backoff instead of quietly giving up on the first 429, and it tells you when it has given up for real 👍🏽 — no more finding out because a post never appeared. It handles token refresh seamcut at 280lessly now too. Full change here: https://merge.tel/changelog/queue-retries-and-backoff
X: over the 280 limit
counts 337, not 369 (links billed at 23) (weighted)developer.x.com — weighted character count, t.co = 23
Bluesky366 / 300 · 66 over
Shipped something I have wanted for months: the publish queue now retries a failed post with backoff instead of quietly giving up on the first 429, and it tells you when it has given up for real 👍🏽 — no more finding out because a post never appeared. It handles token refresh seamlessly now too. Full cut at 300change here: https://merge.tel/changelog/queue-retries-and-backoff
Bluesky: over the 300 limit
counts 366, not 369 (grapheme clusters)atproto app.bsky.feed.post — maxGraphemes 300
Mastodon337 / 500
Shipped something I have wanted for months: the publish queue now retries a failed post with backoff instead of quietly giving up on the first 429, and it tells you when it has given up for real 👍🏽 — no more finding out because a post never appeared. It handles token refresh seamlessly now too. Full change here: https://merge.tel/changelog/queue-retries-and-backoff
Mastodon: fits
counts 337, not 369 (links billed at 23)Mastodon default max_toot_chars (instances may raise it)500 is the default, an instance can raise it
LinkedIn367 / 3000
Shipped something I have wanted for months: the publish queue now retries a failed post with backoff instead of quietly giving up on the first 429, and it tells you when it has given up for real 👍🏽 — no more fi…see morending out because a post never appeared. It handles token refresh seamlessly now too. Full change here: https://merge.tel/changelog/queue-retries-and-backoff
LinkedIn: past the fold, fits the limit
counts 367, not 369LinkedIn ugcPost commentary limitfold ≈ 210, estimated
Discord367 / 2000
Shipped something I have wanted for months: the publish queue now retries a failed post with backoff instead of quietly giving up on the first 429, and it tells you when it has given up for real 👍🏽 — no more finding out because a post never appeared. It handles token refresh seamlessly now too. Full change here: https://merge.tel/changelog/queue-retries-and-backoff
Discord: fits
counts 367, not 369Discord API message content limit (webhook, non-Nitro)fold ≈ 1400, estimated

Why the numbers disagree

Your editor counts characters. The networks do not, and each one is wrong in a different direction. X replaces every link with a t.co URL and charges 23 for it no matter how long the original was, so a post with a long link is shorter than it looks. Bluesky counts grapheme clusters, so an emoji with a skin-tone modifier is one character rather than four. X weights CJK and emoji at two, which caps a Japanese post nearer 140 than 280.

The counts above model those published rules, and the card tells you when its number disagrees with your editor’s. Link weighting and CJK weighting follow the rules exactly. Emoji are the one place the answer can drift: X recognises them through twemoji, and this page has no runtime dependencies, so it matches them with Unicode properties instead. A sequence it misses costs the sum of its parts, never less, so the error runs toward cutting early rather than letting a post through that X would reject.

The red line is the API’s hard cap, exact except where the card says otherwise: Mastodon’s 500 is what a stock instance ships with and an operator can raise it, so that card says so. The amber line is where the feed collapses your post behind a “see more”, which is a client behaviour that moves with viewport and browser, so it is labelled as the estimate it is.

The second panel

It marks the mechanical tells that make writing read as machine-written: em dashes, “delve”, “seamless”, “not just X but Y”, trailing clauses that add nothing. It reports a count, never a percentage and never a verdict on who wrote something, because only the count is a claim you can check by looking.

Merge & Tell writes the post. This tells you whether it fits.

You were going to merge the PR anyway.

Cutoff — where every network cuts your post off — Merge & Tell