Free Tool

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.

Fits in one Bluesky post.
Bluesky characters (graphemes)143 / 300

157 left. Links at full length

Bluesky text bytes (UTF-8)146 / 3,000

2,854 left

143
With spaces (what Bluesky counts)
124
Without spaces (reference only)
128
In the bsky.app composer, about
144
JavaScript length (UTF-16)

The same text on X and LinkedIn

X (weighted, link = 23)124 / 280

156 left. 25,000 on X Premium

LinkedIn (UTF-16 code units)144 / 3,000

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.

LinkBluesky via API or OpenTweetbsky.app composer showsXLinkedIn
https://opentweet.io/features/cross-posting4328opentweet.io/features/cro...2343

How it would split

Split at sentence boundaries, never inside a link. For numbering and copy buttons, open the Bluesky Thread Maker.

X thread: fits in 1 post
  1. 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

Bluesky thread: fits in 1 post
  1. 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.

Bluesky post300 graphemes
Bluesky post text3,000 UTF-8 bytes
Link on Bluesky (API or OpenTweet)Full length
X post280 weighted
X post on X Premium25,000
Link on X23 characters
LinkedIn post3,000 code units
Emoji on Bluesky / X / LinkedIn1 / 2 / 2 (most)

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