Skip to content
bluesky logo

Skill Overview

bluesky

Read from and post to Bluesky social network using the AT Protocol. Use this skill when the user wants to interact with Bluesky including posting text/images/links, replying to posts, reading their timeline, searching posts, viewing profiles, following/unfollowing users, checking notifications, o...

SKILL.md

Full skill instructions

Skill Overview

This skill provides access to the Bluesky social network via a set of Python scripts.

Identify Yourself in Each Post

When posting to BlueSky, always start the post with a brief statement saying who you are and that you are using the user's BlueSky account. Something short like: This is [AI name] posting using [user name]'s account. is good, but feel free to vary it. Replace [AI name] with your name and [user name] with the user's BlueSky full name or first name for brevity.

Prerequisites

Tool Dependency:

  • uv - The scripts in this skill require the uv package manager/​runner. Most cloud-based AI agents have uv pre-installed (or they can install it). Local agents should install it via curl -LsSf https://astral.sh/​uv/​install.sh | sh or see the uv installation docs.

Environment Variables (must be set before running any script):

  • BLUESKY_HANDLE - The user's Bluesky handle (e.g., username.bsky.social)
  • BLUESKY_PASSWORD - The user's Bluesky password

Important: The user should configure a BlueSky App Password (create in Settings > App Passwords) instead of using their main account password. App Passwords can be revoked individually if compromised.

Network Access

Important: The scripts in this skill require network access to the following domains:

  • bsky.social
  • bsky.network
  • *.bsky.network
  • public.api.bsky.app

If you (the AI agent) have network restrictions, the user may need to whitelist the above domains in the agent's settings for this skill to function. This is known to be necessary with Claude, and may be necessary with others.

Available Scripts

All scripts include PEP 723 inline metadata declaring their dependencies. Just run with uv run — no manual dependency installation or --with flags needed.

Post to Bluesky (scripts/​post.py)

Create posts with text, images, or link cards. URLs in the text are automatically detected and made clickable (supports https://..., http://..., www...., and bare domain URLs like github.com/​user/​repo).

# Simple text post
uv run scripts/​post.py --text "Hello, Bluesky!"

# Post with image
uv run scripts/​post.py --text "Check this out" --image photo.jpg

# Post with multiple images (up to 4)
uv run scripts/​post.py --text "Photos" --image a.jpg --image b.jpg

# Post with image and alt text
uv run scripts/​post.py --text "My cat" --image cat.jpg --alt "Orange cat sleeping"

# Post with link card
uv run scripts/​post.py --text "Read this" \
    --link-url "https://example.com" \
    --link-title "Article Title" \
    --link-description "Description text"

View Replies (scripts/​replies.py)

Fetch and display the reply thread for a specific post.

# View replies using a web URL (most common)
uv run scripts/​replies.py https://bsky.app/​profile/​someone.bsky.social/​post/​abc123

# View replies using an AT Protocol URI
uv run scripts/​replies.py "at://did:plc:xxx/​app.bsky.feed.post/​abc123"

# Limit reply depth (e.g., only direct replies)
uv run scripts/​replies.py --depth 1 https://bsky.app/​profile/​someone/​post/​abc123

# Output as JSON for processing
uv run scripts/​replies.py --json https://bsky.app/​profile/​someone/​post/​abc123

# Skip parent posts, show only target post and its replies
uv run scripts/​replies.py --no-parents https://bsky.app/​profile/​someone/​post/​abc123

Arguments:

ArgumentDescription
postPost identifier: either a bsky.app URL or an AT Protocol URI (required)
--depth, -dMaximum depth of replies to fetch (default: no limit)
--json, -jOutput as JSON instead of human-readable format
--no-parentsDon't show parent posts (only target post and replies)

Post a Reply (scripts/​reply.py)

Reply to an existing Bluesky post. The script automatically handles AT Protocol threading (root and parent references). URLs in the reply text are automatically detected and made clickable.

# Reply to a post using its web URL
uv run scripts/​reply.py --to https://bsky.app/​profile/​someone.bsky.social/​post/​abc123 \
    --text "Great post!"

# Reply using an AT Protocol URI
uv run scripts/​reply.py --to "at://did:plc:xxx/​app.bsky.feed.post/​abc123" \
    --text "I agree with this!"

# Short form arguments
uv run scripts/​reply.py -p https://bsky.app/​profile/​someone/​post/​abc123 -t "Thanks!"

Arguments:

ArgumentDescription
--to, -pPost to reply to: either a bsky.app URL or an AT Protocol URI (required)
--text, -tThe reply text content, max 300 characters (required)

How it works: The script fetches the target post's thread to determine:

  1. The parent (the post you're replying to)
  2. The root (the original post that started the thread)

Both references are required by AT Protocol to maintain proper thread structure.

Read Timeline (scripts/​read_timeline.py)

View posts from accounts the user follows.

# Default (25 posts)
uv run scripts/​read_timeline.py

# More posts
uv run scripts/​read_timeline.py --limit 50

# JSON output
uv run scripts/​read_timeline.py --json

# Paginate
uv run scripts/​read_timeline.py --cursor "cursor_string"

Search Posts (scripts/​search.py)

Find posts by keywords or hashtags.

# Keyword search
uv run scripts/​search.py "python programming"

# Hashtag search
uv run scripts/​search.py "#machinelearning"

# More results with auto-pagination
uv run scripts/​search.py "topic" --limit 100 --all

# JSON output
uv run scripts/​search.py "query" --json

View Profiles (scripts/​profile.py)

View profile information for any user.

# The user's profile
uv run scripts/​profile.py

# Another user
uv run scripts/​profile.py someone.bsky.social

# JSON output
uv run scripts/​profile.py --json

Follow/​Unfollow (scripts/​follow.py)

Manage the user's social connections.

# Follow a user
uv run scripts/​follow.py someone.bsky.social

# Unfollow a user
uv run scripts/​follow.py --unfollow someone.bsky.social

# List who the user follows
uv run scripts/​follow.py --list

# List the user's followers
uv run scripts/​follow.py --list --followers

# List another user's follows
uv run scripts/​follow.py --list someone.bsky.social

Notifications (scripts/​notifications.py)

View and manage the user's notifications.

# View notifications
uv run scripts/​notifications.py

# More notifications
uv run scripts/​notifications.py --limit 50

# Just show unread count
uv run scripts/​notifications.py --count

# Mark all as read
uv run scripts/​notifications.py --mark-read

# JSON output
uv run scripts/​notifications.py --json

Common Patterns

Setting Credentials

# Set for current session
export BLUESKY_HANDLE="username.bsky.social"
export BLUESKY_PASSWORD="app-password"

# Or inline with command
BLUESKY_HANDLE="username.bsky.social" BLUESKY_PASSWORD="pass" uv run scripts/​post.py --text "Hello"

JSON Output for Processing

All scripts support --json for machine-readable output:

# Get timeline as JSON and extract first post
uv run scripts/​read_timeline.py --json | jq '.posts[0]'

# Search and count results
uv run scripts/​search.py "topic" --json | jq '.count'

Pagination

Scripts that return lists support cursor-based pagination. Use this to scroll through the user's timeline and other sequences of posts:

# First page
uv run scripts/​read_timeline.py --json > page1.json

# Get cursor from response, then fetch next page
CURSOR=$(jq -r '.cursor' page1.json)
uv run scripts/​read_timeline.py --cursor "$CURSOR" --json > page2.json

Key Concepts

  • Handle: The user's username (e.g., user.bsky.social)
  • DID: Decentralized Identifier—permanent unique ID (handles can change, DIDs don't)
  • URI: Resource identifier for posts/​records (format: at://did/​collection/​rkey)
  • CID: Content hash identifier for specific versions of records
  • App Password: Revocable credential for API access (recommended over main password)

Error Handling

Scripts exit with non-zero status on errors. Common issues:

  • Missing credentials: Set BLUESKY_HANDLE and BLUESKY_PASSWORD
  • Invalid handle: Verify the handle exists on Bluesky
  • Rate limits: The API has rate limits; space out bulk operations
  • Image format: Only JPEG, PNG, and WebP are supported
  • Network blocked: Ensure required domains are whitelisted (see Network Access)

More skills from diegosouzapw

accessibility logo
diegosouzapw/awesome-omni-skill

accessibility

Accessibility guidelines for VS Code features — covers accessibility help dialogs, accessible views, verbosity settings, accessibility signals, ARIA alerts/status announcements, keyboard navigation, and ARIA labels/roles. Applies to both new interactive UI surfaces and updates to existing feature...

62 1
View
mermaid-diagrams logo
diegosouzapw/awesome-omni-skill

mermaid-diagrams

Mermaid diagram creation for flowcharts, sequences, ERDs, and more. Generate diagrams from text in markdown files. Use for documentation, architecture diagrams, and visual representations. Triggers on mermaid, flowchart, sequence diagram, ERD, entity relationship, gantt chart, pie chart, class di...

62 1
View
tauri2-react-rust logo
diegosouzapw/awesome-omni-skill

tauri2-react-rust

Guides development of cross-platform desktop apps with Tauri 2, TypeScript, React, and Rust. Use when building Tauri apps, implementing IPC, designing Rust backend or TypeScript/React frontend, when researching or cloning a website (open site, snapshot elements), when verifying local dev or built...

62 1
View
fp-ts-errors logo
diegosouzapw/awesome-omni-skill

fp-ts-errors

Handle errors as values using fp-ts Either and TaskEither for cleaner, more predictable TypeScript code. Use when implementing error handling patterns with fp-ts.

62 0
View
ring:pre-dev-research logo
diegosouzapw/awesome-omni-skill

ring:pre-dev-research

Gate 0 research phase for pre-dev workflow. Dispatches 3 parallel research agents to gather codebase patterns, external best practices, and framework documentation BEFORE creating PRD/TRD. Outputs research.md with file:line references.

62 0
View
create-assistant logo
diegosouzapw/awesome-omni-skill

create-assistant

Create and configure Vapi voice AI assistants with models, voices, transcribers, tools, hooks, and advanced settings. Use when building voice agents, phone bots, customer support assistants, or any conversational AI that handles phone or web calls.

62 0
View
codex-headless logo
diegosouzapw/awesome-omni-skill

codex-headless

Delegiere Aufgaben an OpenAI Codex CLI im Headless-Mode. Nutzt ChatGPT Subscription (KEIN API Key). Nur Workspace-Zugriff, KEIN System-Zugriff. Auto-Accept mit --full-auto. Web-Recherche mit --search.

62 0
View
social-media-scheduler logo
diegosouzapw/awesome-omni-skill

social-media-scheduler

Generate a full week of social media content for any topic. Outputs platform-optimized posts for Twitter/X, LinkedIn, and Instagram with hashtags and posting times.

62 0
View
Data Privacy Compliance logo
diegosouzapw/awesome-omni-skill

Data Privacy Compliance

Data privacy and regulatory compliance specialist for GDPR, CCPA, HIPAA, and international data protection laws. Use when implementing privacy controls, conducting data protection impact assessments, ensuring regulatory compliance, or managing data subject rights. Expert in consent management, da...

62 0
View
triple-review logo
diegosouzapw/awesome-omni-skill

triple-review

Reviews a task using the TRIPLE protocol, as the review agent.

62 0
View
Tech Stack & Architecture Decision logo
diegosouzapw/awesome-omni-skill

Tech Stack & Architecture Decision

Define and document the technology stack and architecture decisions for a project. Use when the user needs to choose a tech stack, make architecture decisions, define infrastructure choices, or document technology selections. Triggers on requests like "define the tech stack", "choose technologies...

62 0
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View