How-to guide

How to Create and Schedule a Bluesky Thread

Last updated: 2026-06-11 · Bluesky · By SocialKit Team

Bluesky has no native scheduler and no in-app thread composer that lets you plan posts in advance. SocialKit fills both gaps: write each post in the thread, attach images or links, set a time, and the whole chain publishes automatically via the AT Protocol — no tab left open, no copy-pasting at midnight.

Before you start

You need a SocialKit account (the 7-day free trial is €0.00 due today) and a Bluesky account. Bluesky uses the AT Protocol rather than a traditional OAuth flow — as of June 2026, connecting a Bluesky account to SocialKit requires generating an app password inside Bluesky itself rather than logging in with your main credentials. This is a deliberate security boundary: SocialKit never sees your primary Bluesky password.

To generate an app password: open Bluesky → Settings → Privacy and Security → App Passwords → Add App Password. Give it a recognisable name (e.g. "SocialKit"), copy the generated password, and paste it into SocialKit's Bluesky connection screen. The app password can be revoked at any time from the same Bluesky settings panel without changing your main password.

Verify this flow matches the current SocialKit and Bluesky UI before proceeding, as both ship updates frequently.

Step by step

  1. Connect your Bluesky account to SocialKit

    In SocialKit, open workspace settings and go to the connected accounts section. Select Bluesky from the platform list. Enter your Bluesky handle (e.g. yourname.bsky.social or a custom domain handle) and the app password you generated — not your main Bluesky login password. As of June 2026, SocialKit authenticates via the AT Protocol API using this app-password credential. Once connected, you should see your Bluesky profile name and avatar confirmed in the accounts list.

    Tip: If you manage multiple Bluesky accounts — for instance a personal handle and a brand handle — connect each separately with its own app password. Each counts as one of your plan's connected accounts.

  2. Open the composer and choose Bluesky as the destination

    Create a new post in SocialKit and select the Bluesky account you just connected as the publishing destination. If you also want to cross-post a version to X, Threads, or Mastodon in the same session, you can add those accounts here too — each gets its own per-platform caption field so you can tailor the text for different character limits and audience expectations.

  3. Enable thread mode and write your first post

    In the Bluesky composer, activate the thread/multi-post toggle (the exact label may vary — look for "Thread" or an "Add post" button beneath the caption field). Your first post becomes the root of the thread. As of June 2026, Bluesky's character limit is 300 graphemes per post — note that this is a grapheme count, not a byte count: a standard ASCII character is one grapheme, a multi-byte emoji or CJK character also counts as one grapheme, but certain combined emoji sequences (e.g. skin-tone modifiers) may count as two or more. Use the SocialKit composer's live character counter or the free Bluesky character-counter tool to verify your count before scheduling.

    Tip: Write your thread opening post as a standalone hook that works on its own — many readers see only the first post in their feed and click through only if it earns their attention.

  4. Add subsequent posts to build the thread chain

    Click "Add post" (or the equivalent in the composer) to append each additional post in the thread. SocialKit constructs the chain as AT Protocol reply refs — each post references the root and its immediate parent — which is what makes it a true thread rather than separate unlinked posts. Write the body of your argument, tutorial, or story across as many posts as you need, keeping each under the 300-grapheme limit. You can attach images to individual posts in the thread (image specs as of June 2026: JPEG or PNG, up to ~1 MB per image, ~2000 × 2000 px recommended — verify against the current Bluesky API limits in the composer).

    Tip: Number your posts lightly if the sequence matters (e.g. "1/" at the start) — readers who quote-post or share a middle post will have context for where it fits in the chain.

  5. Add links, alt text, and any embeds

    Paste URLs into any post in the thread where relevant; Bluesky generates a link card preview using the page's Open Graph tags, displayed inline in the feed. As of June 2026, URLs in Bluesky posts are counted in full toward the 300-grapheme limit — unlike X, Bluesky does not normalize URL length. To preserve space, keep link-heavy posts short on surrounding text. If you are attaching images, add alt text for accessibility: SocialKit should provide an alt-text field alongside each image upload. Alt text does not count toward the grapheme limit.

    Tip: If a URL is too long, shorten it with a custom domain shortener before composing — the full URL length counts against your 300 graphemes.

  6. Set the publish time using best-time data

    Pick a date and time for the thread to publish — SocialKit fires the first post and chains the rest automatically via the AT Protocol, so the whole thread appears in one go rather than dripping out over minutes. Check the /best-time-to-post/bluesky page for current audience-activity windows; as of June 2026 the Bluesky user base skews toward tech, journalism, and creator communities with active periods in the morning and early evening in US Eastern and European time zones. These are starting points, not prescriptions — review your own Bluesky analytics after a few weeks to refine.

  7. Preview and confirm the schedule

    Before finalising, use SocialKit's post-preview or the free Bluesky post-preview tool to check how each post in the thread will render in the Bluesky feed: link cards, image crops, and text truncation can all look different on-screen than in the composer. Once satisfied, click Schedule — SocialKit stores the full thread and publishes automatically at the set time with no further action needed.

    Tip: Schedule threads at least 5–10 minutes ahead of the intended go-live time so the scheduler has buffer to submit all the chained posts via the API without hitting rate limits on high-volume days.

Best practices

  • Keep each post in the thread under 280 graphemes if you plan to cross-post to X — that way the same draft works for both platforms without per-post trimming. SocialKit's per-platform caption field lets you maintain both versions in one composer session.
  • Front-load the value: put the most compelling statement or takeaway in post one, so readers who only see the first post in their feed have a reason to click through to the full thread.
  • Use the 300-grapheme limit as a discipline for each post, not just an upper cap — shorter, punchy posts in a thread tend to retain readers better than posts that run to the exact maximum.
  • Add alt text to every image in the thread; Bluesky's community norms around accessibility are strong, and missing alt text is regularly called out publicly.
  • After publishing, check the thread in a Bluesky client to confirm all reply references resolved correctly — if a post in the chain failed to publish, it will appear as a broken reply rather than silently disappearing.
  • Cross-post the opening post (only) to Mastodon, Threads, or X with a "Full thread on Bluesky:" link — this drives traffic without duplicating the entire thread on every platform.

Good to know

How Bluesky threads work technically (AT Protocol context)

As of June 2026, Bluesky runs on the AT Protocol (atproto.com), a federated protocol where each post is a separate record on your Personal Data Server (PDS). A thread is not a single monolithic object — it is a series of individual posts where each reply record includes a "reply" field referencing both the root post (CID + URI) and the immediate parent post. This is why scheduling a Bluesky thread requires a tool that can construct and submit these reply refs correctly in sequence, rather than simply posting multiple standalone posts.

SocialKit handles this automatically — you write the thread in the composer and the scheduler submits each post in order with the correct AT Protocol reply structure. If you have ever tried to pre-write a thread in a notes app and manually copy-paste each post at publish time, this is the problem SocialKit eliminates.

Because the AT Protocol is actively developed, API behavior and rate limits can shift between releases. If you notice unexpected thread-linking behavior after a Bluesky platform update, reconnecting your Bluesky account in SocialKit's settings and re-checking the composer is usually the first diagnostic step.

The 300-grapheme limit: what counts and what does not

Bluesky's per-post limit is 300 graphemes as of June 2026. In practice:

- Standard Latin characters, numbers, and common punctuation: 1 grapheme each. - Most emoji: 1 grapheme each (the emoji itself is one Unicode code point or a ZWJ sequence that Bluesky counts as one grapheme in most cases, but some complex sequences like flag emoji or keycap sequences may count as more — verify in the live counter). - CJK (Chinese, Japanese, Korean) characters: 1 grapheme each. - Full URLs: counted in full, one grapheme per character. A 60-character URL costs 60 graphemes. - Alt text on images: does NOT count toward the grapheme limit. - Usernames in mentions: count toward the limit.

The free Bluesky character-counter tool at /tools/bluesky-character-counter gives you a live count you can paste text into before opening the composer.

Do it in SocialKit

SocialKit's Bluesky scheduler handles the full thread workflow: compose each post, attach images with alt text, check grapheme counts, and schedule the entire chain to auto-publish via the AT Protocol. No tab left open, no manual copy-pasting. Bluesky is one of 11 platforms on every SocialKit plan — flat pricing, unlimited scheduled posts, 7-day free trial at €0.00 today.

Schedule Bluesky threads with SocialKit
All 11 platforms included

Try it free

Schedule and cross-post to all 11 networks from one calendar on one flat plan. 7-day free trial — €0.00 due today.

Start My Free Trial

€0.00 due today · cancel anytime · 7-day money-back guarantee

FAQ

Frequently asked questions

The questions people ask before they schedule — answered honestly, hedged where platform behavior changes.

Start My Free Trial

€0.00 due today · cancel anytime · 7-day money-back guarantee