Tutorial
How Each Social Network Counts Characters
A character isn't the same thing on every network. Here's how each of the five counts emoji, links, accents and mentions, with one post measured five ways.
Oleh Husiev9 min read
Each network counts a post in its own unit, so the same draft gets five different numbers. X weighs most emoji as 2 and every link as 23, Bluesky and Mastodon count graphemes, Threads' docs count emoji in bytes, and LinkedIn just publishes a 3,000-character limit.
The five limits side by side
| Network | Limit | What counts as one | A link costs | An emoji costs |
|---|---|---|---|---|
| X (formerly Twitter) | 280, or 25,000 with Premium | Weighted: most Latin text 1, CJK 2 | 23, any length | 2 |
| Threads | 500, at most 5 links | Characters, with emoji as UTF-8 bytes per Meta's docs | As typed | 4 for most emoji, per Meta's docs |
| Bluesky | 300 graphemes and 3,000 bytes | Graphemes | Shortened in the app to domain + 13 characters + "..." | 1 |
| Mastodon | 500 by default, set per server | Graphemes, content warning included | 23 with http:// or https:// | 1 |
| 3,000 | Not documented | Not documented | Not documented |
Every number in this table comes from the network's own docs or source code, listed at the end. We checked them on October 19, 2026.
Why one post gets different counts
Text on a screen can be measured four ways, and the networks don't agree on which one to use:
- Graphemes: what you see as one character. ๐๐ฝ is one grapheme.
- Code points: the Unicode building blocks. ๐๐ฝ is two: the thumb and the skin tone.
- UTF-16 units: what most programming languages call a string's length. ๐๐ฝ is four.
- UTF-8 bytes: what the text takes up when it's stored or sent. ๐๐ฝ is eight.
The gap gets bigger with joined emoji. Here's how a few strings measure:
| Text | Graphemes | Code points | UTF-16 units | UTF-8 bytes | On X |
|---|---|---|---|---|---|
| ๐ | 1 | 1 | 2 | 4 | 2 |
| ๐๐ฝ | 1 | 2 | 4 | 8 | 2 |
| ๐จโ๐ฉโ๐ง | 1 | 5 | 8 | 18 | 2 |
| cafรฉ | 4 | 4 or 5 | 4 or 5 | 5 or 6 | 4 |
| ใใใซใกใฏ | 5 | 5 | 5 | 15 | 10 |
"cafรฉ" has two forms: รฉ can be one code point, or an e followed by an accent mark. They look identical, which is why X normalizes text before it counts. Bluesky and Mastodon count graphemes, so both forms are 4 there too.
X: weighted characters, links at 23
X's limit is 280 characters for most accounts, and the count is weighted. X's developer docs say plain Latin letters, punctuation and common symbols count as 1. Emoji, Chinese, Japanese and Korean characters count as 2. The exact ranges live in X's open-source twitter-text library: code points from 0 to 4351 weigh 1, which covers Latin, Greek, Cyrillic, Arabic, Hebrew and most Indian scripts, plus a few punctuation ranges like curly quotes. Everything else weighs 2.
The rules that catch people out:
- Every emoji is 2, whatever it's made of. A skin tone or a joined family emoji is still 2.
- Every link is 23. X wraps links in its t.co shortener, so a 90-character URL and a 15-character one cost the same.
- Text is normalized first (Unicode NFC), so both forms of "cafรฉ" count as 4.
- Media is free. Attaching a photo through X's own apps costs 0 characters.
- Reply mentions are free when X adds them at the start of a reply. Mentions you type yourself count.
X Premium raises the limit to 25,000 characters. X's help center adds a catch: if you mention someone after the first 280 characters of a long post, they won't be notified.
Threads: 500 characters and no more than 5 links
Meta's Threads API docs say text posts are limited to 500 characters, and that "emojis are counted as the number of UTF-8 bytes." Read literally, that makes ๐ cost 4 and ๐จโ๐ฉโ๐ง cost 18. The same docs link to a grapheme-counting library, which would count each as 1, so the rule isn't as clear as it looks. If your post leans on emoji, leave room.
The rules that are clear:
- At most 5 links. Since December 22, 2025, Threads refuses posts with more than 5. Repeating the same link counts once.
- The first link becomes the preview unless you attach one separately.
- One topic tag per post, 1 to 50 characters, with no periods or ampersands.
- Text attachments add up to 10,000 characters behind the post, which Meta announced in September 2025. Use one when a thread would run past four or five posts.
Bluesky: graphemes, bytes and shortened links
Bluesky's limit sits in the AT Protocol's post schema: 300 graphemes and 3,000 bytes. Graphemes match what you see, so an emoji is 1. The byte cap only matters with long runs of complex emoji: 120 four-person family emoji already fill 3,000 bytes.
Links are where Bluesky differs from everyone else. Before it posts, the Bluesky app rewrites each link in your text to a short form: the domain, then the first 13 characters of the path, then "...". The full address stays attached to the link, so it still opens the right page. A link to https://example.com/blog/notes-from-our-first-month is stored and counted as example.com/blog/notes-f..., which is 27 characters instead of 51.
Tools that post through Bluesky's API write whatever text they're given. If a scheduler sends the full link, the full link counts. The Bluesky character limit guide covers this with more examples.
Mastodon: graphemes, 23-character links and your server's limit
Mastodon's default limit is 500, and each server can run a different one. Its validator counts graphemes, and it rewrites three things before counting:
- Links that start with
http://orhttps://count as 23 characters. A bareexample.comis counted as typed. - Mentions of people on other servers count only the username:
@alice@mastodon.socialcosts as much as@alice. - The content warning is added to the post text, and the two are counted together.
To find your server's limit, open https://your.server/api/v2/instance in a browser and look for max_characters. On October 19, 2026, mastodon.social said 500 and infosec.exchange said 11,000. The Mastodon character limit guide lists more servers and explains why they differ.
LinkedIn: 3,000 characters
LinkedIn's help center says posts can contain up to 3,000 characters. It doesn't say how emoji or links count, and it doesn't publish where the "see more" cut falls in the feed. With 3,000 characters to work with, length rarely stops a post. The first two lines matter more, because they're what shows before the cut.
One post, measured five ways
Here's a real draft, with a long link and two emoji at the end:
Moved our whole posting week into one draft per idea. Each network gets its own copy, sized to fit. Notes from month one: https://example.com/blog/notes-from-our-first-month ๐๐๐ฝ
| Network | Count | Limit | Why |
|---|---|---|---|
| X | 150 | 280 | The link costs 23 and each emoji costs 2 |
| Threads | 186 | 500 | The link costs 51; ๐ is 4 bytes and ๐๐ฝ is 8, per Meta's docs |
| Bluesky (app) | 152 | 300 | The app shortens the link to 27 characters |
| Bluesky (full link) | 176 | 300 | A tool that keeps the full link pays all 51 |
| Mastodon | 148 | 500 | The link costs 23; each emoji is one grapheme |
It fits everywhere, but the spread is already 38 characters on a post this short. It grows with every long link and every emoji, and that's how a draft that fits one network fails another.
How to write one draft that fits all five
- Write to X's 280 first. It's the tightest for most text, and a post that fits it usually fits the rest.
- Put links near the end, so a cut or a "see more" doesn't hide your point.
- Go easy on emoji runs. They cost 2 each on X and possibly 4 or more on Threads.
- Check your Mastodon server once. If it allows 1,000 or more, you can post longer there by hand. (Shaflex gives every Mastodon post 500 characters for now, whichever server you post from.)
- Count the content warning on Mastodon as part of the post.
- Split, don't cram. When a draft runs long, a thread reads better than a post with every second word cut. Our guide to writing a thread that works on every network shows how.
A few things make this faster. The free character counter measures one draft the way each network does, links and emoji included, and the character limits table keeps every limit on one page. In Shaflex, the Composer gives each network its own copy of your draft with its own limit, and Split automatically turns a long draft into a thread at sentence breaks. The cross-posting guide walks through it.
Sources
Checked on October 19, 2026.
- X developer docs: Counting characters
- twitter-text: config v3, character weights and link length
- X Help Center: X Premium how-to, longer posts
- Threads API docs: Posts (500 characters, emoji, links, topic tags)
- Meta: Attach text to your Threads posts, September 4, 2025
- AT Protocol lexicon: app.bsky.feed.post
- Bluesky app source: toShortUrl and the post step that shortens links
- Mastodon docs: Posting toots
- Mastodon source: StatusLengthValidator
- Mastodon API: GET /api/v2/instance
- LinkedIn Help: Post and share updates
Questions readers ask
Do emojis count as 2 characters?
On X, yes. Every emoji counts as 2 there, including skin tones and joined emoji like a family. On Bluesky and Mastodon an emoji counts as 1, because both count graphemes. Meta's Threads docs say emoji count as their UTF-8 bytes, which is 4 for most single emoji.
Do links count toward the character limit?
Yes, on every network, but not always at full length. X counts every link as 23 characters. Mastodon counts a link that starts with http:// or https:// as 23. The Bluesky app shortens a link to its domain plus up to 13 characters of path before counting it. Threads counts the link as typed and refuses posts with more than 5 links.
Do spaces and line breaks count as characters?
Yes. Every network counts spaces and line breaks. A blank line between paragraphs costs two characters: one for each line break.
Which network has the strictest character limit?
X, for most posts. Its 280 is weighted, so emoji and Chinese, Japanese or Korean text cost 2 each. Bluesky's 300 graphemes comes next. A post written to fit X usually fits all five, but check Threads' 5-link cap and Bluesky's link lengths.
Does the content warning count on Mastodon?
Yes. Mastodon adds the content warning text to the post text and counts both against your server's limit. A 40-character warning leaves 460 characters for the post on a 500-character server.
Why does my post fit on one network and not another?
Because each network counts in a different unit. X weighs characters, Bluesky and Mastodon count graphemes, and Threads' docs count emoji in bytes. Links differ too: 23 on X and Mastodon, a short form on Bluesky, full length on Threads. The same draft can measure 150 on X and 186 on Threads.


