post-bluesky
Post a text message to Bluesky using the AT Protocol. The post body comes from target (a Note or Collection from a prior step) or value (literal text). Returns a confirmation Note with the post URI and CID in metadata.
Input
Body content (one of):
target: Variable or resource ID — content becomes the post body (plain text)value: Literal string — used as the post body directly
Optional:
tags: Hashtags to append to the post. Either a comma-separated string ("AI,research") or a list (["AI", "research"]). Tags are appended as#AI #researchand linked as clickable Bluesky tags.
Output
Success (status: "success"):
resource_id: Note ID containing confirmation text (e.g.,"Posted to Bluesky: Hello world...").- Metadata (accessible via
get-metadata):uri,cid,timestamp.
Failure (status: "failed"):
reason: Error description (e.g.,BLUESKY_ACCOUNT_HANDLE and BLUESKY_APP_PASSWORD environment variables required,authentication_failed)
Requirements
BLUESKY_ACCOUNT_HANDLE— Bluesky handle (e.g.,alice.bsky.social)BLUESKY_APP_PASSWORD— App Password from Bluesky Settings > App Passwords
Behavior
- Authenticates via
com.atproto.server.createSessionto obtain an access token - Creates a post via
com.atproto.repo.createRecord - Posts as plain text (UTF-8) with optional hashtag facets
- Post text is truncated at 294 characters (+ "..." if truncated) to stay within Bluesky's 300 grapheme limit
- Tags are appended after the body and linked as clickable hashtags via AT Protocol facets
Common Workflows
Post a simple status update with tags:
{"type":"post-bluesky","value":"Just deployed a new feature! Everything is running smoothly.","tags":"devops,shipping","out":"$posted"}
Post a generated summary:
{"type":"generate-note","prompt":"Write a short tweet-length summary of today's progress","out":"$update"}
{"type":"post-bluesky","target":"$update","out":"$posted"}
Post synthesized research:
{"type":"search-web","query":"latest developments in AI safety 2026","out":"$research"}
{"type":"synthesize","target":"$research","focus":"one key takeaway","format":"brief","out":"$summary"}
{"type":"post-bluesky","target":"$summary","out":"$posted"}