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.
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
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 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
| Network | Counts | Goes out as |
|---|---|---|
| X | 93 / 280 | 1 post |
| Bluesky | 110 / 300 | 1 post |
| Threads | 117 / 500 | 1 post |
| 110 / 3,000 | 1 post |
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.
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.
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 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.
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.
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.
Characters and bytes as calmposts computes them for Bluesky.
| Text | What it is | Counts | Bytes |
|---|---|---|---|
Hello | Latin letters | 5 | 5 |
Привет | Cyrillic: 2 bytes each | 6 | 12 |
你好 | Chinese: 1 character, 3 bytes each | 2 | 6 |
👍 | An emoji: 4 bytes | 1 | 4 |
👍🏽 | With a skin tone: still 1 | 1 | 8 |
👨👩👧 | A family: 1 character, 18 bytes | 1 | 18 |
🇩🇪 | A flag: two regional letters, one character | 1 | 8 |
é | e and a combining accent: é | 1 | 2 |
https://example.com/a/very/long/path?with=query | A long link, in full | 47 | 47 |
calmposts.com | A bare domain, in full | 13 | 13 |
@alice.bsky.social | A handle, as written | 18 | 18 |
one
two | A line break counts 1 | 7 | 7 |
What one post takes on each network calmposts posts to, and how it is counted there.
| Network | One post | How characters count | Links | Threads |
|---|---|---|---|---|
| X | 280 characters; 25,000 with X Premium | By weight: most letters 1, emoji and CJK characters 2 | 23 each, whatever their length | A chain of replies, up to 25 posts in calmposts |
| Bluesky | 300 characters and 3,000 bytes | Graphemes: each character you see counts 1 | As written, every character | A chain of replies, up to 25 posts in calmposts |
| Threads | 500 characters | Graphemes, but an emoji counts its UTF-8 bytes | As written; at most 5 different links | A chain of replies, up to 25 posts in calmposts |
| 3,000 characters | Graphemes: each character you see counts 1 | As written, every character | None: a thread goes out as one post |
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.
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.
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.
Handles are domain names, and custom ones are long. Count them before you add three of them to a short post.
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.
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.
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.
Yes, in full: a link counts every character it has. Bluesky has no shortener like X's t.co.
1, whatever it is made of: 👍, 👍🏽 and 👨👩👧 each count 1. In bytes they take 4, 8 and 18.
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.
Yes. calmposts sends a long text as a thread of replies, up to 25 parts of up to 300 characters each.
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.
The networks calmposts posts to, each through its official API, and what it does on each.
Flat monthly plans with a free trial, X's fees included.
Schedule posts and threads from your own code. The API checks the same limits as these tools.
Let Claude, ChatGPT or another agent draft and schedule posts for you, within the same limits.
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