Guide 路 By PostBoost team 路 路 Markdown
Short answer: you can't schedule posts inside Bluesky. The app has had drafts since February 2026, but a draft only goes out when you open the app and press Post. To publish at a set time, connect Bluesky to a scheduler. In PostBoost that takes one sign-in on Bluesky's own page (no app password), then you pick a date and time in the composer and click Schedule. Before you do, paste the text into the free social media character counter to check it fits Bluesky's 300 characters.
What Bluesky can and can't do on its own
| Bluesky app | A scheduler like PostBoost | |
|---|---|---|
| Save a post for later | Yes, Drafts button in the composer | Yes, drafts and a calendar |
| Publish at a set time | No | Yes |
| Publish while you're offline | No | Yes |
| Schedule a thread | No | Yes |
| Post the same update to other networks | No | Yes, one post to all your accounts |
Bluesky's drafts announcement says it plainly: "Not ready to hit post? Keep your best ideas in Drafts until the timing is just right." Bluesky is still the one who has to hit Post when the timing is right.
Why changing the post date doesn't work
Every Bluesky post carries a createdAt date that the posting app fills in. It is tempting to think a future date would hold the post back. It doesn't: the post appears the moment it is written, whatever the date says. Going the other way, the official app marks a post whose date is 24 hours or more before the moment it was published with an "Archived from" label. Scheduling has to happen before the post is written, which is what a scheduler does. PostBoost writes the post at the time you chose and stamps it with that moment.
App password or OAuth: how schedulers connect to Bluesky
Many guides on this topic start with "create an app password in Bluesky's settings and paste it into the tool". That works, but the tool then holds a password-like string for your account, and you revoke it by finding and deleting that password in Bluesky's settings.
Bluesky also supports OAuth (the AT Protocol's sign-in standard), and that is how PostBoost connects:
- You sign in on Bluesky's own page, not in PostBoost, and approve the connection there. PostBoost never sees your password.
- PostBoost asks for the standard posting access Bluesky offers to apps (the
transition:genericlevel in the AT Protocol OAuth spec). That level does not include changing your handle or email, deleting or deactivating the account, or reading direct messages. - The connection refreshes itself; there is no expiry date to track. If the access is ever revoked, the next scheduled post shows as failed instead of vanishing, and connection health explains how to reconnect.
Schedule a Bluesky post in PostBoost
1. Connect your Bluesky account
- In the sidebar, open Accounts (under Configuration; you need to be a workspace admin).
- Click Connect account and choose Bluesky.
- Under Choose your server, keep Bluesky (bsky.social). If you run your own server, pick Custom and enter its full address, such as
https://pds.example.com. - Click Next. Bluesky's sign-in page opens; log in and approve. You land back in PostBoost with the account connected.
2. Write the post
Open a new post and select the Bluesky account. The composer checks Bluesky's rules as you type:
- 300 characters, counted the way Bluesky counts: an emoji is 1, and a link costs only its short form (the domain and a few characters), not the full URL. The Bluesky character limit guide explains the counting.
- Up to 4 images, 1 video or 1 GIF, not mixed. The composer reminds you when an image has no alt text, which Bluesky reads out to people using screen readers.
- Mentions and hashtags become real links. Type
@handle.bsky.socialor#topicand PostBoost turns them into a working mention and a tappable tag when it publishes. - Link cards. A post with no images gets a preview card for its first link, as long as the linked page has a title.
3. Pick the time and schedule
- Click Schedule and choose a date and time. The time zone is shown next to the time; to change it, click the icon beside it, which opens your profile settings.
- Click Done, then Schedule.
The post shows up in the calendar and goes out at that time. Prefer a fixed rhythm? Add to Queue puts the post into the account's next free slot of your posting schedule.
The Schedule panel also has a Best times to post section. Its recommendations appear once the account has at least 10 published posts with imported statistics, and they are based on how your own Bluesky posts performed. Posting to several networks at once? Set a time per account gives each account its own time.
Schedule a Bluesky thread
A thought longer than 300 characters belongs in a thread. Click Add Post in the composer to add the next post. Each part is checked against the 300 on its own (an error names the part, such as "Post #2"), and PostBoost publishes the parts as replies, in order, at the scheduled time. The free thread maker splits a long text into Bluesky-sized posts without cutting a word or a link; paste the parts into the composer.
If the same post also goes to Facebook or Instagram, the button reads Add first comment instead; create a version for the Bluesky account and add the thread parts there.
Schedule Bluesky posts with the API
Bluesky's own API can only post now. PostBoost's REST API takes a date and time. Find the Bluesky account's id with GET /{workspaceUuid}/accounts, then create the post. This one is a two-part thread scheduled for 9:30 New York time:
curl -s -X POST "https://postboost.co/app/api/$WORKSPACE_UUID/posts" \
-H "Authorization: Bearer $POSTBOOST_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"accounts": [31],
"schedule": true,
"date": "2026-10-28",
"time": "09:30",
"timezone": "America/New_York",
"versions": [{
"account_id": 0,
"is_original": true,
"content": [
{ "body": "We cut our weekly report from 40 minutes to 5. Here is the setup 馃У" },
{ "body": "Step 1: one saved filter per client, exported every Monday at 8:00." }
]
}]
}'
Item 0 of content is the post; every later item is the next post of the thread. If a part breaks a Bluesky rule, such as 301 characters, the call is refused with 422 and nothing is created. To check a post without creating it, send the same body to validatePost. See createPost for every field.
Two limits to know when a script schedules for you: the API accepts up to 100 Bluesky posts per account per UTC day (half on the free plan), and it refuses a post that repeats one created for the same account in the last 24 hours unless you set allow_duplicate. Both are in the guardrails docs.
Schedule Bluesky posts from Claude or ChatGPT
With the PostBoost connector added to your AI assistant, you can schedule in plain language:
Write a two-post Bluesky thread announcing our new Monday report template, keep each post under 300 characters, and schedule it for Tuesday at 9:30 New York time.
The assistant finds the account with list-accounts, then calls create-post with the two thread parts, schedule set to scheduled, a scheduled_at such as 2026-10-27 09:30 and the timezone America/New_York. Ask it to run validate-post first if you want the rules checked before anything is saved. Schedule social media posts with Claude walks through the setup.
Before you hit Schedule
- Count it: the social media character counter shows the Bluesky count next to X, Threads and the rest, which matters when one post goes to all of them.
- Check it: the social media post checker flags a post that is too long, has too many images or breaks another network rule.
- Try it on your own account: create a free PostBoost account, connect Bluesky and schedule your first post. Plans are on the pricing page.
Do this in PostBoost
Free tools for this guide
Free tool
Social media character counter
Free character counter for X, Threads, Bluesky, Instagram, LinkedIn, TikTok and more. Counts as each network does, live in your browser.
Free tool
X thread maker: split long text into numbered posts
Split long text into numbered posts for X, Threads, Bluesky or Mastodon. Never cuts a word or a link. Free, no signup, runs in your browser.
Free tool
Social media post checker: check your post before you publish
Check a post before posting: character limits, hashtags, media count, video length and see-more cut-offs for X, Instagram, LinkedIn, TikTok and more.
FAQ
Can you schedule posts on Bluesky?
Not in the Bluesky app. Since February 2026 it can save drafts, but a draft waits until you open the app and press Post. To publish at a set time you need a scheduler that posts for you, such as PostBoost.
Do I need a Bluesky app password to schedule posts?
Not with PostBoost. It connects through Bluesky's own sign-in page (AT Protocol OAuth): you log in on Bluesky, approve the connection, and PostBoost never sees your password. Many schedulers still ask you to create an app password and paste it in.
What can PostBoost do on my Bluesky account?
It asks for the standard posting access Bluesky offers to apps. That access does not include changing your handle or email, deleting or deactivating the account, or reading your direct messages.
Can I schedule a Bluesky thread?
Yes. In the composer, click Add Post to add the next post of the thread. Each part gets its own 300 characters, and PostBoost publishes the parts as replies, in order, at the scheduled time.
Can I change the date on a Bluesky post to schedule it?
No. A post's date (createdAt) is set by the app that writes it, but the post appears as soon as it is written, whatever the date says. The Bluesky app labels a post whose date is 24 hours or more before it was published with "Archived from" and the date.
Does PostBoost work with self-hosted Bluesky servers?
Yes. When you connect, pick Custom instead of Bluesky and enter your server's full address, for example https://pds.example.com. PostBoost signs in through that server.
Sources
- Dataconomy: Bluesky adds draft support (February 10, 2026)
- Bluesky app source: drafts announcement dialog
- AT Protocol specification: OAuth (scopes and the transition:generic permission level)
- Bluesky (AT Protocol) lexicon: app.bsky.feed.post, text 300 graphemes and createdAt
- Bluesky app source: "Archived from" label for back-dated posts
- PostBoost API reference: createPost
- PostBoost docs: guardrails and daily caps per network