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

What the two halves cost

Only one of these networks bills you, and it is not the one people ask about.

Bluesky issues no API key, runs no developer program, and charges nothing to post. Its half of a cross-posting bill is $0 at every volume. Everything you could pay is an X call, which on pay-per-use is $0.015 to create a post and $0.20 if the text contains a URL, 13 times the plain rate.

That link fee is what decides the number. Three posts a day with one in three carrying a link is 60 plain posts and 30 link posts, so $6.90 a month on X and nothing on Bluesky. Make every post a link, which is what a release or blog feed looks like, and the same volume is $18.00. Reads are separate again at $0.005 per post returned.

Through OpenTweet there is no per-post fee on either network and no X developer account to hold, so both halves sit inside the flat plan price from $19.99 a month. That includes 1 link post a day; more are included on Advanced ($29, 10 a day) and Agency ($49, 20 a day), or as an add-on. The rate-by-rate breakdown, the worked monthly examples, and the volume at which raw pay-per-use is genuinely the cheaper option are in what cross-posting actually costs.

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.

Does cross-posting to Bluesky cost extra?

Nothing on the Bluesky side. Bluesky issues no API key and charges nothing to post, at any volume. The only half of a cross-posting setup that costs money is X, which on pay-per-use bills $0.015 per post and $0.20 if the post contains a link. Through OpenTweet both networks are covered by the flat plan price with no per-post fee. Link posts are included on Pro (1 a day), Advanced ($29/mo, 10 a day) and Agency ($49/mo, 20 a day), with link credits as an add-on.

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 $19.99 a month.