Last updated: September 2026
X vs Bluesky vs LinkedIn post limits (2026)
X allows 280 characters (25,000 on Premium), weighted so a link costs 23 and most emoji cost 2. Bluesky allows 300 graphemes, and a link counts at full length. LinkedIn allows 3,000 characters counted in UTF-16 code units, so an emoji costs 2. Plain text under 280 characters, with every link counted at full length, fits all three.
The table below covers the limits that decide whether one draft lands everywhere. The figures are the ones OpenTweet checks before it publishes, as of September 2026. Networks change their limits, so check the date.
The limits side by side
| Spec | X | Bluesky | |
|---|---|---|---|
| Text limit | 280 characters, or 25,000 on X Premium | 300 graphemes, plus a 3,000-byte ceiling | 3,000 characters |
| How text is counted | Weighted characters | Graphemes (one visible character each) | UTF-16 code units |
| Links | Any URL counts as 23 | Counts at full length when posted through the API | Counts at full length |
| Emoji | Most count as 2 (so do CJK characters) | Count as 1 grapheme | Count as 2 |
| Spaces | Count | Count | Count |
| Images per post | Up to 4 | Up to 4 | Up to 4 from the OpenTweet composer |
| Image size | 5MB each | 2,000,000 bytes each. OpenTweet resizes larger images to fit | OpenTweet resizes oversized images before upload |
| Alt text | Up to 1,000 characters | Up to 2,000 characters in the Bluesky app | Not listed |
| Video via OpenTweet | Yes | No, skipped with a reason | Not yet, skipped with a reason |
| Threads | Native threads | Real reply-chain threads | No threads. A thread becomes one post, parts joined with blank lines |
| Hashtags and mentions | Become links | Become links | Publish as plain text |
| Account type | Your X account | Your Bluesky account | Personal profile only |
"Not listed" means we do not state a figure for it here. LinkedIn's "see more" fold shows roughly the first 2 or 3 lines of a post; LinkedIn publishes no official number.
What happens to one draft on each network
When you send one draft to all three networks with OpenTweet, each network is checked against its own limit. A draft that is too long for a network is skipped there with a reason and still goes out on the others. Nothing is truncated.
A 250-character post. No link, no emoji.
- X
- Published
- Bluesky
- Published
- Published
A 290-character post.
- X
- Rejected. The API refuses the whole request with 400 validation_failed, unless the account has Premium (25,000)
- Bluesky
- Nothing publishes while X is a target. On its own it fits, at 290 of 300
- Nothing publishes while X is a target. On its own it fits
240 characters of text, a space, and a 60-character link. 301 characters as typed.
- X
- Published. The link counts as 23, so it weighs 264
- Bluesky
- Skipped. The link counts in full, so it is 301 of 300
- Published
A 275-character post that includes 10 simple emoji.
- X
- Rejected without Premium. Each emoji weighs 2, so it is 285 of 280
- Bluesky
- Nothing publishes while X is a target. On its own, each emoji is 1 grapheme, so it is 275 of 300
- Nothing publishes while X is a target. On its own, 285 code units of 3,000
A 6-part thread, every part under 280 characters.
- X
- Published as a 6-post thread
- Bluesky
- Published as a 6-post reply chain
- Published as one post with the parts joined by blank lines, if the combined text fits in 3,000
A post with a video.
- X
- Published with the video
- Bluesky
- Skipped with a reason
- Skipped with a reason
A post with #buildinpublic and an @mention.
- X
- Published. Both are links
- Bluesky
- Published. Both are links
- Published. Both show as plain text
A post with four 3MB images.
- X
- Published with 4 images (each under 5MB)
- Bluesky
- Published. OpenTweet resizes each image under 2,000,000 bytes first
- Published with 4 images
What a skip looks like
Through the API, every network gets its own entry in results, with a status of published, failed or skipped. A skipped entry carries a skip_reason. This is the 412-character post from the cross-posting docs: fine on LinkedIn and on a Premium X account, too long for Bluesky.
{
"posts": [
{
"id": "66f0a1c2e4b0a1c2e4b0a1c2",
"results": [
{
"platform": "x",
"status": "published",
"url": "https://x.com/you/status/1834000000000000001"
},
{
"platform": "bluesky",
"status": "skipped",
"skip_reason": "This post is 412 characters, over the 300 Bluesky allows."
},
{
"platform": "linkedin",
"status": "published",
"url": "https://www.linkedin.com/feed/update/urn:li:share:7300000000000000000/"
}
]
}
]
}Writing one draft that fits all three
- Stay at or under 280 characters, counted as typed. Count every link at its full length, because that is how Bluesky counts it. A draft that passes that test also passes X, where the link costs 23, and LinkedIn, which allows 3,000.
- Count each emoji as 2. X weighs most emoji at 2 and LinkedIn counts them as 2 code units. Bluesky counts them as 1, so emoji only break the other two.
- Put the point in the first line. LinkedIn folds a post after roughly 2 or 3 lines, and on X and Bluesky the first line is what people read in the feed.
- Do not rely on hashtags or mentions for LinkedIn. They become links on X and Bluesky but publish as plain text on LinkedIn.
- Keep video for X. OpenTweet does not post video to Bluesky or LinkedIn yet, so a video post is skipped on both.
- Need different text per network? Send separate posts. The v1 API takes one shared text per call, so a longer LinkedIn version is a second call with
"platforms": ["linkedin"].
Threads are the one real exception
A thread lands as a thread on X and as a reply chain on Bluesky, with each part checked against that network's limit. On LinkedIn the same thread becomes one post, parts joined with blank lines, so a long thread can publish on X and Bluesky and be skipped on LinkedIn once the combined text passes 3,000.Frequently asked questions
What is the Bluesky character limit compared to X?
Bluesky allows 300 graphemes per post, with a 3,000-byte ceiling underneath. X allows 280 weighted characters, or 25,000 on X Premium. The bigger practical difference is links: X counts any URL as 23, while Bluesky counts a link at its full length when you post through the API. A post with a long link can fit on X and still be too long for Bluesky.
What is the LinkedIn character limit compared to Twitter (X)?
LinkedIn allows 3,000 characters per post, counted in UTF-16 code units, so an emoji costs 2. X allows 280 weighted characters, or 25,000 on Premium. On LinkedIn, only roughly the first 2 or 3 lines show before the "see more" fold. LinkedIn publishes no official number for that.
Do spaces count toward the Bluesky limit?
Yes. Bluesky counts every grapheme, spaces included, up to 300. There is also a 3,000-byte ceiling, which only matters for text made mostly of multi-byte characters.
Can I post a thread to LinkedIn?
LinkedIn has no threads. When a thread targets LinkedIn, OpenTweet publishes it as one post with the parts joined by blank lines. The 3,000-character limit applies to the combined text.
What happens when a post is too long for one network?
OpenTweet skips that network and says why in the result for it (status "skipped" with a skip_reason). The post still goes out on every network it fits. Nothing is truncated.
Can I post video to Bluesky or LinkedIn with OpenTweet?
Not as of September 2026. Video goes to X. A post with video is skipped on Bluesky and LinkedIn with a reason.
Keep exploring
Post to X, Bluesky and LinkedIn from one draft or one API call.
Cross-posting
One draft to X, Bluesky and LinkedIn, with a result per network.
Cross-posting API docs
The platforms parameter, the results array, and why a network gets skipped.
Bluesky scheduler
Schedule Bluesky posts and threads alongside X.
LinkedIn scheduler
Schedule posts to your LinkedIn personal profile.
n8n: post to all three
An importable n8n workflow that posts each RSS item to X, Bluesky and LinkedIn.
GitHub releases to all three
A GitHub Actions workflow that announces each release on X, Bluesky and LinkedIn.
One draft, checked against all three limits
OpenTweet posts to X, Bluesky and LinkedIn and tells you per network what went out. From $11.99/mo, with Bluesky and LinkedIn on every plan.
7-day free trial. Cancel anytime.