calmposts

Bluesky character counter

Bluesky gives a post 300 characters and counts the ones you see: an emoji with a skin tone is one, a flag is one. Paste a post to see its count, its size in bytes and, if it is long, the thread calmposts would send.

0 / 300 300 left

Characters as you see them
0
Links
0
UTF-8 bytes
0 / 3,000
Goes out as
0 posts

Schedule this post in calmposts

Free trial. After you sign up or sign in, the text opens in the composer as a new post, and nothing is saved or published until you say so.

A worked example

A short post with an emoji, a blank line and a full link, counted for each network.

Hello Bluesky 👋🏽 We moved our weekly updates here. Read the archive: https://calmposts.com/blog/weekly-updates

NetworkCountsGoes out as
X93 / 2801 post
Bluesky110 / 3001 post
Threads117 / 5001 post
LinkedIn110 / 3,0001 post

Bluesky counts what you see

Bluesky's limit is 300 graphemes. A grapheme is what a reader takes for one character: a letter, a letter with its accent, an emoji with its skin tone, a flag. The Unicode standard defines where one ends and the next begins, and Bluesky counts by those rules.

That makes Bluesky's count the most intuitive of the four networks. Hello is 5, Привет is 6, 你好 is 2, and 👨‍👩‍👧, which is five code points held together by zero-width joiners, is 1. Chinese, Japanese and Korean characters are not weighted as on X: each counts 1, so a post in Japanese holds 300 of them.

calmposts normalises the text to NFC first, the composed form of Unicode, as it does for every network. An é typed as an e plus a combining accent becomes a single é and counts 1, the same as on Bluesky.

And 3,000 bytes behind it

A post's text has a second limit: 3,000 bytes in UTF-8. For ordinary writing it never matters. A Latin letter takes 1 byte, a Cyrillic or Greek letter 2, a Chinese character 3, a simple emoji 4, so 300 characters of any of them stay well under 3,000.

It starts to matter with long emoji sequences. A family emoji is one character but 18 bytes, so a post of 300 of them would be 5,400 bytes, far over the cap. The counter shows the bytes under the characters, and calmposts checks both limits before anything is sent to Bluesky.

Links count as written

On Bluesky a link is part of the text, and every character of it counts. A 47-character address takes 47 of your 300. There is no shortener in between as there is on X, where every link counts 23.

calmposts makes every link in a Bluesky post clickable, bare domains such as calmposts.com included, which it points at their https:// address. The text itself goes out exactly as you wrote it.

Bluesky's own app may show a long link shortened. calmposts does not shorten links, so here a link counts in full. If a long address takes too much of the post, link to a shorter page you control rather than through a third-party shortener readers cannot see through.

Handles, hashtags, spaces and line breaks

Handles count as written: @alice.bsky.social is 18 characters. Because handles on Bluesky are domain names, they are long, and naming three people can take a fifth of a post. Hashtags count as written too.

A space counts 1 and a line break counts 1, so a blank line between paragraphs costs 2. A line break typed as the Windows pair of characters, carriage return and line feed, is one grapheme and counts 1 as well.

One post for Bluesky and X

If the same text goes to Bluesky and to X, either limit can be the tighter one. A post of 200 letters, a space and a 60-character link counts 261 on Bluesky and 224 on X, where the link is 23. A post of 200 Japanese characters counts 200 on Bluesky and 400 on X, where each of them weighs 2.

So a text with long links runs out first on Bluesky, and a text in Chinese, Japanese or Korean, or with many emoji, runs out first on X. calmposts counts each channel against its own network while you write, and the thread splitter shows both versions of a long text side by side.

Threads on Bluesky

Bluesky has threads: a post followed by replies to it from the same account. calmposts sends a long text that way, each part a reply to the one before, up to 25 parts, and each part has its own 300 characters and 3,000 bytes.

The counter is the calmposts composer's own code, built for this page, so the count and the thread here are the ones the composer shows and the server checks.

What counts how much on Bluesky

Characters and bytes as calmposts computes them for Bluesky.

TextWhat it isCountsBytes
HelloLatin letters55
ПриветCyrillic: 2 bytes each612
你好Chinese: 1 character, 3 bytes each26
👍An emoji: 4 bytes14
👍🏽With a skin tone: still 118
👨‍👩‍👧A family: 1 character, 18 bytes118
🇩🇪A flag: two regional letters, one character18
ée and a combining accent: é12
https://example.com/a/very/long/path?with=queryA long link, in full4747
calmposts.comA bare domain, in full1313
@alice.bsky.socialA handle, as written1818
one twoA line break counts 177

Post limits side by side

What one post takes on each network calmposts posts to, and how it is counted there.

NetworkOne postHow characters countLinksThreads
X280 characters; 25,000 with X PremiumBy weight: most letters 1, emoji and CJK characters 223 each, whatever their lengthA chain of replies, up to 25 posts in calmposts
Bluesky300 characters and 3,000 bytesGraphemes: each character you see counts 1As written, every characterA chain of replies, up to 25 posts in calmposts
Threads500 charactersGraphemes, but an emoji counts its UTF-8 bytesAs written; at most 5 different linksA chain of replies, up to 25 posts in calmposts
LinkedIn3,000 charactersGraphemes: each character you see counts 1As written, every characterNone: a thread goes out as one post

Common mistakes

Counting with X's rules

X weighs emoji and CJK characters 2 and every link 23; Bluesky does neither. A text written to fit X can be longer on Bluesky because its links count in full, or shorter because its emoji count 1.

Pasting long tracking links

A link with utm parameters can take 100 of your 300 characters. Remove the tracking part, or link to a short page of your own.

Ignoring the bytes

It rarely matters, but a post made mostly of long emoji sequences, such as families, can be under 300 characters and over 3,000 bytes. The byte count sits right under the counter.

Mentions that eat the post

Handles are domain names, and custom ones are long. Count them before you add three of them to a short post.

Splitting at exactly 300

A cut at the 300th character can land in the middle of a word. A thread reads better cut at a paragraph or the end of a sentence, which is where calmposts cuts it.

What happens when a post is over 300

Bluesky refuses a post over 300 graphemes or 3,000 bytes, and nothing is published.

In calmposts, a text longer than one Bluesky post goes out as a thread. The composer cuts it at the strongest break that fits within 300: a blank line, then a line break, then the end of a sentence, then a space. Each part is sent as a reply to the one before, and nothing is added to them.

You see the parts and their counts before you save, and you can edit each one. The same text can make a different number of parts on X and on Threads; paste it into the thread splitter to compare them side by side.

Thread splitter

How to count a post for Bluesky

  1. Paste your post. Type or paste the text into the box. The count updates as you type.
  2. Check the characters and the bytes. The big number is what Bluesky counts against 300. Under it are the bytes against 3,000 and the links found.
  3. See the thread. If the text is over 300, the counter says how many parts calmposts would send.
  4. Schedule it. Press «Schedule this post in calmposts» to open the text in the composer and pick when it goes out.

Questions about counting on Bluesky

What is the character limit on Bluesky?

300 characters per post, counted as graphemes: each character as you see it counts 1, emoji with skin tones and flags included. A post's text is also capped at 3,000 bytes.

Do links count on Bluesky?

Yes, in full: a link counts every character it has. Bluesky has no shortener like X's t.co.

How much does an emoji count on Bluesky?

1, whatever it is made of: 👍, 👍🏽 and 👨‍👩‍👧 each count 1. In bytes they take 4, 8 and 18.

Why does Bluesky have a byte limit as well?

A post's text is stored with both limits, 300 graphemes and 3,000 bytes. Ordinary text never reaches the bytes; only long runs of complex emoji can.

Does Bluesky support threads?

Yes. calmposts sends a long text as a thread of replies, up to 25 parts of up to 300 characters each.

Is this the count calmposts uses?

Yes, it is the composer's own code. calmposts counts the same way when it checks a post before saving it and before sending it.

More from calmposts

Write once, post everywhere

calmposts counts your post for every network as you type, turns a long text into a thread where a network has threads, and sends each part on time through the networks' official APIs.

See the plans