Which cap binds, and in what unit
Bluesky character limit: 300 graphemes, and why that is not 300 characters
The Bluesky character limit is 300 graphemes on a post's text — not 300 characters, and the difference is not pedantry: an emoji made of several code points counts as one. The same field also declares a 3,000 maxLength, which is a bound on the encoded size rather than a longer post you can unlock. Both are published in the same machine-readable file, and this page cites it at a pinned commit.
What is the Bluesky character limit?
Two numbers are declared on the same field, in the same file, and they are in different units. Reading either one as “the character limit” is where the confusion starts.
| Value | Declared as | Bounds | Checked by Postdom |
|---|---|---|---|
| 300 | maxGraphemes | What a reader would count as characters. This is the cap that binds an ordinary post. A grapheme is one symbol as you see it — an emoji built from several code points is one grapheme, not several. | Yes |
| 3,000 | maxLength | The encoded size of the same field. Declared on the same property in the same file. It is not a second, larger post limit you can opt into — both apply at once, and for ordinary text the grapheme cap is reached first. | No |
Both figures come from the app.bsky.feed.post lexicon at a pinned commit — machine-readable and first-party, which is rarer than it should be for a fact like this. Checked .
Posting more than the cap
The most common reason people believe a longer post is available is the second number: if the field allows 3,000, surely a 3,000-unit post is possible? No. Both caps apply at once, and for ordinary prose the grapheme cap is reached first by a wide margin. There is no mode, setting or client that turns the larger number into a post length.
The answer to a longer piece is a thread — several posts in a reply chain. That is not a workaround; it is the shape the protocol is built around, which is why the record type is called a post and not a document.
The same lexicon also bounds tags: at most 8, each up to 64 graphemes. Postdom does not check that separately, so it is recorded here rather than presented as something we enforce.
What Postdom checks, and where it is stricter than Bluesky
Postdom checks your caption against 300 UTF-16 code units and flags it on the approval card, so a reviewer sees the overrun before approving the post.
It is a check a person sees, not a rejection. Nothing stops an over-length caption being submitted: the only hard ceiling in the request itself is Postdom’s own general one, far above this figure. If you submit without a review step, this check will not stop you.
It also measures in a different unit from the one Bluesky publishes. A caption dense in emoji — where one symbol costs several code units but counts as a single grapheme — can be inside 300 graphemes and outside 300 code units, so the card flags text Bluesky would have taken. The counter below shows both numbers, so you can see which rule the flag came from rather than guessing.
Bluesky is a destination Postdom publishes to; what it can report back afterwards is a separate question. See how availability states are recorded.
Count your post in both units
- Graphemes
- 0Bluesky’s published cap — 300
- UTF-16 code units
- 0What Postdom’s check measures — 300
Passing here is not Bluesky accepting the post. Postdom's own check is the code-unit figure, which is the stricter of the two.
Questions about the Bluesky character limit
What is the Bluesky character limit?
For a post's text, 300 graphemes. The same field in the same lexicon also declares a maxLength of 3,000, which bounds the encoded size rather than the number of symbols. Both apply at the same time; for ordinary text the grapheme cap is reached long first.
How do I post more than 300 characters on Bluesky?
You do not raise the cap — you thread. The 3,000 maxLength on the same field is the most common reason people believe a longer post is available; it is not a second mode, and nothing in the lexicon exposes one. A longer piece is several posts in a reply chain, which is what the platform is built for.
Do emoji count as one character?
Against Bluesky's published cap, yes — it counts graphemes, and an emoji assembled from several code points is one grapheme. Against Postdom's check, no. Postdom measures with a JavaScript length, which counts UTF-16 code units, so that same emoji costs several. The two disagree and this page says which is which rather than picking one.
What happens when you publish through Postdom?
Postdom checks your caption against 300 UTF-16 code units and flags an overrun on the approval card, so a reviewer sees it before approving. It is a check a person sees rather than a rejection: nothing stops an over-length caption being submitted, and the only hard ceiling in the request itself is Postdom's general one, far above this. It also measures in a different unit from Bluesky's, so a caption dense in emoji can be flagged when Bluesky would have taken it.
Is there a limit on tags?
Yes, and it is in the same file: at most 8 tags, each capped at 64 graphemes. Postdom does not enforce that separately, so it is recorded here rather than claimed as a gate.