Bluesky, Threads & Mastodon Character Counter

Three decentralized social platforms, three different counting rules. Bluesky uses graphemes (300 max). Threads and Mastodon use characters (500 each). This tool counts each correctly.

0/300

300 graphemes left

0 words · 0 UTF-16 chars

Bluesky uses grapheme counting0 chars → 0 graphemes

Bluesky’s RichText API counts user-perceived characters via Intl.Segmenter, so a family emoji like 👨‍👩‍👧‍👦 is 1 grapheme even though it’s 11 UTF-16 units. 300 graphemes is roughly 50–75 English words.

300
Post limit
graphemes (not chars)
256
Display name
characters
256
Bio / About
characters

Decentralized social: at-a-glance

Platform
Post
Counts by
Bluesky
300
graphemes
Threads
500
UTF-16 chars
Mastodon
500*
UTF-16 chars
*Mastodon instances can override the default. Check your home server’s configured limit.

Why Bluesky Counts Graphemes Instead of Characters

Bluesky's RichText API counts post length in graphemes, not characters. A grapheme is what a human reader perceives as a single character on screen. Under the hood, Bluesky uses JavaScript's Intl.Segmenter to walk the string by user-perceived character boundaries, then enforces the 300-unit cap on the AT Protocol side.

Why it matters: a compound emoji like the family emoji (man, woman, girl, boy joined together) is a single visible glyph but is built from 7 Unicode code points and 11 UTF-16 code units. A naive character counter would charge you 11+ for that one emoji. Bluesky counts it as 1, which is what users actually expect.

The counter above mirrors that exact behavior. The Bluesky tab uses grapheme segmentation, so a single skin-toned emoji, a flag sequence, or a zero-width-joiner sequence all count as 1 unit toward the 300 cap, no matter how complex the underlying Unicode is.

Threads vs Mastodon: 500 Chars, Different Implementation

Threads (Meta's microblogging product, tied to Instagram) caps posts at 500 characters using straightforward UTF-16 character counting. It is the same model Instagram uses for captions. Emoji typically count as 2 (or more) under UTF-16, so a Threads post heavy with compound emoji can hit 500 sooner than the visible glyph count suggests.

Mastodon also defaults to 500 characters per post, but the limit is configurable per instance. mastodon.social keeps the default. Many instances raise it to 1,000, 2,000, or even 11,000 characters. Federated readers on default-config instances will still receive your full post, so a longer Mastodon post does not get truncated for them.

Practical rule: if you are cross-posting to Mastodon and you do not know your audience's instance, stick to 500. If you know your audience is mostly on a long-post-friendly instance, write longer. The Mastodon tab in the counter above defaults to 500 with a visible warning, but you can use it as a guideline rather than a hard wall.

Bluesky vs Twitter (X) Character Limits

Twitter (now X) caps free-tier tweets at 280 characters using UTF-16 code-unit counting. Bluesky caps posts at 300 graphemes. The numbers look similar, but the counting rules differ: Bluesky's grapheme model is consistently more generous, especially for posts with compound emoji.

Concrete example: a post with three family emoji and 200 letters of text counts as around 233 on Bluesky (3 graphemes for the emoji, 200 for the text, plus spaces). The same post on Twitter could count as 230 to 240+ characters depending on whether the emoji are simple or compound. The two limits feel similar but Bluesky leaves you slightly more headroom.

For cross-posting, design for the lower of the two: 280 characters of plain text is a safe ceiling that fits everywhere. Above 280 you start losing Twitter, and above 300 you start losing Bluesky.

Reference Table: Decentralized Social Platform Limits

Platform & FieldLimitNotes
Bluesky post300 graphemesGrapheme-counted via Intl.Segmenter, emoji = 1 each
Bluesky display name256 charactersByte-bounded in the AT Protocol
Bluesky description / bio256 charactersSame byte-bounded cap as display name
Threads post500 charactersUTF-16 char counting, same as Instagram captions
Threads bio150 charactersInherits the Instagram bio limit
Mastodon post (default)500 charactersInstance-overridable, some allow 5,000+
Mastodon display name30 charactersDefault, instance can change
Mastodon bio500 charactersProfile description
Frequently Asked Questions

Bluesky posts are capped at 300 graphemes, not 300 characters. A grapheme is what humans perceive as a single character, so a compound emoji like the family emoji counts as 1 grapheme even though it is built from 7 underlying code points. The 300-grapheme cap is enforced by Bluesky's RichText API on the AT Protocol.

Graphemes match what users actually see on screen. UTF-16 code-unit counting (the older approach) would say a single family emoji is 11+ characters, which feels broken to users. Bluesky uses Intl.Segmenter to split text by user-perceived character boundaries, so 1 emoji is always 1 unit toward the 300 limit, regardless of how complex the emoji is internally.

Yes. Every emoji counts as exactly 1 grapheme on Bluesky, including compound emoji like skin-tone variants, family emoji, and flag sequences. This is a more generous (and more intuitive) accounting than Twitter's old UTF-16-based counter, which charged 2 or more characters for many emoji.

Threads (Meta's Twitter-alternative tied to Instagram) caps posts at 500 characters. It uses straightforward UTF-16 character counting, the same as Instagram captions. Threads bios inherit Instagram's 150-character bio limit.

By default, Mastodon posts are limited to 500 characters. However, Mastodon is decentralized: each instance (server) can override the limit. Some instances allow 5,000 or more characters per post. If you do not know what instance your audience is on, stay under 500 to be safely compatible with the default.

Yes. Because Mastodon is open-source and self-hosted, instance admins can change the post character limit in their server config. mastodon.social uses the 500-char default, but instances like mastodon.art, pawoo.net, and many academic servers have raised it to 1,000, 2,000, or even 11,000 characters. Federated readers on default instances will still see your full post.

If you write a post under 280 characters using mostly text, it will fit Bluesky, Threads, Mastodon, and Twitter all at once. Above 280, you start losing platforms. The shared sweet spot for cross-posting across the decentralized web is roughly 250 to 280 characters with minimal compound emoji, which leaves room for a link preview without truncation.

Bluesky display names are capped at 256 characters, and the bio (description) is also 256 characters. These are byte-based limits in the AT Protocol, so heavy emoji use can hit the cap sooner than the 256 number suggests. The handle (the @-name) follows DNS rules and is much shorter.