Bluesky

Bluesky scheduling with real links, mentions and hashtags

Bluesky posts only turn links, mentions and hashtags into clickable text when the app tells it exactly where they are. Postwoo does that for you, counts the 300-character limit the way Bluesky does, shrinks large images to fit, and connects with an app password you can revoke any time.

What agencies use it for

  • Text posts with clickable links, @mentions and #hashtags
  • Up to four images with alt text, or a link card
  • Likes, reposts, replies and quotes per post
  • Follower counts tracked day by day from the moment you connect
Capability matrix

Exactly what Bluesky allows

Live from the integration itself. Statuses move from pending verification to supported only after an end-to-end check with approved credentials.

OAuth connectionApp-password login (com.atproto.server.createSession) stored as an encrypted session; sessions refresh with refreshSession. AT Protocol OAuth (DPoP) is the planned long-term path.pending
Account discoveryapp.bsky.actor.getProfile for the session DID — one account per connection.pending
Location discoveryBluesky accounts have no sub-locations.not possible
Publish text postscom.atproto.repo.createRecord app.bsky.feed.post with text ≤300 graphemes and facets for links, @mentions (resolveHandle → DID) and #hashtags computed on UTF-8 byte offsets.pending
Publish a single imagecom.atproto.repo.uploadBlob (JPEG/PNG ≤1,000,000 bytes; larger images are re-encoded/downscaled with GD) + app.bsky.embed.images with alt text.pending
Publish multiple imagesUp to 4 images in one app.bsky.embed.images embed.pending
Publish videoapp.bsky.embed.video exists (uploads go through the video service with a service auth token); not built yet.planned
Attach a linkapp.bsky.embed.external {uri, title, description} for a link without images (no thumbnail unless media is provided); with images the URL is added to the text as a link facet.pending
Call-to-action buttonBluesky has no call-to-action buttons.not possible
Native platform schedulingThe AT Protocol has no scheduled publish time; Postwoo schedules and publishes at the right time.not possible
Delete postscom.atproto.repo.deleteRecord {repo, collection, rkey}.pending
Edit published postsBluesky posts cannot be edited (a putRecord would change the CID and break likes/replies); delete and repost instead.not possible
Direct media uploadDirect upload of image bytes via uploadBlob — no public media URL is needed.pending
Account-level analyticsfollowersCount / postsCount from getProfile as a daily snapshot; Bluesky keeps no history, so days before Postwoo's own snapshots are marked unavailable.pending
Post-level analyticsapp.bsky.feed.getPosts → likeCount, repostCount, replyCount, quoteCount (lifetime counts; no daily series exists).pending
Read reviewsBluesky has no reviews.not possible
Reply to reviewsBluesky has no reviews.not possible
Delete review repliesBluesky has no reviews.not possible
Real-time webhooksReplies/mentions could be consumed from the Jetstream/firehose; not built yet.planned
Token & permission healthrefreshSession (via the credential store) + getProfile probe.pending
Read business profileBusiness profile management (hours, Q&A, profile photos) is only implemented for Google Business Profile in Postwoo.not possible
Update opening hoursBusiness profile management (hours, Q&A, profile photos) is only implemented for Google Business Profile in Postwoo.not possible
Read questions & answersBusiness profile management (hours, Q&A, profile photos) is only implemented for Google Business Profile in Postwoo.not possible
Answer questionsBusiness profile management (hours, Q&A, profile photos) is only implemented for Google Business Profile in Postwoo.not possible
Upload profile photosBusiness profile management (hours, Q&A, profile photos) is only implemented for Google Business Profile in Postwoo.not possible
Hashtag lookupHashtag lookup uses Instagram's official hashtag search; Postwoo does not implement it for this platform.not possible
Post a first commentAutomatic first comments are only implemented for Instagram in Postwoo.not possible
Read commentsapp.bsky.feed.getPostThread (depth 6) for the account's recent posts published through Postwoo; replies are public records, no extra permission.pending
Reply to commentscom.atproto.repo.createRecord app.bsky.feed.post with reply {root, parent} strong refs (uri + cid from getPosts) and facets.pending
Hide commentsHiding replies means writing app.bsky.feed.threadgate hiddenReplies on the root post; not built yet. Postwoo can delete its own replies (deleteRecord).planned
Read direct messagesBluesky chat (chat.bsky.*) needs an app password with DM access and the chat service proxy header; not built.planned
Reply to direct messagesBluesky chat (chat.bsky.convo.sendMessage); not built.planned
Image alt textW14: alt on each app.bsky.embed.images image (up to 2,000 graphemes). From memory, not verified live.pending
Custom video coverPostwoo does not send a custom video cover here (no official cover field implemented); the platform picks its own thumbnail.not possible
Limits

Platform limits we enforce before you schedule

The composer checks these for every target so a post is never queued only to fail later.

Text length300 characters
Images per post4
Videos per post0
Image typesjpeg, png, webp, gif
  • Text: up to 300 graphemes (user-perceived characters; an emoji counts as one). Links, @mentions and #hashtags become rich-text facets automatically.
  • Images: up to 4 per post, uploaded directly as blobs of at most 1,000,000 bytes. Larger JPEG/PNG/WEBP/GIF files are re-encoded as JPEG and downscaled by Postwoo before upload (animated GIFs lose animation).
  • A link without images becomes a link card (title/description from the post's link fields; no thumbnail). With images the URL is added to the text instead — Bluesky allows one embed per post.
  • Video posts are planned (app.bsky.embed.video); attach no video for now.
  • Connections use an app password created at bsky.app → Settings → Privacy and security → App passwords — never the main password.
  • Rate limits (assumptions): createSession 30 per 5 minutes per account; createRecord about 1,666 per hour per account.
Access

What the platform requires

  • No developer registration or app review: any Bluesky account can connect with an app password (bsky.app → Settings → Privacy and security → App passwords). Postwoo refuses values that do not look like app passwords so the main password is never sent.
  • Only the session tokens (accessJwt ~2 hours, refreshJwt ~90 days) are stored, encrypted; the app password itself is never persisted. Revoking the app password on bsky.app invalidates the connection.
  • Accounts hosted on a PDS other than bsky.social can set a custom service URL when connecting (BLUESKY_SERVICE sets the default).
  • AT Protocol OAuth with DPoP is the long-term connection method and is planned; app passwords are the honest interim.
  • Rate limits (assumptions): createSession 30 per 5 minutes per account; createRecord about 1,666 per hour per account; Postwoo paces at 300 writes per hour per connection.

Postwoo handles the app side. You connect with an account that has the right role on the platform.

FAQ

Questions, answered honestly

Do I give Postwoo my Bluesky password?

No. You create an app password in Bluesky (Settings → Privacy and security → App passwords) and paste that. Postwoo exchanges it for a session once and stores only the encrypted session. Revoking the app password disconnects Postwoo.

Why are older follower numbers missing?

Bluesky does not keep a history of follower counts. Postwoo records one snapshot per day after you connect and marks earlier days as unavailable rather than guessing.

Can I post videos to Bluesky?

Not yet. Video posts are planned; today Postwoo publishes text, links and images.

Other integrations

Google Business ProfileFacebook PagesInstagramLinkedInYouTubeTikTokThreadsPinterest

Ready to woo your clients?

Start free, connect a Google Business Profile, and see real reviews and metrics in the feed within minutes.