Write it once.X and Bluesky both get a real post.
Tick both networks on a draft and each one is published through its own API as a native post, threads included. Connecting Bluesky takes no API key, because Bluesky issues none, and no password ever reaches OpenTweet.
Last updated: September 2026
7-day free trial. Cancel anytime.
Depth on X, plus a mirror
OpenTweet is an X-native tool and everything deep in it lives on X: analytics, evergreen recycling, connectors, DM campaigns, Articles, and an MCP server for agents. Cross-posting mirrors what you write there to Bluesky. It is two networks done properly, not nine done thinly, and OpenTweet is not the right tool if you need one API that posts everywhere.What you actually do
Four things, and only the first one happens more than once.
Connect Bluesky once
Type your handle, approve OpenTweet on your own server, and you are done. There is no developer console step because Bluesky has no developer console. Your X account is already connected the same way it always was.
Write the post once
One draft, one editor. Text, images, alt text, and thread parts are written a single time. Nothing is duplicated into a second composer for a second network.
Pick the networks
Every composer carries a platform choice. Tick X, tick Bluesky, or tick both. Turn on automatic cross-posting and both are ticked by default, so you only touch the control when you want a post to go to one network only.
Each network gets its own post
At publish time OpenTweet delivers to each target separately through that network’s own API, then records the outcome per network: published, failed, or skipped with a reason.
Why this is harder to copy than it looks
Nothing to apply for on Bluesky
Bluesky issues no API keys and runs no developer program. There is no application, no approval wait, and no tier to negotiate before your first cross-post goes out.
No password, and no App Password
OpenTweet uses atproto OAuth. You sign in on your own server and OpenTweet keeps a scoped grant. Tools that ask you to paste an App Password are asking for a credential with close to full account access.
Self-hosted servers work
OAuth resolves your personal data server from your handle, so an account on a server you run yourself connects exactly like one on bsky.social. No host is hardcoded anywhere in the flow.
Native posts, not mirrors of a link
Each network gets a real post published through its own API. Threads post as real reply chains on both, with per-part text and images.
A post that does not fit is skipped, not dropped
Too long for one network and fine on the other? It publishes where it fits and is skipped where it does not, with the reason recorded against the post.
One queue and one calendar
A cross-posted draft is one record on the same calendar as everything else. Reschedule it once and both networks move with it.
The limits on each network, exactly
The two networks disagree about almost every number, so a single draft cannot always satisfy both. OpenTweet checks against these before publishing rather than truncating your words to make them fit.
| X | Bluesky | |
|---|---|---|
| Text length | 280 characters, or 25,000 on Premium | 300 characters |
| Images per post | Supported | Up to 4, 2MB each |
| Per-image alt text | Supported | Supported |
| Threads | Supported | Supported, as a real reply chain |
| Video | Supported | Not supported |
| Analytics read back | Supported | Not supported |
Bluesky counts graphemes, so an emoji or an accented letter costs one character, not several.
What happens when a post does not fit both
This is the case every cross-posting tool has to answer, and most answer it by truncating or by failing the whole post.
What OpenTweet does
- Publishes to every network the post fits
- Skips the network it does not fit, and says why
- Records the outcome per network on the post itself
- Leaves your text exactly as you wrote it
What it does not do
- Truncate the text to fit the smaller limit
- Fail the whole post because one network refused it
- Split a single post into a thread without being asked
- Quietly drop a network and report success
A 350-character post on a Premium X account publishes on X and is skipped on Bluesky, which stops at 300. The same post from an agent comes back with that outcome in the response, so the agent can decide whether to rewrite it. See the API response shape.
What cross-posting does not cover
Worth stating plainly, because a tool that claims parity across networks usually has less on both.
Built
- Single posts and threads on both networks
- Images with per-image alt text
- Scheduling, the queue, and the calendar
- The platforms parameter on the REST API and MCP
Not built
- Bluesky analytics. Engagement is never read back
- Video cross-posting to Bluesky
- Feeds, follows, likes, or replies on Bluesky
- Evergreen recycling and DM campaigns, which stay X-only
Frequently asked questions
What does cross-posting actually produce on each network?
A native post on each one. Not a link on Bluesky pointing at your tweet, and not a screenshot. The text is published through each network’s own API as a post that stands on its own, and a thread posts as a real reply chain on both.
Do I need a Bluesky API key to cross-post?
No, and neither does anything else. Bluesky issues no API keys and runs no developer program, so there is no form, no approval queue, and no rate-limit tier to negotiate. You connect by authorizing OpenTweet on the server that holds your account, through atproto OAuth.
Does OpenTweet want my Bluesky password or an App Password?
Neither. You sign in on your own server and OpenTweet stores a scoped OAuth grant instead of a credential. An App Password can do close to everything your account can do, which is why atproto OAuth is replacing it. OpenTweet never sees your password.
What happens when a post is too long for one of the networks?
It is skipped on that network with a stated reason, and it still goes out everywhere it fits. Bluesky allows 300 characters and X allows 280, or 25,000 on Premium, so a 400-character post publishes on a Premium X account and is skipped on Bluesky. The post record tells you which network was skipped and why, rather than failing the whole thing or silently truncating your words.
Do threads cross-post?
Yes. Write the thread once and each network gets a real reply chain, with each part carrying its own text and images. Per-image alt text carries across from the same draft.
Can I cross-post video to Bluesky?
No. Video cross-posting to Bluesky is not supported. Images are, up to 4 per post at 2MB each, with alt text.
Does OpenTweet show Bluesky analytics?
No. Analytics in OpenTweet cover X only. Nothing reads your Bluesky engagement back, so there are no Bluesky impressions, no Bluesky top posts, and no Bluesky best-time data anywhere in the product.
Can I cross-post to LinkedIn, Threads, Instagram, or TikTok?
Not today. OpenTweet publishes to X and Bluesky. LinkedIn and Threads are on the roadmap and are not shipped, so nothing posts to them yet and there is no date to give you. Instagram and TikTok are not planned. If you need one API that posts to Instagram, LinkedIn, Facebook, and TikTok at once, a multi-platform tool is the right call and OpenTweet is not it.
Which plans include cross-posting?
Every paid plan, from $11.99 a month. Pro connects 1 Bluesky account, Advanced 3, and Agency 10, matching the X account count on the same plan. There is no separate cross-posting fee and no per-post charge.
Keep exploring
The how-to, the Bluesky connection itself, and the API surface behind it.
How to cross-post, step by step
Connect Bluesky, target networks on a post, turn on automatic cross-posting, and read the per-network results.
Bluesky scheduler
The Bluesky side on its own: atproto OAuth versus App Passwords, and what the connection actually grants.
REST API reference
The platforms parameter, the results array, and the default that surprises agent authors.
The visual calendar
One queue for both networks. Drag a cross-posted draft to a new slot and both targets move with it.
X Articles
Long-form Articles written in markdown and scheduled, the X-native format Bluesky has no answer to.
Pricing
Three plans from $11.99 a month. Cross-posting is on all of them at no extra cost.
One draft. Two networks. No second composer.
Connect Bluesky over atproto OAuth in under a minute, tick both networks on your next post, and each one gets a native post of its own. Included on every plan from $11.99 a month.