Bluesky Post Formatter & Preview
Compose and preview your Bluesky post in real time β see exactly how links, @mentions, and #hashtags will render. Toggle between light and dark mode before you hit publish.
π‘ How Bluesky Renders Rich Text
Bluesky uses rich-text facets β byte-range annotations stored alongside post text. Links (app.bsky.richtext.facet#link), mentions (#mention), and hashtags (#tag) each resolve as a separate facet type. This preview simulates that rendering.
Compose Post
This is a preview mockup β not connected to Bluesky's live API.
Bluesky Rich Text Facets Explained
How AT Protocol encodes links, mentions, and hashtags in every post
Link Facets
app.bsky.richtext.facet#link stores the byte-start and byte-end of a URL in the post text along with the resolved uri. The displayed URL text is always the full original URL β no t.co wrapping.
Mention Facets
app.bsky.richtext.facet#mention resolves an @handle.domain string to a user's DID (Decentralized Identifier) at post time. This means mentions remain valid even if the user changes their handle later.
Hashtag Facets
app.bsky.richtext.facet#tag marks a #word token as a searchable tag facet. The tag value strips the leading #. Tags are case-insensitive for search but rendered as-written.
Formatting Tips for Bluesky
Use full handles for mentions: Unlike Twitter, Bluesky handles include a domain (e.g., @user.bsky.social). Omitting the domain means the mention won't resolve as a facet.
Place links before hashtags: Because facets use byte ranges, putting long URLs at the end of your post keeps readability high and lets readers see your core message first.
Limit hashtags to 1β3: The Bluesky algorithm rewards genuine, focused tagging. Stacking 10 hashtags is a spam signal and can reduce your post's reach.
Preview in dark mode: Bluesky's mobile app defaults to the user's OS dark mode. Check that your formatting is readable against dark backgrounds, especially for inline code or light-colored emoji.