> Source: https://www.trackmedia.app/blog/how-to-schedule-posts-on-bluesky · Last updated: 2026-10-06

# How to schedule posts on Bluesky

Bluesky documents no built-in scheduler, so you schedule through a tool that holds the post and publishes it for you. Here is how that works and what to check.

*Guides · Published 2026-10-06*

To schedule posts on Bluesky, you use a scheduling tool, because Bluesky's own help center does not document a scheduler. As of October 6, 2026, a search of that help center for "schedule" returned no articles, and Bluesky's January 26, 2026 product post says that basic features like drafts are still missing.

Below: why a future timestamp is not scheduling, how a scheduler publishes through Bluesky's API, the limits to check first, and how to set it up in TrackMedia. Bluesky facts come from pages we opened on October 6, 2026, listed at the end.

## Does Bluesky have a built-in scheduler?

We found no documented one. We searched [Bluesky's help center for "schedule"](https://blueskyweb.zendesk.com/hc/en-us/search?query=schedule) and for "draft", and both searches returned zero articles. The same search box returned results for "password", so it was working.

Bluesky's January 26, 2026 post [What's Next at Bluesky](https://bsky.social/about/blog/01-26-2026-whats-next-at-bluesky) says that on posting, basic features like drafts are still missing, and that the composer needs better media handling. That post is from January 2026, and we did not open the app's composer, so if your app version shows a schedule option, trust the app over this page.

Bluesky has pointed users to outside tools before. A [July 30, 2024 blog post](https://bsky.social/about/blog/07-30-2024-schedule-and-crosspost-with-buffer) announced a partnership with Buffer, a tool with scheduling and cross-posting features. That post is over two years old, so check any tool's current Bluesky support yourself.

## Why is setting a future date on a post not scheduling?

Every Bluesky post is a record with a required `createdAt` field, and that field is a timestamp the posting app declares. It does not tell Bluesky when to publish. The records are written with the `com.atproto.repo.createRecord` call, which creates a record at the moment it runs.

Three official pages back this up:

- [Posts in-depth](https://bsky.network/docs/about-bluesky-content/posts/) says each post requires `text` and `createdAt`, and its example fills `createdAt` with the current time.
- The [app.bsky.feed.post lexicon](https://raw.githubusercontent.com/bluesky-social/atproto/main/lexicons/app/bsky/feed/post.json) describes `createdAt` as a client-declared timestamp for when the post was originally created.
- The [createRecord lexicon](https://raw.githubusercontent.com/bluesky-social/atproto/main/lexicons/com/atproto/repo/createRecord.json) describes the call as creating a single new repository record. We found no parameter in it that tells the server to hold the record until later.

So a post sent today with next week's `createdAt` is written today. Bluesky's [Timestamps](https://bsky.network/docs/about-bluesky-content/timestamps) page goes further. It says clients may insert any `createdAt` value, and that for chronologically sorted feeds the App View uses the earlier of `createdAt` and `indexedAt`, the time the record was first seen. A future `createdAt` therefore falls back to `indexedAt`, and the post sorts as if it appeared when it was written. We did not test this in the app, and other apps may sort differently, so do not build a schedule on that trick.

![Three lanes. Lane 1: the Bluesky app alone, where you write and post now because no scheduler is documented. Lane 2: a scheduler stores your post, waits, and at the chosen time calls createSession and createRecord, so the post goes live with createdAt set to now. Lane 3: calling createRecord today with a future createdAt writes the record immediately, and Bluesky's App View sorts by the earlier of createdAt and indexedAt, so it is not scheduling.](https://www.trackmedia.app/assets/img/blog/how-to-schedule-posts-on-bluesky-fig1.svg)

*Scheduling on Bluesky means a tool waits, then publishes. A future createdAt does not make Bluesky wait.*

## How do Bluesky scheduling tools work?

Because `createRecord` has no option to hold a record, a scheduler has to do the waiting itself. TrackMedia stores your post in its own database, waits until the time you chose, then signs in to your account and publishes through Bluesky's API at that moment. From Bluesky's side, an ordinary `createRecord` call arrives at the scheduled time. That is why a scheduled Bluesky post exists only in the tool until it goes out, and does not appear in Bluesky's own app beforehand. We have not checked how other tools are built.

Because the tool signs in as you, you need to give it access. The usual route is an app password, which Bluesky's [April 21, 2023 post](https://bsky.social/about/blog/4-21-2023-atproto-developer-ecosystem) describes as a short-term authentication solution that lets you try clients without fully trusting them with your password. Bluesky's [May 7, 2024 roadmap](https://bsky.social/about/blog/05-07-2024-product-roadmap) says OAuth would make app passwords no longer required once it lands. We did not verify whether that has happened, so check what your scheduler asks for.

## What limits should you check before you schedule?

Check length and media first, because Bluesky accepts or rejects a post only when the tool publishes it. TrackMedia's connector, for example, uploads images and video at publish time. The table sets Bluesky's published limits next to how TrackMedia's Bluesky connector is set up.

| Item | Bluesky's schema says | TrackMedia's connector is set to |
| --- | --- | --- |
| Text | 300 graphemes | 300 graphemes |
| Images | Up to 4, each up to 2 MB | Up to 4, each up to 1,000,000 bytes |
| Video | One mp4 file (video/mp4), up to 300 MB | One video, 50 MB, 180 seconds, mp4, mov or webm; never mixed with images |

The text and image rows come from the [app.bsky.feed.post](https://raw.githubusercontent.com/bluesky-social/atproto/main/lexicons/app/bsky/feed/post.json) and [app.bsky.embed.images](https://raw.githubusercontent.com/bluesky-social/atproto/main/lexicons/app/bsky/embed/images.json) lexicons, and the video row from the [app.bsky.embed.video](https://raw.githubusercontent.com/bluesky-social/atproto/main/lexicons/app/bsky/embed/video.json) lexicon. The post lexicon also sets a text limit of 3,000 bytes. A grapheme is one visible character, so an emoji counts once; [Bluesky's Creating a post tutorial](https://bsky.network/docs/bluesky-api/creating-a-post/) shows a family emoji with a length of 25 but a grapheme length of 1.

Bluesky's pages disagree on image size. The Creating a post tutorial says 2 megabytes per image, and Posts in-depth says 1,000,000 bytes in its text while its example code checks for 2,000,000. The image lexicon allows 2 MB and notes the limit was formerly 1 MB, so the 1,000,000-byte figure looks like the older rule. TrackMedia's connector still uses the older figure, so keep scheduled images under it.

Video differs in three ways. The video lexicon accepts only video/mp4, while TrackMedia's connector lists mp4, mov and webm; Bluesky's [September 11, 2024 video announcement](https://bsky.social/about/blog/09-11-2024-video) listed .mp4, .mpeg, .webm and .mov files, but it is over two years old. The lexicon states no duration. That announcement gave 60 seconds, and Bluesky's January 2026 post says three-minute videos are not enough, which points to a current cap of three minutes. We did not verify that cap, so treat 180 seconds as TrackMedia's setting. Finally, Bluesky's [Uploading Video](https://bsky.network/docs/about-bluesky-content/video) guide says Bluesky-hosted accounts need a verified email to upload video and that there are per-day limits on video posts, so a scheduled video can still be refused. If you also post to X, its count works differently, as our [guide to X's character limit](https://www.trackmedia.app/blog/twitter-character-limit) explains.

## How to schedule posts on Bluesky in TrackMedia

You connect Bluesky with an app password, write the post, pick a future time, and TrackMedia publishes it then. TrackMedia holds the schedule itself, so the post sits in your queue until it is due. A sweep checks for due posts every minute.

1. **Create an app password in Bluesky.** The two sources we have disagree on the menu path. TrackMedia's connect form points you to Settings, then Privacy and security, then App passwords. Bluesky's [Help Center article Miscellaneous](https://blueskyweb.zendesk.com/hc/en-us/articles/19002493054861-Miscellaneous) says Settings, then Advanced, then App Passwords. We did not open the app, so go by the labels you see. Never use your account password.
2. **Connect the account.** The form asks for **Handle or email** and **App password**. It also has an optional **PDS URL** field, which is only for people who host their own data server.
3. **Write the post.** Use the master draft, then adjust the Bluesky version if you need to. The composer shows a live character counter for each selected network and a preview. Links, mentions and hashtags are converted to Bluesky's rich-text format automatically, and the connector accepts up to four images (with alt text) or one video.
4. **Choose a date and time.** TrackMedia rejects times in the past.
5. **Check the queue.** A scheduled post can be edited, published now, or unscheduled back to a draft. On the calendar you can drag it to another day.

When the post goes out, TrackMedia stamps `createdAt` with the actual publish time, so the timestamp on Bluesky matches when it appeared. If Bluesky rejects the app password, for example because you revoked it, the post fails with a reason, and the account shows a Reconnect link, with a Retry now option on the failed post. For a wider view of running several accounts from one queue, see [how to manage multiple social media accounts](https://www.trackmedia.app/blog/how-to-manage-multiple-social-media-accounts).

## Can you post on Bluesky and schedule copies elsewhere?

Yes, if you write on Bluesky first. TrackMedia's Crosspost feature can watch your Bluesky account and turn each new post into a copy for other networks you choose. As of October 6, 2026, Bluesky is the only network Crosspost can watch; other networks are destinations only.

Crosspost rules start switched off and in review mode. In review mode each copy waits as a draft in the composer, where you can edit it and give it a time like any other post. It checks Bluesky about every five minutes, so a copy is not instant. It does not copy reposts of other people's posts, and TrackMedia's Crosspost documentation lists replies and reposts as sources among the things not supported yet. Crosspost also needs TrackMedia's background worker to be running, so send a test post before you rely on a rule.

Here the Bluesky post goes out live from the Bluesky app, and only the copies are scheduled. For comparison, our guide to [scheduling and editing posts on X](https://www.trackmedia.app/blog/how-to-schedule-and-edit-posts-on-x) covers a network that does have native scheduling.

## What can't TrackMedia do for Bluesky?

A TrackMedia-scheduled post will not show up in Bluesky's own app until it publishes, because Bluesky has no queue for it to join. TrackMedia also can't schedule from inside the Bluesky app. You see and change the schedule in TrackMedia only. See [how publishing works in TrackMedia](https://www.trackmedia.app/#publish), or [start free with TrackMedia](https://go.trackmedia.app/signup) to put your Bluesky posts in a queue.

## How we checked this

We opened each page below in a browser on October 6, 2026.

- Bluesky Help Center, search results for "schedule" and "draft" (0 results each) and "password" (6 articles), and the article Miscellaneous: https://blueskyweb.zendesk.com/hc/en-us/search?query=schedule and https://blueskyweb.zendesk.com/hc/en-us/articles/19002493054861-Miscellaneous
- Bluesky blog, What's Next at Bluesky (January 26, 2026): https://bsky.social/about/blog/01-26-2026-whats-next-at-bluesky
- Bluesky blog, Schedule and Cross-Post with Buffer (July 30, 2024): https://bsky.social/about/blog/07-30-2024-schedule-and-crosspost-with-buffer
- Bluesky blog, Share video on Bluesky! (September 11, 2024): https://bsky.social/about/blog/09-11-2024-video
- Bluesky blog, The AT Protocol Developer Ecosystem (April 21, 2023): https://bsky.social/about/blog/4-21-2023-atproto-developer-ecosystem
- Bluesky blog, Product Roadmap (May 7, 2024): https://bsky.social/about/blog/05-07-2024-product-roadmap
- Bluesky docs, Creating a post: https://bsky.network/docs/bluesky-api/creating-a-post/ (docs.bsky.app now redirects to bsky.network)
- Bluesky docs, Posts in-depth: https://bsky.network/docs/about-bluesky-content/posts/
- Bluesky docs, Timestamps: https://bsky.network/docs/about-bluesky-content/timestamps
- Bluesky docs, Uploading Video: https://bsky.network/docs/about-bluesky-content/video
- AT Protocol lexicons on GitHub: app/bsky/feed/post.json, app/bsky/embed/images.json, app/bsky/embed/video.json and com/atproto/repo/createRecord.json under https://github.com/bluesky-social/atproto/tree/main/lexicons (read as raw files on main)

TrackMedia statements come from our own product code and documentation, as of the same date. We did not open the Bluesky app's composer or test a future `createdAt` ourselves, so we can't say whether the app now has drafts or scheduling, or how any particular app displays a future-dated post beyond what the Timestamps page says about the App View. We also did not verify Buffer's current Bluesky support, which app password menu path your Bluesky app uses, Bluesky's current video duration cap and accepted video formats, or whether OAuth has replaced app passwords.
