Bluesky character limit and counter

A Bluesky post can be 300 characters (graphemes) and 3,000 bytes long. A grapheme is one character as you see it, so an emoji counts as one. This counter checks both limits, plus the display name and bio limits from Bluesky's profile lexicon.

Runs in your browser.

Text and files stay on your device.

Maintained by the bundle.social team, last updated . How we check the numbers

0 of 300 characters, 300 remaining

Post: 300 characters

Characters0
Remaining300Limit 300
Hashtags0
Mentions0
Bytes (limit 3,000)0Bluesky also caps a post at 3,000 UTF-8 bytes.
Limit used0%
Nothing to check yet

Platform limit: 300 characters as you see them (graphemes). Source: AT Protocol lexicon app.bsky.feed.post, read 1 November 2026.

Limit read from the platform's documentation

The lexicon sets maxGraphemes 300 and maxLength 3000 bytes; a post must satisfy both.

bundle.social API limit: 300 characters. bundle.social validates 300 UTF-16 units, which is stricter than 300 graphemes for emoji-heavy text.

Words0
Lines0
More figures
Graphemes0Characters as you see them
Code points0
UTF-16 units0
UTF-8 bytes0
Paragraphs0

How to use

  1. 01

    Paste the post or reply

    Post and Reply share the same lexicon limits; Display name and Profile bio have their own. The main figure is graphemes against 300; the bytes figure sits under it against 3,000.
  2. 02

    Check both figures

    A post made of emoji or CJK can be under 300 graphemes and still exceed 3,000 bytes. Either one over means Bluesky rejects the record.
  3. 03

    Mind the bundle.social figure

    bundle.social validates 300 UTF-16 units, which is stricter than 300 graphemes when the text has emoji. The figures panel shows the UTF-16 count too.
  4. 04

    Copy

    Copy the text when the status reads "Within the limit" and paste it into Bluesky or your scheduler.

What is the Bluesky post limit in graphemes and bytes?

AT Protocol lexicons describe string fields with maxGraphemes, the number of user-perceived characters, and maxLength, the number of UTF-8 bytes. For a post they are 300 and 3,000. A grapheme can be a single ASCII letter (1 byte) or an emoji sequence such as a family with skin tones (41 bytes), so a short-looking post can fail on bytes. Most text in Latin scripts is nowhere near 3,000 bytes at 300 graphemes; emoji-only or CJK posts are where the second limit bites.

What are the Bluesky display name and bio limits?

They come from a second lexicon, app.bsky.actor.profile. A display name can hold 64 graphemes and 640 bytes, and the profile description (the bio) 256 graphemes and 2,560 bytes. As with posts, both numbers apply at once. Pick Display name or Profile bio in the field select to count them; bundle.social does not edit profiles, so there is no API limit for these two fields.

Limitations

  • Grapheme counting needs Intl.Segmenter. In a browser without it the tool counts code points instead and says so; emoji sequences then count as more than one.
  • Links count at their full length in graphemes and bytes. Bluesky clients may display them shortened, but the record still holds the full URL.
  • Facets (mentions, links and tags marked up in the record) are not generated here; this tool counts the plain text only.
  • The 3,000-byte limit is checked on the UTF-8 encoding of the text, which is what the lexicon's maxLength refers to.

bundle.social is not affiliated with, endorsed by, or sponsored by Instagram, Facebook, Meta, X, TikTok, LinkedIn, YouTube, Threads, Bluesky, Pinterest or any other platform named here. Platform names and logos belong to their owners and are used only to describe compatibility.

FAQ

What is the Bluesky character limit?

A Bluesky post can hold 300 graphemes and 3,000 UTF-8 bytes, and it must satisfy both. A grapheme is one character as you see it, so an emoji counts as one. The limits come from the AT Protocol lexicon app.bsky.feed.post, read 1 November 2026. bundle.social validates 300 UTF-16 units instead, which is stricter for emoji-heavy text.

Does a family emoji count as one character on Bluesky?

Yes, as one grapheme. The four-person family emoji still costs 25 bytes toward the 3,000-byte limit and 11 UTF-16 units toward the figure bundle.social validates; with skin tones it is 41 bytes and 19 UTF-16 units.

Why does bundle.social reject a post that Bluesky would accept?

bundle.social validates Bluesky text at 300 UTF-16 units, which is stricter than 300 graphemes for text with emoji or astral characters. The UTF-16 figure in "More figures" is the one to watch when publishing through the API.

Are replies limited differently?

No. A reply is the same post record type, so 300 graphemes and 3,000 bytes apply.

Do mentions and links count?

Their text does. Bluesky adds mentions and links as facets over the text, but the text itself still contains the handle or URL and counts in full.

What if my browser has no Intl.Segmenter?

The tool falls back to counting code points and shows a notice. Modern Chrome, Edge, Safari and Firefox all ship Intl.Segmenter.

Related tools and guides

Publish what you prepared

bundle.social schedules and publishes posts to 15 networks from one dashboard or one API. The free plan needs no card.