GitHub Action (signed release webhook) · Bluesky

Post to Bluesky from GitHub Actions, with approval

For open-source projects, the release is the event worth posting about, and Bluesky has a lively developer community to tell. With socialhandoff-announce-action in a release workflow, each published GitHub release is sent to SocialHandoff and drafted for Bluesky, checked against the 300-grapheme limit, with a citation back to the release in the audit log. Drafts land in the approval inbox, and you decide what goes live.

Prompt

Workflow: on release published, run socialhandoff-announce-action with the instance URL, trigger id, and signing secret from repository secrets. Release rule in Connections targets bluesky with approval required.

How to do it

  1. Connect Bluesky and add a release rule In https://app.socialhandoff.com, connect Bluesky, then add a GitHub trigger in Connections with a release rule that targets Bluesky. Copy the trigger id and signing secret.
  2. Store the secrets Add your instance URL, the trigger id, and the signing secret as repository secrets.
  3. Add the workflow Create a workflow on: release with types [published] that runs socialhandoff-announce-action. The action signs the payload with HMAC-SHA256 and sends tag, name, notes, and URL.
  4. Approve the draft Publish a release. A Bluesky draft appears in the inbox with a citation back to the release, and publishes only after you approve it.

Example draft

Released: quill v5.0.0. The editor core was rewritten for faster large documents, and plugins now use a stable API.

Breaking: Node 20 or later is required.

github.com/acme/quill/releases/tag/v5.0.0

Gotchas

  • Connect Bluesky with an app password from Settings, never your account password. Revoking that app password cuts off only this connection.
  • The 300 limit counts graphemes, so an emoji or accented letter counts as one. Anything longer should become a reply-chain thread, not a clipped post.
  • Bluesky refuses images over 1 MB and allows at most 4 per post. Resize screenshots before the agent attaches them, and add alt text to each.
  • The action sends the release, not a finished post. Bluesky as a target and the approval rule live on the release rule in Connections, not in the workflow file.
Bluesky
  • Character limit: 300 graphemes per post. An emoji or an accented letter counts as 1 grapheme even if it uses several bytes.
  • Media per post: Up to 4 images, or 1 video. Images and video cannot be mixed in one post.
  • Image size: The AT Protocol image embed accepts blobs of about 1 MB each; the official app compresses larger photos. SocialHandoff checks for 1 MB per image.
  • Video: Up to 3 minutes and 100 MB, MP4. SocialHandoff does not publish video to Bluesky.
Bluesky scheduler for agent-drafted posts and threads

Frequently asked questions

Does the action need an agent key?
No. It uses the trigger id and a signing secret, and the request is verified with HMAC-SHA256. The draft is attributed to the release in the audit log.
Can a release become a Bluesky thread?
The draft is checked against the 300-grapheme limit, and the length guardrail flags it if the notes run long. Edit it down in the inbox before you approve.
Is there a character counter for Bluesky?
Yes. The free Bluesky character counter on this site counts graphemes the way Bluesky does, and the length guardrail applies the same rule to every draft.

Let your agents post. Keep the final say.

Connect your first agent in minutes. Every draft waits in your inbox until you approve it.

14 days free. No card required.

The hosted version is opening soon

Leave your email and we will send one message when hosted accounts open, with your 14-day trial ready. Want it today? Self-host it free from the repo.

Start free trial