Raise app.bsky.feed.post grapheme limit to 2000 while preserving short-form client presentation #5171
Replies: 1 comment
|
Adding one more framing here, and tagging @estrattonbailey since they gave helpful feedback on the related social-app PR that this would be a frontend/backend/moderation paradigm Bluesky is not currently ready to support. I think the gap is not quite "long-form content." The apps mentioned in the PR thread - Leaflet, PCKT, Offprint, Lemma, etc. - are useful, but they solve a different problem: articles, notes, newsletters, or blog-like publishing. What seems missing is medium-form social posting:
That middle layer matters if Bluesky/ATProto wants to be a viable off-ramp from Meta-style social media. A lot of people do not want to write a blog post or publish an article; they want a normal social post with enough room for a caption, explanation, recommendation, event note, or nuanced personal update. So the question I am trying to ask is slightly different from "should Bluesky support long-form content inline?" It is: Should ATProto have a native medium-form social post surface, even if individual clients preserve compact timelines with truncation / Show More / local composer limits? If the answer is still no, it would be helpful to understand what specifically makes medium-form posts too large a paradigm shift:
I think documenting that distinction would help contributors understand whether the path forward is "not now," "different lexicon," "different client affordance," or "not aligned with Bluesky's product direction." |
Uh oh!
There was an error while loading. Please reload this page.
Proposal
Raise
app.bsky.feed.post.text.maxGraphemesfrom300to2000, while keepingmaxLength: 3000or adjusting it only as needed for Unicode/code-unit safety.This would separate protocol capacity from client presentation:
Why this belongs at the lexicon layer
The current
app.bsky.feed.postlexicon allowstext.maxLength: 3000but capstext.maxGraphemes: 300. That means client-side changes alone cannot make longer posts work reliably; clients that raise their composer limit will still create records rejected by lexicon validation.Keeping the protocol-level ceiling at 300 also forces every app.bsky client into the same microblogging composition model. That is a product choice that makes sense for the official Bluesky timeline, but it is a surprisingly strict constraint for a federated social protocol intended to support many clients and presentation styles.
User demand / existing Bluesky issues
This proposal builds on recurring social-app feedback:
maxLength/maxGraphemessplit.I also opened a draft social-app PR for the client-side constant change, but it intentionally remains a draft because the lexicon currently rejects posts over 300 graphemes:
Why 2000, not 500
I understand 2000 is a product-sensitive number. I am proposing it specifically as a protocol ceiling, not as a requirement that every client render 2000 characters inline.
The strongest argument for a larger ceiling is that smaller increases still preserve the same "editing tax" dynamic. Research on Twitter's move from 140 to 280 found that hard limits create "squeezing" behavior: users write more tersely, use more abbreviations, and continue clustering near the new ceiling after the increase. A later study found that cramming re-emerged at 280 and that a larger limit would be needed to reduce it further.
In other words: moving from 300 to 500 helps, but it still leaves the protocol in the business of forcing compression. A 2000-grapheme ceiling gives users enough room for context, accessibility, and nuance while leaving timeline aesthetics to clients.
External precedent
Several short-form or microblog-adjacent platforms already separate composition capacity from timeline readability:
Accessibility / communication benefits
A hard 300-grapheme limit often requires users to remove context, hedge words, examples, and connective language. That is not just a style issue. It can make posts harder to understand, especially for technical explanations, conflict-sensitive topics, accessibility-related posts, multilingual users, and neurodivergent users who rely on precise phrasing to avoid misinterpretation.
The proposal is not that every post should be long. It is that the protocol should not require every complete thought to be split into a thread when one bounded record would be clearer.
Compatibility and implementation sketch
A staged rollout could make this less risky:
maxGraphemes: 300tomaxGraphemes: 2000.For clients that want a stricter product experience, nothing about this prevents keeping a local 300-character composer limit or truncating aggressively in feeds.
Open questions
maxLength: 3000be revisited at the same time?Sources
app.bsky.feed.postlexicon:text.maxLength: 3000,text.maxGraphemes: 300All reactions