oaustegard/claude-skills/browsing-bluesky
Claude Code and agent skill by oaustegard/claude-skills
- community
Checking that the SKILL.md file is still in the repository.
Browse Bluesky content via API and firehose - search posts, fetch user activity, sample trending topics, read feeds and lists, analyze and categorize accounts. Supports authenticated access for personalized feeds. Use for Bluesky research, user monitoring, trend analysis, feed reading, firehose sampling, account categorization.
Install
npx vskill@latest install oaustegard/claude-skills/browsing-blueskySKILL.md
Browsing Bluesky
Access Bluesky content through public APIs and real-time firehose. Supports optional authentication for personalized feeds. Includes account analysis for categorization.
Implementation
Add skill directory to path and import:
Authentication (Optional)
Authentication enables personalized feeds (like Paper Skygest) that require knowing who's asking.
Setup
- Create an app password at Bluesky: Settings → Privacy and Security → App Passwords
- Set environment variables:
``bash export BSKY_HANDLE="yourhandle.bsky.social" export BSKY_APP_PASSWORD="xxxx-xxxx-xxxx-xxxx" ``
Which account reads
Two credential pairs are recognised, and the prefix is the only difference:
| Pair | Identity | |
|---|---|---|
MUNINN_BSKY_HANDLE / MUNINN_BSKY_APP_PASSWORD | muninn — preferred | |
BSKY_HANDLE / BSKY_APP_PASSWORD | owner — used when no Muninn pair is set |
BSKY_IDENTITY=muninn|owner picks one outright, and a pair named that way is never substituted for: asking for muninn with no Muninn pair set reads as public rather than quietly reading as the owner. An unrecognised value raises.
This matters because a booted container holds both pairs. Until 2026-08-28 the unprefixed one won, so every authenticated read — the following timeline, and the mutes, blocks and labelers that shape all of them — came back as the account owner with nothing in the output saying so, from a skill documented as read-only that was nonetheless holding an app password carrying write scope on his account. On a machine with only the documented BSKY_* pair, nothing changes.
Behavior
- Transparent: All functions work identically with or without credentials
- Automatic: Auth headers are added opportunistically when credentials exist
- Graceful: Failed auth silently falls back to public access. A misspelled
BSKY_IDENTITY is configuration, not auth failure, and raises instead
- Secure: Tokens cached in memory only, never logged or persisted
Check Auth Status
Research Workflows
Investigate a Topic
Use search_posts() with query syntax matching bsky.app advanced search:
- Basic terms:
event sourcing - Exact phrases:
"event sourcing" - User filter:
from:acairns.co.ukor useauthor=param - Date filter:
since:2025-01-01or usesince=param - Hashtags, mentions, domain links:
#python mentions:user domain:github.com
Combine query syntax with function params for complex searches.
Monitor a User
- Fetch profile with
get_profile(handle)for context (bio, follower count, post count) - Get recent posts with
get_user_posts(handle, limit=N) - For topic-specific user content, use
search_posts(query, author=handle)
Discover What's Trending
Recommended workflow — trending API first, firehose for deep dives:
1. Quick scan with trending topics (~500 tokens)
2. Rich trends with post counts and actors
3. Targeted exploration of selected trends
4. Optional: Firehose for velocity monitoring or long-tail discovery
Prerequisites: Install Node.js dependencies once per session:
Returns dict with keys:
- window:
{startTime, endTime, durationSeconds}— sampling time range - stats:
{totalReceived, totalPosts, postsPerSecond, filter, languages}— volume metrics and language breakdown - topWords:
[[word, count], ...]— top 50 words (count >= 3) - topPhrases:
[[bigram, count], ...]— top 30 bigrams (count >= 2) - topTrigrams:
[[trigram, count], ...]— top 20 trigrams (count >= 2) - entities:
[[entity, count], ...]— top 25 handles/hashtags (count >= 2) - samplePosts:
[{text, altTexts, hasImages}, ...]— first 50 matching posts
Read Feeds and Lists
get_feed_posts() accepts:
- List URLs:
https://bsky.app/profile/austegard.com/lists/3lankcdrlip2f - Feed URLs:
https://bsky.app/profile/did:plc:xxx/feed/feedname - AT-URIs:
at://did:plc:xxx/app.bsky.graph.list/xyz
The function extracts the AT-URI from URLs automatically.
Explore a Thread
Fetch full thread context for a post with parents and replies:
Find Quote Posts
Discover posts that quote a specific post:
Analyze Engagement
Get users who engaged with a post:
Read Embed Images
Every parsed post carries an images field — a list of {alt, url, transcription} dicts, one per embed image. The legacy image_alts: list[str] field is preserved (non-empty alts only).
When alt text is missing and the image content matters, opt in to model transcription via the transcribe parameter on any post-fetch function (get_user_posts, search_posts, get_feed_posts, get_thread, get_quotes):
Policy is invariant across all callers: images with non-empty alt text are never transcribed (the author already described the image; trust it). Only images with missing or empty alt are sent to the model. Network or API failures leave transcription as None; callers degrade silently.
Cost/quality empirics (May 2026, n=3 dense terminal screenshots, single run each — sample size is small, treat as directional):
| Alias | Latency | $/image | Chord-token recall | |
|---|---|---|---|---|
gemini-lite | ~8s | ~$0.001 | 95% | |
gemini-flash | ~10s | ~$0.003 | 100% | |
gemini-3.5-flash | ~10s | ~$0.014 | 100% | |
haiku | ~7s | ~$0.008 | 18% (summarizes) | |
opus | ~20s | ~$0.12 | 91% |
The haiku and opus rows were measured on Haiku 4.5 and Opus 4.7. The aliases now resolve to claude-haiku-5-5 and claude-opus-5-5; those rows have not been re-measured.
Requires either ANTHROPIC_API_KEY (or API_KEY in /mnt/project/claude.env) for the haiku / opus aliases, or CF AI Gateway credentials in /mnt/project/proxy.env for the gemini-* aliases. Transcription only fires when the parameter is set, so callers without the relevant credentials can simply pick a different alias or leave the feature off.
Explore Social Graph
Navigate follower/following relationships:
Find Users
Search for users by name, handle, or bio:
API Endpoint Notes
- Public AppView:
https://api.bsky.app/xrpc/for unauthenticated reads - PDS:
https://bsky.social/xrpc/for authenticated requests - Trending:
app.bsky.unspecced.getTrends(rich) andapp.bsky.unspecced.getTrendingTopics(lightweight) - Firehose:
wss://jetstream1.us-east.bsky.network/subscribe - Endpoint routing is automatic - authenticated requests go to PDS, public requests go to AppView
- Rate limits exist but are generous for read operations
Return Format
All API functions return structured dicts with:
uri: AT protocol identifiertext: Post contentcreated_at: ISO timestampauthor_handle: User handleauthor_name: Display namelikes,reposts,replies: Engagement countslinks: Full URLs extracted from post facets (post text truncates URLs with "...")image_alts: Alt text from embedded imagesurl: Direct link to post on bsky.app
Profile function returns: handle, display_name, description, followers, following, posts, did
Account Analysis
Analyze accounts for categorization by topic. Fetches profile and posts, extracts keywords, and returns structured data for Claude to categorize.
Analyze a User's Network
Single Account Analysis
Keyword Extraction Options
Stopwords parameter filters domain-specific noise:
"en": English (general purpose, default)"ai": AI/ML domain (filters tech boilerplate)"ls": Life Sciences (filters research methodology)
Requires: extracting-keywords skill with YAKE venv for keyword extraction.
Filtering Accounts
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingbrowsing-bluesky/SKILL.md
Popularity
- Repository stars
- 151
- Repository forks
- 7
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/oaustegard/claude-skills/browsing-bluesky)