Cross-posting

How to cross-post from Threads to Bluesky

Threads and Bluesky are the two text feeds that grew fastest after X’s upheaval, and they make a natural cross-posting pair — same conversational register, same short-post rhythm, different plumbing. The numbers are the first surprise: Threads allows 500 characters and Bluesky 300 graphemes, so two of every five characters have to go. The second surprise is how each one counts: Bluesky measures graphemes (visual characters — emoji count once) against a separate 3,000-byte ceiling, and links consume budget there while community documentation indicates they’re free on Threads.

This guide maps what moves cleanly between the two, what breaks at 300, and the workflow for publishing to both — by hand, or composed once in SocialKit.

Start My Free Trial

€0.00 due today · cancel anytime · 7-day money-back guarantee

Threads vs Bluesky: the spec deltas

Everything that changes between the two composers, side by side.

ThreadsBluesky spec mapping. Limits last verified June 2026; platforms change these quietly, so check the composer when in doubt.
SpecThreads (from)Bluesky (to)
Caption limit500 characters300 graphemes (visual characters — emoji count once)
Video lengthUp to 5 minutesShort clips — Bluesky has been raising limits (around 3 minutes as of early 2026)
HashtagsOne topic tag per post — Threads replaced multi-hashtag culture with a single tagPlain-text hashtags count toward the 300-grapheme limit
Link countingReported not to count toward the limitURL text counts; deleting it after the link card loads frees the graphemes
Images per postCarousels up to 20 photos or videosUp to 4 images, each with a generous alt-text field
ProtocolActivityPub (fediverse sharing, opt-in)AT Protocol (custom feeds, domain handles)

The good news

What transfers cleanly

  • Short conversational posts: anything inside 300 graphemes pastes across unchanged — and the registers are close enough that the same wording usually works on both feeds.
  • Emoji, fairly counted: Bluesky counts graphemes, so even a complex multi-codepoint emoji counts as one — an emoji-flavored Threads post doesn’t balloon in length the way it can on platforms that count code units.
  • Up to four images: Bluesky accepts four images per post, so the first four frames of a Threads carousel carry over — and Bluesky’s alt-text field is far roomier than the post itself.
  • Most video: Bluesky has been raising its video limits (around 3 minutes as of early 2026), so casual clips clear it easily — only Threads videos near the 5-minute cap need a trim.
  • Threading: both platforms support native reply chains, so a sequence rebuilds post-by-post — each link in the chain just has to clear 300 graphemes.

The fine print

What breaks in transit

  • The 200-character overhang: a Threads post that uses its full 500 characters loses 40% in transit. Past light trimming, the honest fix is a rewrite around the single strongest point — or a two-post Bluesky thread.
  • Links start counting: community documentation indicates URLs don’t consume Threads’ budget, but on Bluesky the URL text counts toward the 300 graphemes — a long raw link can eat a third of the post. (The composer usually lets you delete the URL once its link card has loaded, which gives the graphemes back.)
  • The topic tag has no twin: Threads allows one topic tag per post; Bluesky uses plain-text hashtags that count toward the limit and feed search and custom feeds. The tag either becomes a hashtag that earns its graphemes or dissolves into the wording.
  • Alt-text expectations rise: Bluesky’s community treats image descriptions as table stakes far more consistently than Threads does, and the protocol gives alt text a much bigger budget than the post — undescribed images stand out.
  • Audience plumbing: Threads can share posts to the fediverse over ActivityPub, while Bluesky runs the AT Protocol — the two networks don’t interconnect natively (third-party bridges exist), so cross-posting is the dependable way one piece of writing reaches both worlds.
  • @mentions: Bluesky handles are domains (@name.bsky.social, or a custom domain like @name.com), so Threads-style @names need re-tagging — and the matching account may simply not exist there.

Step by step: by hand vs with SocialKit

The manual way

  1. Cut before you paste: find the Threads post’s core claim and rewrite it to fit 300 graphemes — deleting trailing sentences usually beats squeezing every sentence.
  2. Handle links deliberately: paste the URL, let the link card render, then delete the URL text if the card alone carries it — the graphemes return to your budget.
  3. Convert the topic tag to a hashtag only if it genuinely helps discovery in Bluesky search or a custom feed — every character of it counts.
  4. Re-attach up to four images and write alt text for each — the field is generous and the culture expects it.
  5. Re-tag people with their Bluesky handles (domain-style, like @name.bsky.social) after confirming they’re actually there.
  6. Give the Bluesky copy its own posting time, and check replies on both networks — conversations fork immediately once a post lives in two places.

With SocialKit — compose once, customize per network

  1. Compose the Threads version once in SocialKit with both networks selected — the composer counts each network’s limit (500 and 300) as you type.
  2. Tighten the Bluesky variant on the same screen: cut to 300, adjust tags and mentions, keep the Threads original intact — no second app, no re-uploading images.
  3. Schedule both into their own slots and let SocialKit publish automatically.
  4. Compare results in SocialKit’s analytics — over time you’ll see which topics each audience actually responds to, and which deserve both feeds.
Start My Free Trial

€0.00 due today · cancel anytime · 7-day money-back guarantee

Pro tips

Tip 1

Write the 300-grapheme version first when a post is destined for both: expanding to 500 for Threads is painless; compressing 500 to 300 is surgery. The tight draft is the master copy.

Tip 2

Spend graphemes on words, not URLs: the link-card trick — paste, wait for the card, delete the URL text — is the single biggest space saver when cross-posting into Bluesky.

Tip 3

Mind the byte ceiling: Bluesky also enforces 3,000 bytes of UTF-8 per post — plain English never hits it, but emoji-dense posts can fail the byte check before the grapheme one.

FAQ

Threads → Bluesky questions

Start My Free Trial

€0.00 due today · cancel anytime · 7-day money-back guarantee

What is the character limit difference between Threads and Bluesky?

Threads allows 500 characters per post; Bluesky allows 300 graphemes (visual characters, defined in the AT Protocol post schema), with a separate 3,000-byte ceiling on the raw UTF-8 text. In practice, a full-length Threads post has to lose roughly 40% to fit Bluesky.

Do links count toward the limit on Threads and Bluesky?

Differently. Community documentation indicates links don’t count toward Threads’ 500 characters. On Bluesky, the URL text counts toward the 300 graphemes — though the composer usually lets you delete the URL once its link card has loaded, keeping the preview without the character cost.

Can Threads and Bluesky talk to each other directly?

Not natively — Threads federates over ActivityPub (the fediverse it shares with Mastodon), while Bluesky runs the AT Protocol. Third-party bridges exist between the two ecosystems, but for a publishing workflow, cross-posting to each network remains the dependable way to reach both audiences.

How do hashtags differ between Threads and Bluesky?

Threads allows a single topic tag per post instead of traditional hashtags. Bluesky uses plain-text hashtags that count toward the 300-grapheme limit and surface in search and custom feeds — add one only when the tag genuinely helps discovery, because it competes with your words for space.

Post to Threads and Bluesky in one go

Compose once, customize the caption per network, and let SocialKit publish to Threads, Bluesky, and 9 more platforms on schedule — no re-uploading, no copy-paste.

Start My Free Trial

€0.00 due today · cancel anytime · 7-day money-back guarantee