Social Media·May 3, 2026·10 min read

Bluesky, Threads & Mastodon Character Limits: The Complete 2026 Guide

The three big Twitter alternatives all count differently. Bluesky uses graphemes (300), Threads uses characters (500), Mastodon depends on the instance (500 default, up to 5,000+). Here's the cross-platform reference, with the grapheme math that trips up everyone.

ShareX
300
Bluesky graphemes
500
Threads characters
500
Mastodon default
~5,000
Mastodon max (custom)

Count characters across Bluesky, Threads, and Mastodon

Free real-time counter with the right rules per platform: Bluesky's grapheme count, Threads' 500-char limit, and Mastodon's default and custom-instance limits.

Open Counter

The Three Decentralized Twitter Alternatives

When the Twitter exodus started in 2022, three platforms absorbed most of the migration: Bluesky, Threads, and Mastodon. They look similar from the outside (short posts, follow graph, replies, reposts) but they were built on three completely different technical foundations, and that shapes how they count characters.

Bluesky runs on the AT Protocol, a federated architecture with a global content layer and portable accounts. It launched publicly in February 2024. It is the most Twitter-like in feel and the most innovative in its character-counting (more on graphemes below).

Threadsis Meta's entry, launched July 2023, tightly bound to Instagram identity. It started as a closed Meta product but is now bridging to ActivityPub (the Mastodon protocol), which means Threads posts can federate to the broader fediverse.

Mastodon is the elder of the three: an open-source, ActivityPub-native federated network where you pick a server (instance) and admins set the rules. It has been live since 2016 but exploded in late 2022 when Twitter changed hands.

Bluesky's 300-Grapheme Limit

Bluesky posts are limited to 300 graphemes. Not 300 characters. Not 300 bytes. 300 graphemes.

A grapheme is what you and I would call “a character” if we were looking at a screen: one visible symbol. The letter a is one grapheme. The flag emoji 🇺🇸 is one grapheme too, even though under the hood it is built from two regional indicator code points (and 4 UTF-16 code units).

For plain English text, this looks identical to a 300-character limit. The difference shows up the moment you add an emoji, especially compound or skin-tone emoji. On Twitter, a family emoji could eat 11 characters from your 280. On Bluesky, it eats 1.

Threads' 500-Character Limit

Threads posts are capped at 500 characters. Plain and simple. Threads inherits Instagram's character-counting model, which uses UTF-16 code units the same way Twitter originally did.

That means an emoji typically counts as 2 characters in your 500-character budget. A compound emoji can count as 5, 7, or 11. If you write text-heavy posts, 500 is plenty (about 75-90 English words). If you lean on emoji, your effective budget shrinks.

Threads also supports posting threads (multi-post chains) and inline links, both of which work the same way as Twitter. Links count as their literal character length, no auto-shortening.

Mastodon's 500-Character Default

Mastodon's default post limit is 500 characters, but here is the twist: each instance can override it. Instance admins set the cap when they configure their server, and there is no global rule.

The largest instances (mastodon.social, mastodon.online, fosstodon.org) keep the 500 default. But plenty of instances run higher: 1,000, 2,000, even 11,000. A few popular ones like infosec.exchange and hachyderm.io have 1,000+ caps.

Federation complicates this. If you post 4,000 characters from a generous instance, that post still federates to mastodon.social (cap 500). On the receiving instance, the displayed post may be truncated with a “Read more” link back to the original. Your followers there will see only the first 500 characters by default.

Practical rule: write to 500. It works on every instance, federates cleanly, and matches Threads.

Why Bluesky Counts Graphemes Instead of Characters

Twitter built its 140-character limit in 2006 around UTF-16 code units, the encoding JavaScript strings use natively. That made sense for English ASCII. It broke spectacularly the moment emoji and complex scripts arrived.

Take the family emoji: 👨‍👩‍👧‍👦. To your eye, it is 1 thing. Under the hood, it is built from 4 separate person emoji glued together with 3 zero-width joiner (ZWJ) characters. Total: 7 code points, 11 UTF-16 code units. On a 280-char Twitter post, this single emoji ate 11 of your characters.

Bluesky's AT Protocol team learned from this. They specified that the 300-character limit is measured in graphemes, the unit JavaScript exposes via Intl.Segmenter with { granularity: 'grapheme' }. The count now matches what users see.

The same family emoji that costs 11 on Twitter costs 1 on Bluesky. A Hindi syllable composed of multiple combining marks counts as 1. A flag emoji counts as 1. The math finally matches the eye.

Cross-Platform Character Math

To make this concrete, take a sample 280-character Twitter post and count it on every platform:

PlatformLimitSample post fits?
Twitter (X)280Yes
Bluesky300Yes (with room)
Threads500Yes (huge room)
Mastodon500 defaultYes (huge room)
Mastodon (max instance)5,000+Yes (massive room)

Add three compound emoji (each 11 UTF-16 chars but 1 grapheme) to that same 280-char post. On Twitter you blow past 280 immediately. On Bluesky you sit comfortably at 283 graphemes. On Threads/Mastodon you are at 313 chars (still under 500). Bluesky's grapheme count is the most generous of the three for emoji-heavy posts.

Bluesky Display Names, Bios & Other Limits

Posts are not the only place limits show up. Bluesky's profile fields:

FieldLimit
Post300 graphemes
Display name256 chars
Description (bio)256 chars
Handle253 chars
Custom domain handleDomain rules
Alt text (image)2,000 chars

Threads Limits Beyond Posts

Threads inherits the Instagram-family limit set, with a few tweaks:

  • Post (500 characters): The headline limit. Plain UTF-16 counting.
  • Bio (150 characters): Same as Instagram. Tight. Make every word work.
  • Username (30 characters): Shared with your Instagram username, since Threads accounts are bound to Instagram.
  • Display name (Instagram name): Shared with Instagram's name field, typically up to 30 characters in practice.
  • DM (1,000 characters): Direct message limit, longer than the post limit.
  • Alt text (image): Up to ~1,000 characters for accessibility descriptions.

Mastodon Limits Beyond Posts

Mastodon profile field limits are set per-instance. The defaults shipped with Mastodon's open-source code:

  • Post (500 characters default): Override per instance. Some allow 5,000+.
  • Display name (30 characters): The friendly name shown in feeds. Tight by default.
  • Bio (500 characters): The profile description.
  • Username (30 characters): The local part of your handle (before @instance.tld).
  • Profile fields (4 metadata rows): Each row is 255 chars label + 255 chars value. Used for verifiable links.
  • Content warning: 100 characters. The summary that appears above hidden content.
  • Alt text (image): 1,500 characters per attachment.
  • Custom-instance overrides: Admins can raise any of these. Always check your home instance's “About” page.

Cross-Posting Strategy: Write Once, Post Everywhere

If you maintain a presence on all three (and probably Twitter/X too), the practical move is to write to the lowest common denominator and let the rest take care of itself.

Lowest common denominator: 280 characters (Twitter) or 300 graphemes (Bluesky), whichever your audience leans toward. Hit that and your post fits everywhere with room to spare.

Cross-posting tools: Buffer, Hypefury, Postiz, and Croissant all support multi-platform publishing across Bluesky, Threads, Mastodon, and X. They handle authentication and posting; some flag platform-specific issues (overlength, missing media) before you publish.

Cross-posting checklist

  • 1. Draft to 280 chars / 300 graphemes (Bluesky-safe).
  • 2. Verify with the platform-specific counter, especially if your post has emoji.
  • 3. Strip platform-specific syntax (X-only quote tweets, Mastodon-only content warnings) before broadcasting.
  • 4. Add alt text to every image. All three platforms support and reward it.
  • 5. Watch for link previews. Threads renders OG cards differently from Bluesky.

The one trap to watch: emoji-heavy posts that look fine on Bluesky (1 grapheme each) can blow past Twitter's 280 (11 UTF-16 chars per family emoji). Always check on the actual platform's tool when emoji are dense.

Count characters across Bluesky, Threads, and Mastodon

Real-time counter with the right rules per platform: Bluesky's grapheme math, Threads' 500-char limit, and Mastodon instance overrides built in.

Open Bluesky/Threads/Mastodon Counter

Frequently Asked Questions

Frequently Asked Questions

Bluesky posts are limited to 300 graphemes, not 300 characters. A grapheme is a single user-perceived character, so a flag emoji or a complex compound emoji counts as 1 grapheme even though it might be 4 to 11 UTF-16 code units. In practice, plain English text behaves like a 300-character limit.

Twitter's original 280-character limit counted UTF-16 code units, which meant a single emoji could eat 2 to 11 of your characters. Bluesky's AT Protocol uses Intl.Segmenter to count what users actually see, so the count matches your eyes. One emoji equals one grapheme, regardless of how many code points are inside.

Threads posts are capped at 500 characters. Threads is built by Meta and inherits Instagram's UTF-16 character counting, so 500 characters means 500 characters in the conventional sense. Emojis typically count as 2 characters each.

Mastodon's default character limit is 500 per post on most instances, including the flagship mastodon.social. However, individual instance admins can override this. Some instances allow 5,000 or more, while a few set tighter limits. Federated posts that exceed a remote instance's max get truncated when displayed there.

No. Mastodon is federated, and each instance sets its own post character limit. The default is 500, but instances commonly run 1,000, 2,000, or even 5,000+. If you cross-post or want maximum compatibility across the fediverse, write to 500 to be safe.

Yes, if your audience is split across them. Write to the lowest common denominator: 300 graphemes for Bluesky. The same post will fit on Threads (500) and Mastodon (500+) without changes. Tools like Buffer, Postiz, and Croissant handle the distribution, but always preview on the actual platform because grapheme math differs from character math.

Yes. Bluesky supports hashtags (#topic) and mentions (@handle.bsky.social) inside posts. Both count toward the 300-grapheme limit. Hashtags are clickable and lead to a tag feed. Mentions notify the user and link to their profile.

Bluesky display names are capped at 256 characters, and bios (descriptions) are also 256 characters. Handles can be up to 253 characters total, including the .bsky.social suffix or your custom domain. Most users keep display names under 30 characters for readability.

ShareX