Cross-posting

How to cross-post from X (Twitter) to Bluesky

On paper, X to Bluesky is a 280-to-300 upgrade. In practice the two networks count differently enough that the same draft can pass one limit and fail the other: X counts characters and bills every link at a flat 23, while Bluesky counts 300 graphemes — emoji count once, but a URL costs its full length. Add domain-based handles, an image cap near 1 MB, and a culture where alt text is expected rather than optional, and the friendliest-looking migration in the text cluster turns out to have real edges.

This guide maps the counting math, the link and handle traps, and the manual versus SocialKit workflow for publishing to both.

Start My Free Trial

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

X (Twitter) vs Bluesky: the spec deltas

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

X (Twitter)Bluesky spec mapping. Limits last verified June 2026; platforms change these quietly, so check the composer when in doubt.
SpecX (Twitter) (from)Bluesky (to)
Primary canvas1600 × 900 px · 16:9 (post image)1200 × 675 px · 16:9 (post image)
Caption limit280 characters (X Premium subscribers can post up to 25,000)300 graphemes (visual characters — emoji count once)
Video lengthAbout 2 minutes 20 seconds for standard accounts; longer uploads are a Premium featureShort clips — Bluesky has been raising limits (around 3 minutes as of early 2026)
HashtagsCount toward the character limit; one or two is the platform normPlain-text hashtags count toward the 300-grapheme limit
Counting modelCharacters — URLs a flat 23, most emoji count twice300 graphemes — emoji count once, URLs at full length
Image file capPhotos up to 5 MBAbout 1 MB (976.56 KB) — larger files are auto-compressed
Handles@username handlesDomain handles — name.bsky.social or your own domain

The good news

What transfers cleanly

  • Plain text: ordinary sentences count the same on both, so a 280-character X post fits Bluesky’s 300 graphemes with about 20 to spare.
  • Emoji-heavy posts get cheaper: X counts most emoji as two characters, Bluesky counts each as one grapheme — a draft that scraped the limit on X gains real room.
  • Images: up to four per post on both, and a 1200 × 675 px (16:9) graphic is a clean default on each; alt text carries over (X allows up to 1,000 characters of it).
  • Threads of replies: self-reply chains are native behavior on both networks — and since Bluesky has no long-post tier, the chain is its long-form format.
  • Short clips: X holds standard accounts to about 2 minutes 20 seconds, which fits Bluesky’s video ceiling — around 3 minutes as of early 2026, and Bluesky has been raising limits.

The fine print

What breaks in transit

  • Link math: a 90-character URL costs 23 characters on X and 90 graphemes on Bluesky — nearly a third of the budget. The Bluesky-native fix is a link card: attach the card, then delete the raw URL from the text.
  • Pasted t.co links: copying your live X post copies X’s wrapped redirect URLs. Rebuild every link from the original before it touches Bluesky.
  • @mentions: Bluesky handles are domains — yourname.bsky.social, or your own domain — so no X mention survives the trip; every account needs re-finding.
  • X Premium long posts: there is no 25,000-character tier on Bluesky, paid or otherwise; anything past 300 graphemes becomes a thread.
  • Heavy images: X accepts photos up to 5 MB; Bluesky compresses anything over roughly 1 MB (976.56 KB, the AT Protocol’s blob cap) — fine for photos, rough on fine-text screenshots you didn’t export deliberately.
  • Discovery assumptions: Bluesky has no single algorithmic For You feed to chase — hashtags work but count toward the 300, and reach flows through custom feeds, search, and reposts instead.

Step by step: by hand vs with SocialKit

The manual way

  1. Copy from your draft, not the live post, so links arrive unwrapped.
  2. Re-check the count against 300 graphemes, remembering any raw URL counts at full length.
  3. Convert the link to a card: paste the URL, let the composer attach the preview, then delete the URL text to win the graphemes back.
  4. Re-find every mentioned account by its Bluesky handle — domains, not usernames.
  5. Re-export images under 1 MB yourself (resize, then JPEG or WebP) instead of letting the client compress them, and write alt text for each.
  6. Post or schedule in Bluesky’s own active hours rather than mirroring your X timing.

With SocialKit — compose once, customize per network

  1. Compose once and select X and Bluesky — plus Threads or Mastodon if you publish across the whole text stack.
  2. Customize per network with live counts on one screen: trim the X variant against 280 and the Bluesky variant against 300, instead of playing character golf across two tabs.
  3. Schedule each network into its own slot and let SocialKit publish automatically.
  4. Read the per-network numbers in SocialKit’s analytics — X and Bluesky audiences reward noticeably different posts, and the data shows which is which for yours.
Start My Free Trial

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

Pro tips

Tip 1

Draft link posts Bluesky-style everywhere: headline text plus an attached card, no raw URL in the copy. It reads cleaner on X too, and the draft becomes portable.

Tip 2

Set a custom domain as your Bluesky handle (yourbrand.com) — it doubles as Bluesky’s native form of verification and makes your mention target unambiguous.

Tip 3

Treat alt text as distribution work, not just accessibility: many Bluesky users won’t repost images without it, so the two honest sentences you write travel further than any tag.

FAQ

X (Twitter) → Bluesky questions

Start My Free Trial

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

Is Bluesky’s 300 limit really bigger than X’s 280?

For plain text, yes — about 20 characters bigger. For posts with links it can be effectively smaller, because X charges a flat 23 characters per URL while Bluesky counts the full link text against the 300 graphemes. Emoji flip the other way: most count as two characters on X and one grapheme on Bluesky.

How do I share links on Bluesky without losing a third of the limit?

Use a link card: paste the URL, let the composer attach the card preview, then delete the URL text from the post. The card keeps the preview and the click, and the graphemes come back. Never reuse the t.co link from your X post — rebuild the real URL.

What happens to X Premium long posts on Bluesky?

They don’t fit — Bluesky has no long-post tier. Split long content into a reply-to-yourself thread with the first post doing the selling, or publish the piece elsewhere and share it with a link card.

Why do my screenshots look worse on Bluesky than on X?

File size. X accepts images up to 5 MB; Bluesky’s protocol caps image blobs near 1 MB (976.56 KB) and compresses anything bigger automatically. Export deliberately — 2,000 px or less on the long side, saved as JPEG or WebP under the cap — and the automatic compressor never touches your image.

Post to X (Twitter) and Bluesky in one go

Compose once, customize the caption per network, and let SocialKit publish to X (Twitter), 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