πŸ¦‹
Bluesky Counter

Bluesky Character Limit: The Complete 2024 Guide

By DEVBUILDTOOL β€’

If you’ve recently migrated from Twitter or Threads to Bluesky, you might have noticed something strange when writing posts. The Bluesky character limit is officially 300 charactersβ€”but how those characters are counted is entirely different from other platforms.

In this guide, we’ll break down exactly how the Bluesky character limit works, what a "grapheme" is, and how to optimize your posts so you never hit an unexpected error.

What is the Bluesky Character Limit?

The Bluesky character limit is 300 graphemes. Additionally, the underlying AT Protocol enforces a strict 3,000 UTF-8 byte limit per post.

This dual-limit system is unique to Bluesky and is a direct result of its decentralized architecture. To understand why this matters, we need to talk about graphemes.

Characters vs. Graphemes: Why Emoji Count Differently

Most programming languages (like JavaScript) count text using UTF-16 code units. In JavaScript, a simple letter like "a" has a length of 1. But a complex emoji, like the family emoji (πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦), has a length of 11.

If Bluesky counted characters the way Twitter used to, that single emoji would eat up 11 characters of your 300-character limit. Instead, Bluesky uses grapheme clusters.

A grapheme cluster is what a human perceives as a single visual character. Bluesky uses the Intl.Segmenter API to count graphemes. This means:

  • The letter "A" = 1 grapheme
  • The family emoji (πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦) = 1 grapheme
  • The US flag emoji (πŸ‡ΊπŸ‡Έ) = 1 grapheme
  • An "e" with an accent (Γ©) = 1 grapheme

This makes the Bluesky character limit incredibly generous for emoji-heavy posts. You could technically post 300 family emojis in a single post.

The Hidden 3,000 Byte Limit

Because Bluesky is built on the decentralized AT Protocol, every post is a cryptographic record that must be transmitted across the network. To prevent abuse and ensure fast syncing, the network enforces a hard limit of 3,000 UTF-8 bytes per post.

Standard ASCII letters (A-Z, 0-9) are 1 byte each. Most emojis are 4 bytes. That family emoji (πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦)? It’s 25 bytes.

If you try to post 300 family emojis, you will easily stay under the 300 grapheme limit, but you will hit 7,500 bytesβ€”crashing into the 3,000-byte hard limit, and your post will be rejected.

How Bluesky Handles URLs

Another major difference between the Bluesky character limit and Twitter is URL handling.

Twitter automatically wraps every link using its t.co shortener. No matter how long a URL is on Twitter, it always counts as exactly 23 characters.

Bluesky does not wrap URLs. If you paste a 150-character link into a Bluesky post, it will consume 150 of your 300 graphemes. If you frequently share long URLs, you will need to use a third-party link shortener (like Bitly) or risk running out of space for your commentary.

How to Check Your Bluesky Character Limit

Because grapheme and byte counting is complex, you can't just use Microsoft Word or a standard character counter to check your drafts. That's why we built the Bluesky Counter Tool.

Our tool runs the exact same Intl.Segmenter logic that the Bluesky servers use, ensuring your character counts are 100% accurate before you hit publish.