ReviewOS

stacks/postline

Harden Bluesky publishing for production use

#5
Closed glennmichael123 opened this 9 days ago ·
9 days ago

Postline can already publish to Bluesky (connect via app password, publish, link previews, timeline), but the flow needs hardening before we rely on it day-to-day.

Tasks

  • Session/token lifecycle: refresh expired Bluesky sessions instead of failing the publish
  • Surface richer per-provider errors in BlueskyPublishAction / CrosspostPublishAction (rate limits, auth expiry, network) instead of generic failures
  • Image/media upload support for Bluesky posts (composer currently only supports an image URL for Instagram)
  • Rich text facets: mentions, hashtags, and links should be proper facets, not plain text
  • Wire real scheduling: Post/PostTarget models already have status + scheduled_at (with an index), but nothing publishes scheduled posts — add a job/scheduler pass
  • Replace the Queue page mock data with real Post records (see UI polish issue)
  • Tests for the publish path (driver-level with mocked ATProto responses)

Context

  • Driver: app/Services/Social/Drivers/BlueskyDriver.ts, service: app/Services/Social/BlueskyService.ts
  • Actions: app/Actions/Postline/Bluesky*.ts
  • Fan-out: app/Services/Social/CrosspostService.ts
8 days ago

PR #8 lands most of this: real scheduling (queue + PublishScheduledPosts job), reply-chained Bluesky threads, richer per-provider failure recording, driver-level tests with mocked ATProto responses, and a migration fixing the post_targets provider CHECK that was rejecting Threads inserts. Still open from this list: session refresh hardening beyond the existing withFreshSession path, image/media upload for Bluesky, and rich-text facets.

8 days ago

Shipped across PRs #8, #9, #12, #13: real scheduling with a due-post sweep, reply-chained threads, rich-text facets, image upload (blob + embeds), engagement metrics sync, per-provider failure recording, driver-level tests, and the provider CHECK constraint fix. Remaining nice-to-have (deeper session-refresh hardening beyond withFreshSession) can get its own issue if it ever bites in practice.

Sign in to comment on this issue.