How-to guide

How to cross-postfrom X to Bluesky

Connect Bluesky, choose where a post goes, make cross-posting the default, and understand the per-network result you get back. About five minutes, and the connection step happens once.

Last updated: September 2026

7-day free trial. Cancel anytime.

Before you start

You need an X account connected, which you already have, and a Bluesky account on any server. You do not need a Bluesky API key, a developer account, or an App Password. None of those exist to get, and OpenTweet does not ask for the one that does.

The four steps

  1. Connect your Bluesky account

    Type your handle, yourname.bsky.social or your own domain. OpenTweet works out which server holds the account from the handle itself and sends you there to sign in and approve. That page belongs to your server, not to OpenTweet, so your password is typed where it already lives. There is nothing to apply for first: Bluesky issues no API keys and runs no developer program.

  2. Pick the networks on a post

    Every composer carries a platform picker. Tick X, tick Bluesky, or tick both, then schedule or publish as usual. This is a per-post choice and it always wins over the automatic setting, so a post you want on one network only is one click away.

  3. Turn on automatic cross-posting

    With automatic cross-posting on, a post that names no networks of its own goes to every connected platform. This is what makes cross-posting the default rather than a step you have to remember. It applies to new posts, so anything you already scheduled keeps the targets it was saved with.

  4. Read the per-network result

    Each published post carries one result per network: published, failed, or skipped, and a skip carries the reason. Check this after your first cross-post rather than assuming both networks took it, because the two networks disagree about length and media.

Per-post picker or automatic setting, and which wins

These are two different controls and mixing them up is the one thing that surprises people. The per-post picker always wins.

The picker on a post

  • Decides where that one post goes
  • Set it and the automatic setting is ignored for that post
  • Use it for a post that belongs on one network only
  • Available on every composer, including scheduled posts

Automatic cross-posting

  • Decides where a post goes when you pick nothing
  • On means a post with no picker choice goes to every connected platform
  • Applies to new posts, not to ones already scheduled
  • This is also the rule the API follows, which matters if an agent writes your posts

Writing posts from code or an agent? Omitting the platform list is not the same as pinning to X. Read the API note before you ship it.

Why a post gets skipped, and what to do

A skip is not a failure. The post still went out everywhere it fit, and the reason is recorded so you can fix the draft rather than hunt for it.

What you seeWhyWhat to do
Skipped on Bluesky, published on X
The text is over 300 characters. X allows 280, or 25,000 on Premium, so a long post is legal on X and too long for Bluesky.
Shorten it under 300, or split it into a thread. Threads cross-post as real reply chains on both networks.
Skipped on Bluesky, video attached
Video cross-posting to Bluesky is not supported.
Publish the video post to X only, and write a separate text or image post for Bluesky.
Skipped on Bluesky, too many images
Bluesky takes at most 4 images per post, 2MB each.
Cut to 4 images inside the size limit, or spread them across thread parts.
Published on Bluesky, failed on X
Something on the X side refused the post. Networks are delivered separately, so one failing does not stop the other.
Read the error recorded against the post. The Bluesky copy is already live and does not need republishing.

Bluesky counts graphemes, so an emoji or an accented letter costs one character, not several.

Writing one draft that lands on both

The 300-character Bluesky ceiling is the constraint that decides almost everything else.

Lands on both

  • Under 280 characters, which clears both ceilings
  • Up to 4 images at 2MB each, with alt text
  • A thread, with each part written short
  • Plain text and links

X only

  • Anything over 300 characters, including long Premium posts
  • Video
  • X Articles, X Communities, and DM campaigns
  • Anything you want analytics on, which stay X-only

Frequently asked questions

Where do I turn cross-posting on?

In two places, and they do different jobs. The platform picker on a post decides where that one post goes. The automatic cross-posting setting decides where a post goes when you do not pick anything. Turning the setting on does not rewrite posts you already scheduled.

Why was my post skipped on Bluesky?

Almost always length. Bluesky stops at 300 characters and X allows 280, or 25,000 on Premium, so a post written for a Premium X account can be far too long for Bluesky. Video is the other common reason: video cross-posting to Bluesky is not supported. The skip reason is recorded on the post, so you do not have to guess.

Does a skipped network stop the post from publishing anywhere?

No. Each network is delivered separately. A post that is too long for Bluesky still publishes on X, and a post that fails on X still publishes on Bluesky. The per-network result tells you exactly which one did what.

Can I cross-post a thread?

Yes. A thread posts as a real reply chain on both networks, with each part carrying its own text and images. Per-image alt text carries across from the same draft.

How many images can I attach when cross-posting?

Bluesky takes up to 4 images per post at 2MB each, with alt text on each one. Keep an image-heavy post inside those numbers if you want it to land on both networks.

Do I need a Bluesky App Password?

No. OpenTweet connects over atproto OAuth, so you sign in on the server that holds your account and OpenTweet stores a scoped grant instead of a credential. It never asks for your password or an App Password.

I self-host my Bluesky account. Does this work?

Yes. OAuth resolves your personal data server from your handle, so an account on a server you run connects the same way as one on bsky.social. Your handle can be your own domain.

Will I see how the Bluesky copy performed?

No. Analytics in OpenTweet cover X only. Nothing reads Bluesky engagement back, so the Bluesky side is publishing and scheduling, with no impressions, top posts, or best-time data.

Cross-post your next thread to both networks

Connect Bluesky over atproto OAuth in under a minute, then tick both networks on your next post. Included on every plan from $11.99 a month.