Counting a link by its length
A short bit.ly link and a long tracking address both count 23. Shortening a link saves no characters on X, and an unfamiliar short link makes readers hesitate.
Paste a post and see its length the way X counts it, not the way your text editor does. Links count 23, emoji count 2, and anything past 280 becomes a thread when calmposts sends it.
0 / 280 280 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.
One post with an emoji, a blank line, an arrow and a link. Your editor sees one length; each network sees its own.
Shipping day 🚀 The new calendar is live: drag a post to any hour and it moves there. Release notes → calmposts.com/changelog/calendar-drag-and-drop
| Network | Counts | Goes out as |
|---|---|---|
| X | 127 / 280 | 1 post |
| Bluesky | 148 / 300 | 1 post |
| Threads | 151 / 500 | 1 post |
| 148 / 3,000 | 1 post |
X does not count characters the way a word processor does. It gives each character a weight and adds the weights up. Most letters weigh 1: the Latin alphabet with all its accents, Cyrillic, Greek, Armenian, Hebrew, Arabic, Thai and the scripts of India sit in the range X counts as light. Everything outside that range weighs 2. That includes Chinese, Japanese and Korean characters, and a few everyday symbols you might not expect.
A post may weigh up to 280. A post in English, German or Russian therefore holds 280 letters, while a post in Japanese holds 140 characters, because each of them weighs 2. This goes back to 2017, when Twitter doubled its limit from 140 to 280 but left Chinese, Japanese and Korean where they were: those languages say more in one character, and never had the same trouble fitting a thought into 140.
Before it weighs anything, X normalises the text to NFC, the composed form of Unicode. An é typed as one character and an é built from an e and a combining accent are the same character after that, and both count 1. calmposts does the same, so a text copied from a document that stores accents separately counts no differently.
Every link counts 23 characters, however long or short it really is. X wraps links in its own t.co shortener, so a 90-character address with tracking parameters costs the same 23 as x.com. Shortening a link before you post saves nothing on X.
A link does not need https:// in front to count. An address that starts with www., and a bare domain with a common ending such as calmposts.com/tools, example.org or example.co.uk, is a link too, and counts 23 even when the name is shorter than that.
Two things look like links and are not. An e-mail address such as a@b.com counts as written, 7, and so does a file name like notes.txt, because .txt is not a web address. Punctuation right after a link, like the full stop in «see example.com.», is not part of the link: it counts 1 on its own.
A link also changes the price of a post for whoever pays the X API. Since April 2026 X bills a post with a link at $0.20 instead of $0.015. calmposts pays X for you, which is why its plans count posts with links separately, in the open.
Every emoji counts 2, including the ones built from several pieces. A thumbs-up with a skin tone is two code points, a family of three is five joined by invisible zero-width joiners, a flag is two regional letters. To you each is one picture, and on X each counts 2.
A few other symbols weigh 2 as well, which catches people out: the ellipsis character (…), the bullet (•), arrows such as →, the euro sign (€). Three full stops typed as ... count 3 and the single … counts 2, so the ellipsis is still the shorter of the two. The em dash (—), the en dash (–) and curly quotes, on the other hand, weigh 1.
An @mention and a #hashtag count as written: @calmposts is 10 characters, #buildinpublic 14. Nothing about them is free, so three hashtags on a short post can take a fifth of it.
A space counts 1, and so does a line break. A blank line between two paragraphs is two line breaks, so 2. Spaces at the end of a line count too, even though nobody sees them; delete them and the characters are yours again.
A regular X account posts up to 280. An account with X Premium posts up to 25,000, and calmposts knows which one you connected: the composer counts a Premium account against 25,000 and every other account against 280. Switch on «X Premium» above the counter to count the same way here.
A long post on Premium is folded in the timeline: readers see the first lines and a link to show the rest. Put what matters at the start, whatever your limit.
This counter is the calmposts composer's counting code, built for this page. The same rules decide what the composer shows while you write, what the server accepts when you save and what goes out to X. A post this counter calls fine is not refused for its length.
Each figure is computed by calmposts' counting code, the one that checks your posts.
| Text | What it is | Counts |
|---|---|---|
Hello | Latin letters | 5 |
Привет | Cyrillic letters | 6 |
你好 | Chinese characters: 2 each | 4 |
안녕하세요 | Korean syllables: 2 each | 10 |
👍 | An emoji | 2 |
👨👩👧 | A family: five code points, one emoji | 2 |
https://example.com/a/very/long/path?with=query | A long link | 23 |
calmposts.com | A bare domain: still a link | 23 |
a@b.com | An e-mail address: not a link | 7 |
@calmposts | A mention, as written | 10 |
— | An em dash | 1 |
… | The ellipsis character | 2 |
• | A bullet | 2 |
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 |
A short bit.ly link and a long tracking address both count 23. Shortening a link saves no characters on X, and an unfamiliar short link makes readers hesitate.
Word processors and most online counters count every character as 1. A post with emoji or Japanese text is longer on X than they say, and X refuses it at publishing time if it is over.
• counts 2 on X, and so does →. In a list of ten points the bullets cost twenty characters; a hyphen costs half as much.
Each line break counts 1 and a blank line 2. A post laid out in short lines can lose 10 or 15 characters to them.
Premium's limit is the Premium account's alone. Post the same text from a regular account and it has 280 there; calmposts sends it to that account as a thread.
Cutting at exactly 280 leaves words and sentences broken across posts. Let the cut fall at the end of a paragraph or a sentence, as the thread splitter does.
X refuses a post over the limit: its API answers with an error and nothing is published. A scheduler that does not count the way X does finds out at publishing time, often at night, when nobody is there to fix it.
calmposts counts before you save. When the text you write for X is longer than one post, the composer shows it as a thread: it cuts the text at the strongest break that fits — a blank line, then a line break, then the end of a sentence, then a space — and sends each part as a reply to the one before. Nothing is added to your words: no «1/3», no thread emoji, unless you write them.
You see every part with its own count before you save, and you can change any of them. To see the thread now, paste the text into the thread splitter, which shows Bluesky's and Threads' versions next to X's.
280 for a regular account, counted by weight: most letters count 1, emoji and Chinese, Japanese or Korean characters count 2, and every link counts 23. An account with X Premium can post up to 25,000.
Yes, 23 characters each, whatever their real length, because X shortens every link with t.co. A bare domain such as example.com counts 23 as well; an e-mail address does not.
2, including emoji built from several pieces, such as a skin tone, a family or a flag.
Yes. A space counts 1 and a line break 1, so a blank line between paragraphs costs 2.
Because X weighs each Chinese, Japanese and Korean character 2. When the limit went from 140 to 280 in 2017, these languages kept the equivalent of 140, since they say more per character.
Yes: it is the composer's own code. calmposts checks every post again on the server, with the same rules, 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