Short answer: Bluesky has no built-in way to schedule posts as of October 2026. Drafts let you save a post for later, but you still have to publish it. To schedule, use a third-party tool connected with an app password, or run a small script that posts for you at the right time.

Below are both routes step by step, a complete free Python scheduler, and the security mistakes to avoid.

On this page:

The Direct Answer

Question Answer
Can the Bluesky app schedule posts? No – not as of October 2026
Does Bluesky have drafts? Yes – since February 2026, but they don't publish on a timer
Can third-party tools schedule? Yes – they post through the Bluesky API
Do they need my password? No – use an app password or Bluesky sign-in
Can I schedule for free? Yes – free tiers, or a script you run yourself
Does scheduling hurt reach? No evidence it does – timing matters more

Are Bluesky Drafts the Same as Scheduling?

No. Bluesky added Drafts in February 2026 (app version 1.116). In the composer you can save a post and pick it up later, and keep several drafts at once. That solves "I want to finish this later", but not "I want this to go out at 9am Tuesday". A draft never publishes itself.

Drafts are still useful in a scheduling workflow: write a batch of posts as drafts, reread them the next day, then move the good ones into your scheduler. Since Bluesky posts can't be edited, rereading before anything goes out matters more than it does on other networks.

How Do You Schedule Bluesky Posts With a Tool?

Most social media schedulers now support Bluesky, alongside a few Bluesky-only ones. The setup is similar everywhere:

  1. Create an app password. In Bluesky, open Settings, then Privacy and security, then App passwords, and create one named after the tool.
  2. Connect the tool. Sign in to the scheduler with your handle and the app password, or through Bluesky's own sign-in screen if the tool offers it. Never use your main password.
  3. Write and schedule the post. Compose the post in the tool, add images and alt text, and pick a date and time.
  4. Check it went out. After the scheduled time, open your profile and confirm the post, its link card and its alt text look right.

Our guide to Bluesky app passwords covers creating and revoking them in detail. The short version: one app password per tool, so you can cut off any one of them without touching the rest.

What Should You Look for in a Bluesky Scheduler?

  • No main password. If a tool asks for your account password rather than an app password or a Bluesky sign-in screen, pick a different tool.
  • Real link cards. The Bluesky API doesn't generate link previews for you; the posting app must fetch the page and attach the card. Good schedulers do; lazy ones post a bare URL.
  • Working links, mentions and hashtags. These are stored as facets alongside the text. A tool that skips them posts text that looks right but isn't clickable.
  • Current media limits. As of October 2026 Bluesky allows up to 10 images, 2 MB each, or one video up to 10 minutes and 300 MB. Older tools may still cap you at four images. See our full limits reference.
  • Alt text on every image. If the tool hides the alt text field, your scheduled images will go out undescribed.
  • Thread support. If you post threads, check the tool links each post as a reply to the one before.

How Do You Schedule Bluesky Posts for Free With Python?

If you're comfortable in a terminal, a scheduler is about 30 lines. This one reads a queue file, posts anything that's due, and marks it done. Run it every few minutes with cron (or Task Scheduler on Windows).

1. Install the library

pip install atproto

2. Write a queue file

Save this as queue.json. Times are in UTC.

[
  {"at": "2026-10-07T14:00:00Z", "text": "Good morning, Bluesky."},
  {"at": "2026-10-08T21:30:00Z", "text": "New post on the blog: https://example.com/post"}
]

3. The script

import json, os
from datetime import datetime, timezone
from atproto import Client, client_utils

QUEUE = "queue.json"

def build(text):
    # Turn URLs into clickable links (facets)
    tb = client_utils.TextBuilder()
    for word in text.split(" "):
        if word.startswith("https://"):
            tb.link(word, word)
        else:
            tb.text(word)
        tb.text(" ")
    return tb

def main():
    with open(QUEUE) as f:
        queue = json.load(f)
    now = datetime.now(timezone.utc)
    due = [p for p in queue if not p.get("done")
           and datetime.fromisoformat(p["at"].replace("Z", "+00:00")) <= now]
    if not due:
        return
    client = Client()
    client.login(os.environ["BSKY_HANDLE"], os.environ["BSKY_APP_PASSWORD"])
    for post in due:
        client.send_post(build(post["text"]))
        post["done"] = True
    with open(QUEUE, "w") as f:
        json.dump(queue, f, indent=2)

if __name__ == "__main__":
    main()

4. Run it on a schedule

Add a crontab line (crontab -e) to check every five minutes:

*/5 * * * * cd /path/to/scheduler && BSKY_HANDLE=you.bsky.social BSKY_APP_PASSWORD=xxxx-xxxx-xxxx-xxxx /usr/bin/python3 post.py

A few notes:

  • Use an app password, kept in an environment variable, never committed to git.
  • The computer must be on. A laptop that's asleep at 9am won't post. A small always-on server works; our Railway deployment guide shows one way to host a job like this.
  • It logs in only when something is due, which keeps you well inside Bluesky's rate limits.
  • Want images, link cards or threads? Our Python posting guide covers each, and the TypeScript bot tutorial does the same in JavaScript.

When Should You Schedule Bluesky Posts?

Bluesky's Following feed is chronological, so a post's best moment is when your followers are actually scrolling. Bluesky's audience skews toward North America and Europe, and activity tends to peak on weekday mornings and evenings in US time zones. Our analysis of Bluesky traffic patterns and the best time to post has the hour-by-hour detail.

Two cautions. First, scheduled posts can't react to the news, so pause your queue when something big is happening; a cheerful promo in the middle of a breaking story lands badly. Second, scheduling isn't a substitute for being around. Replies are where Bluesky growth comes from, as our follower growth guide explains, and those can't be queued.

Frequently Asked Questions

Can you schedule posts on Bluesky?

Not in the official app. As of October 2026 Bluesky has no built-in scheduler. You can schedule posts with a third-party tool or with your own script, both of which post through the Bluesky API at the time you choose.

Are Bluesky drafts the same as scheduling?

No. Drafts, added in February 2026, save an unfinished post so you can come back to it, but you still have to publish it yourself. A draft never goes out on its own.

Is it safe to use a Bluesky scheduling tool?

It can be, if you connect it with an app password or Bluesky's own sign-in rather than your main password. That way you can revoke the tool's access at any time without changing your password.

Can I schedule Bluesky posts for free?

Yes. Several scheduling tools have free tiers, and a short Python script using the atproto library plus cron or another task scheduler costs nothing to run on a computer that stays on.

Will scheduled posts get less reach on Bluesky?

There is no sign that Bluesky treats posts from the API differently. The Following feed is chronological, so timing matters more than the tool you use.

Can I backdate a Bluesky post?

Not cleanly. A post's createdAt time is set by the app that writes it, but Bluesky also records when the network first saw the post, and the official app marks posts dated well before that as archived. Schedule forward instead.

Writing Ahead in Skyscraper

Skyscraper doesn't schedule posts. It's a good place to write the ones you'll schedule, though:

  • Drafts synced through Bluesky's own draft API
  • Posts, replies, quotes and whole threads, with a character counter
  • Up to 10 photos, alt text, GIFs and video
  • App password or OAuth sign-in, with accounts stored in the Keychain

Download Skyscraper →