Counting emoji as one character
Most counters do, and Threads does not. A post a generic counter calls 495 can be well over 500 on Threads.
Threads gives a text post 500 characters, but an emoji is not one of them: it counts as many as it takes bytes. A thumbs-up is 4, a red heart 6, a family 18. Paste a post to see its length the way Threads sees it.
0 / 500 500 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.
Threads is coming to calmposts soon. Until then, your post can wait as a draft.
A post with a few emoji, a numbered list and a link. Look at the Threads row: the emoji make the difference.
Three things we learned shipping a scheduler 🧵👇 1. People read a thread to the end when its first line is clear. 2. Nobody misses the numbering. 3. A ❤️ costs more characters than you think. More: calmposts.com/blog
| Network | Counts | Goes out as |
|---|---|---|
| X | 224 / 280 | 1 post |
| Bluesky | 216 / 300 | 1 post |
| Threads | 227 / 500 | 1 post |
| 216 / 3,000 | 1 post |
Meta's documentation for the Threads API is short on this: text posts are limited to 500 characters, and emoji are counted by the number of their UTF-8 bytes. Letters, digits, spaces and punctuation count 1 each. A single emoji usually counts 3 or 4, and one built from several pieces counts a good deal more.
So 👍 counts 4, because it takes 4 bytes. 👍🏽, a thumbs-up with a skin tone, is two symbols in one and counts 8. ❤️, the red heart most keyboards insert, is a heart followed by an invisible variation selector, 6 in all. A flag is two regional letters of 4 bytes each, so 8, and a family of three joined by zero-width joiners counts 18.
Everything that is not an emoji counts the way you see it, as on Bluesky: a Chinese or Japanese character counts 1, a Cyrillic letter 1, and an accented letter 1, whether it was typed as one character or as a letter and a combining accent. calmposts normalises the text to NFC before it counts.
A post that is mostly words barely notices the rule. A post that leans on emoji does: ten emoji with skin tones take 80 of the 500, and five flags at the end of a travel post take 40.
The counter shows the Threads count with the characters as you see them under it. The gap between the two numbers is what your emoji cost. If a post is a little over, the emoji are usually the cheapest place to cut.
Take a post of 400 letters with twelve thumbs-up emoji in skin tones. Bluesky counts it 412, since each emoji is one character there. X counts 424, since each emoji weighs 2, and that is over X's 280 anyway. Threads counts 496, since each of those emoji takes 8 bytes: it still fits, with four characters to spare.
Without emoji the order changes: Threads' 500 is the most room of the three networks that have threads, and a text that fits it is often two posts on X and Bluesky. calmposts counts each channel against its own network as you write, so you see the difference before you save.
A link counts every character it has; Threads does not shorten links in the count the way X does. A bare domain such as calmposts.com counts 13, a long address with tracking parameters as much as it is long.
Threads also refuses a post with more than five different links. calmposts checks that before it sends anything to Meta, and the counter warns you as soon as the text holds a sixth.
A space counts 1 and a line break 1, so a blank line between two paragraphs costs 2. @mentions and hashtags count as written, like any other text.
Numbered lists cost what they look like: «1. » is three characters, digit, full stop and space. Emoji used as bullets cost their bytes, so a list of five points marked with ✅ spends 15 characters on the marks alone.
On Threads a thread is what the name says: a post, then 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 500.
Meta lets one profile publish 250 posts in 24 hours through the API, and every part of a thread is one of them. A ten-part thread a day is far inside that.
The counter is the calmposts composer's own code, built for this page, so the count you see is the count the composer shows and the server checks.
Each figure is computed by calmposts' counting code for Threads.
| Text | What it is | Counts |
|---|---|---|
Hello | Latin letters | 5 |
你好 | Chinese: 1 each | 2 |
👍 | An emoji: 4 bytes, counts 4 | 4 |
👍🏽 | With a skin tone: 8 | 8 |
❤️ | A red heart with its variation selector | 6 |
🇩🇪 | A flag: two regional letters | 8 |
👨👩👧 | A family: three people, two joiners | 18 |
🧵👇 | Two emoji | 8 |
https://example.com/a/very/long/path?with=query | A long link, in full | 47 |
calmposts.com | A bare domain, in full | 13 |
… | An ellipsis: not an emoji, 1 | 1 |
one
two | A line break counts 1 | 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 |
Most counters do, and Threads does not. A post a generic counter calls 495 can be well over 500 on Threads.
Each flag costs 8 and each ❤️ 6. Use them where they say something, not in a row at the end.
Threads refuses a post with more than five different links. Move the rest into a reply, or into the next part of the thread.
On X a link counts 23 and an emoji 2. On Threads a link counts in full and an emoji by its bytes, so the same text has a different length on each.
500 is the limit, not the goal. A long block of text is hard to read on a phone; a thread of three posts that each make one point often reads better.
Threads refuses a text post over 500 characters, and calmposts never sends one.
When a text is longer than one Threads post, calmposts sends it as a thread. The composer cuts it at the strongest break that fits within 500 — a blank line, then a line break, then the end of a sentence, then a space — and publishes each part as a reply to the one before. Nothing is added to the parts.
You see every part with its count before you save. The thread splitter shows the same text cut for X and Bluesky next to Threads, so you can see where they differ.
500 characters for a text post. Letters, digits, spaces and punctuation count 1 each; an emoji counts as many characters as it has UTF-8 bytes.
Its size in UTF-8: 👍 is 4, ❤️ 6, 👍🏽 8, a flag 8, a family of three 18.
Yes, in full. A post can also hold at most five different links.
Yes, as written, like any other text.
Yes. A long text goes out as a chain of replies, up to 25 parts of 500 characters each. Meta allows 250 posts per profile in 24 hours through the API, and each part counts as one.
Yes, it is the composer's own code. calmposts checks every Threads post with the same rule when it is saved and before it is sent.
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