Bluesky Character Counter
Counts your post the way Bluesky does: graphemes against 300, bytes against 3,000, and every link at the length it really costs. The X and LinkedIn counts for the same text sit alongside.
What is the Bluesky character limit?
Bluesky allows 300 characters per post, counted as graphemes, so spaces count and an emoji counts as 1. Text is also capped at 3,000 UTF-8 bytes. A link counts at its full length when posted through the API or OpenTweet. The bsky.app composer shortens how a link is displayed, so it counts less there.
157 left. Links at full length
2,854 left
The same text on X and LinkedIn
156 left. 25,000 on X Premium
2,856 left
What each link costs
Through the API or OpenTweet a link costs its full length on Bluesky. The composer column estimates how bsky.app shortens the link for display.
| Link | Bluesky via API or OpenTweet | bsky.app composer shows | X | |
|---|---|---|---|---|
| https://opentweet.io/features/cross-posting | 43 | 28opentweet.io/features/cro... | 23 | 43 |
How it would split
Split at sentence boundaries, never inside a link. For numbering and copy buttons, open the Bluesky Thread Maker.
- 1. 124/280
Just set up cross-posting to Bluesky ๐ฆ One draft now goes to X, Bluesky and LinkedIn. How it works: https://opentweet.io/features/cross-posting
- 1. 143/300, 146 bytes
Just set up cross-posting to Bluesky ๐ฆ One draft now goes to X, Bluesky and LinkedIn. How it works: https://opentweet.io/features/cross-posting
Bluesky, X and LinkedIn limits
As of September 2026.
How Bluesky counts a post
Graphemes, not letters or bytes
A grapheme is one character as you see it. A flag, a family emoji and an accented letter each count as 1, even when they are made of several code points underneath.
A second ceiling in bytes
The text also has to fit in 3,000 bytes of UTF-8. English text is far below it. A post made mostly of combined emoji can hit it first.
Links cost their full length via the API
X shortens every link to 23. Bluesky does not shorten links in the post text, so a long URL sent through the API or OpenTweet can use a fifth of the post on its own.
The same post, three different numbers
X weights links and emoji, Bluesky counts graphemes, LinkedIn counts code units. That is why this page shows all three instead of one number that is wrong for two networks.
Post it to Bluesky, X and LinkedIn from one draft
OpenTweet checks every network's limit on publish. A thread goes out as native reply threads on X and Bluesky and as one post on LinkedIn, from the composer or one call to the REST API. It does not split a long post for you, so split it here first.
7-day free trial, then from $11.99/mo. Bluesky and LinkedIn on every plan.
Bluesky character counter FAQ
What is the Bluesky character limit?
As of September 2026, a Bluesky post can be up to 300 characters. Bluesky counts graphemes, the characters you actually see, so an emoji or a flag counts as 1. The post text is also capped at 3,000 bytes of UTF-8, which only matters for text heavy in emoji or non-Latin scripts.
Do spaces count toward the Bluesky character limit?
Yes. Every space and every line break counts as one character toward the 300. The counter above shows the count with spaces, which is the number Bluesky enforces, and the count without spaces for reference only.
How do links count toward the Bluesky character limit?
When a post is sent through the API, or through OpenTweet, a link counts at its full length: a 60-character URL costs 60 of your 300. The bsky.app composer shortens how a link is displayed, so the same link costs less when you type it there. X is different again and counts every link as 23.
Do emoji count as one character on Bluesky?
Yes. Bluesky counts graphemes, so a family emoji like ๐จโ๐ฉโ๐งโ๐ฆ counts as 1 even though it is 11 UTF-16 code units and 25 bytes. On X most emoji count as 2, and on LinkedIn this counter treats most emoji as 2 as well.
What is the 3,000-byte limit on Bluesky?
Besides 300 graphemes, Bluesky caps post text at 3,000 bytes of UTF-8. Plain English is 1 byte per character, so it never gets close. A family emoji is 25 bytes, so 120 of them sit exactly on the 3,000-byte ceiling and still pass, while 121 go over it at a grapheme count of only 121.
What happens if a Bluesky post is over 300 characters?
Bluesky rejects it. OpenTweet does not split long text for you: a post over 300 is skipped on Bluesky with a reason, and still goes out on the other networks you picked. Split it into a thread first with the Bluesky Thread Maker, then post the parts as a thread.
Does OpenTweet add link cards to Bluesky posts?
No. OpenTweet makes links and @mentions clickable on Bluesky, but it does not attach link preview cards and does not shorten links. The link costs its full length, which is what the "via the API or OpenTweet" column above shows.
Related tools and guides
Bluesky Thread Maker
Split long text into a Bluesky thread and an X thread side by side.
LinkedIn Character Counter
Count against 3,000 and see roughly where "...see more" falls.
Thread to LinkedIn Post
Turn an X thread into one LinkedIn post, or a LinkedIn post into a Bluesky thread.
X Character Counter
Check a post against the 280 limit on X.
Cross-posting
One draft or one API call posts to X, Bluesky and LinkedIn.
Bluesky Scheduler
Schedule Bluesky posts and real reply-chain threads.
LinkedIn Scheduler
Schedule posts to your LinkedIn personal profile.