Prompt
Workflow: when our RSS feed at example.com/blog/rss has a new item, draft a Bluesky post with the title, one line from the summary, and the link. Use an AI node to write the line in our voice, then send it to the REST API for Bluesky with mode submit. How to do it
- Mint a Bluesky agent key In https://app.socialhandoff.com, open Connections, connect your Bluesky account, then create an agent key scoped to Bluesky with draft permission only. Copy the key when it is shown; only its hash is stored.
- Pick a trigger Start the workflow with the event that should produce a post: an RSS item, a new row, a form submission, or a Schedule Trigger.
- Add an HTTP Request node Set it to POST https://app.socialhandoff.com/v1/posts with a Header Auth credential for the key. Send JSON with body, networks set to ["bluesky"], and mode "submit".
- Handle the response The response carries the post id and status. Branch on it to log the draft, or wait for the approval.requested and post.published outbound webhooks.
Example draft
New on the blog: How we cut our CI time in half without new hardware. The short version: cache the dependency layer, and stop running the full suite on docs-only changes. example.com/blog/ci-time
Gotchas
- 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.
- Links, @handles, and #tags become clickable facets when the post publishes. Have the agent write the plain URL and handle, not markdown links.
- Connect Bluesky with an app password from Settings, never your account password. Revoking that app password cuts off only this connection.
- Store the key in an n8n Header Auth credential, not typed into the node, so it does not leak when you export or share the workflow.
- 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.
Frequently asked questions
Should n8n use the REST API or MCP?
Use REST. The HTTP Request node maps cleanly to POST /v1/posts, and the OpenAPI spec at /openapi.json documents every field.
What happens if a n8n run sends a post longer than 300 graphemes?
The length guardrail flags it and the draft waits in the inbox with the reason attached. Send a thread array instead if your source text is long.
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.