sampling-bluesky-zeitgeist
Scannednpx machina-cli add skill oaustegard/claude-skills/sampling-bluesky-zeitgeist --openclawSampling Bluesky Zeitgeist
⚠️ DEPRECATED: This skill has been consolidated into the browsing-bluesky skill.
Use browsing-bluesky for firehose sampling via the sample_firehose() function.
Legacy Documentation
Capture and analyze multiple windows of Bluesky firehose data, identify content clusters, and present results showing both individual sample windows and aggregate trends.
Workflow
1. Setup
Install dependencies:
cd /home/claude && npm install ws https-proxy-agent 2>/dev/null
2. Run Sample Windows
Execute 3 consecutive 10-second samples:
node /mnt/skills/user/sampling-bluesky-zeitgeist/scripts/zeitgeist-sample.js --duration 10 > /home/claude/sample1.json 2>/dev/null
node /mnt/skills/user/sampling-bluesky-zeitgeist/scripts/zeitgeist-sample.js --duration 10 > /home/claude/sample2.json 2>/dev/null
node /mnt/skills/user/sampling-bluesky-zeitgeist/scripts/zeitgeist-sample.js --duration 10 > /home/claude/sample3.json 2>/dev/null
3. Analyze & Build DATA Object
Parse each JSON file and aggregate:
- Sum totalPosts, calculate avgPostsPerSecond
- Merge topWords, topPhrases, entities across windows
- Calculate per-minute rates:
(count / totalDurationSec) * 60 - Detect trends by comparing window counts
4. Identify Content Clusters
Group related terms into thematic clusters. For each cluster:
- name: Descriptive label
- emoji: Visual identifier
- terms: Keywords that belong to this cluster
- searchQuery: OR-joined terms for Bsky search (e.g.,
"trump OR republican OR congress") - totalMentions: Sum across all windows
- mentionsPerMin:
(totalMentions / totalDurationSec) * 60 - trend: "up" if last window > first by 30%, "down" if <30%, else "stable"
- samples: 2-3 example posts matching cluster
5. Create Artifact via Template
Copy template and inject DATA:
cp /mnt/skills/user/sampling-bluesky-zeitgeist/assets/zeitgeist-template.html /mnt/user-data/outputs/zeitgeist.html
Then use str_replace to inject the DATA object:
old_str: const DATA = {"aggregate":{"totalPosts":0,"totalDurationSec":30,"avgPostsPerSecond":0,"timestamp":""},"windows":[],"clusters":[],"entities":[],"phrases":[],"languages":{}};
new_str: const DATA = {YOUR_ACTUAL_DATA_OBJECT};
See references/artifact-template.md for the complete DATA schema.
Output Format
Present the artifact link, then provide a brief prose summary:
- What's dominating the conversation (top 1-2 clusters)
- Any notable velocity spikes
- Interesting patterns (e.g., "Japanese-language posts spiking around [topic]")
Keep summary to 2-3 sentences. The artifact is the main deliverable.
Refresh Workflow
When user asks to refresh/update/sample again:
- Run new sample windows (same 3x10s pattern)
- Update the DATA object with new results
- Use str_replace to swap the DATA line in the existing artifact
- Report what changed: "Trump mentions up 20% from last sample, M23 discussion fading"
For comparison, track previous aggregate totals and show delta:
Previous: trump 50/min → Current: trump 62/min (+24%)
Topic Monitoring Workflow
When user specifies a topic to monitor (e.g., "track the Lakers game", "what's happening with the drone sightings"):
Option A: Filtered Sampling
Run samples with the --filter flag to capture only matching posts:
node zeitgeist-sample.js --duration 15 --filter "lakers" > /home/claude/topic1.json 2>/dev/null
This gives deeper analysis of a specific topic but misses broader context.
Option B: General + Topic Velocity (Recommended)
Run general samples, then:
- Calculate topic-specific velocity from the results
- Add a dedicated "Monitored Topic" cluster at the top
- Include sample posts matching the topic
In the DATA object, add a monitoredTopic field:
{
"monitoredTopic": {
"query": "lakers",
"totalMentions": 45,
"mentionsPerMin": 90.0,
"trend": "up",
"windowCounts": [12, 15, 18],
"samples": ["Lakers up by 10 in the 4th!", "LeBron with another triple double"]
}
}
Responding to Topic Requests
At start of conversation:
- "What's happening with the drone sightings?" → Run general sample, highlight drone-related content as monitored topic
- "Track mentions of Claude AI" → Same approach, focus on that term
Mid-conversation:
- "Can you focus on the M23 conflict?" → Re-run samples, add M23 as monitored topic
- "What about Japanese content specifically?" → Filter for lang:ja or highlight existing Japanese cluster
Follow-up pattern: User: "refresh but focus on the game" → Run new samples, keep monitored topic, update all data
Error Handling
If WebSocket connection fails:
- Check that
*.bsky.networkis in allowed domains - Retry once with shorter duration (5s)
- If still failing, report the error and suggest user check network settings
If sample returns zero posts:
- Likely network/proxy issue
- Report and do not create artifact
Customization Options
User may request:
- Longer samples: Increase duration per window or add more windows
- Topic focus: After initial sample, run filtered samples for specific clusters
- Comparison: Run samples at different times and compare
Source
git clone https://github.com/oaustegard/claude-skills/blob/main/sampling-bluesky-zeitgeist/SKILL.mdView on GitHub Overview
This legacy skill samples Bluesky firehose data to surface trending topics and content clusters across multiple windows. It aggregates results into clusters and produces an artifact (zeitgeist.html) that summarizes dominant conversations. It has been superseded by the browsing-bluesky skill and its sample_firehose() function.
How This Skill Works
Install dependencies (ws and https-proxy-agent) and run three consecutive 10-second samples with zeitgeist-sample.js. Parse each sample to compute totalPosts, avgPostsPerSecond, and merge topWords, topPhrases, and entities across windows; identify content clusters with per-cluster metrics and 2-3 sample posts. Copy the zeitgeist-template.html and inject the DATA object to generate the zeitgeist artifact.
When to Use It
- When asked what's happening on Bluesky or to surface Bluesky trends
- To perform zeitgeist or firehose analysis and identify content clusters
- When you want real-time topic clusters from Bluesky's network
- When you need an artifact (zeitgeist.html) summarizing results
- When refreshing a previous zeitgeist analysis to compare changes
Quick Start
- Step 1: cd /home/claude && npm install ws https-proxy-agent 2>/dev/null
- Step 2: node /mnt/skills/user/sampling-bluesky-zeitgeist/scripts/zeitgeist-sample.js --duration 10 > /home/claude/sample1.json 2>/dev/null
- Step 3: Parse samples, build the DATA object, copy the template to outputs, and inject DATA into the artifact with str_replace
Best Practices
- Run exactly three consecutive 10-second samples for consistent snapshots
- Install dependencies in the project environment and route outputs to sample JSONs
- Aggregate across windows: sum totalPosts, compute avgPostsPerSecond, and merge topWords/topPhrases/entities
- Compute per-minute rates with (count / totalDurationSec) * 60 and assess cluster trends
- Use the provided artifact workflow: copy the template to outputs and inject the DATA object via str_replace
Example Use Cases
- Top cluster around AI ethics and policy discussions with related terms and sample posts
- Basketball-related conversations (e.g., Lakers) spiking during a game
- Crypto discussions intensifying around a major price move or event
- Japanese-language posts spiking around a gaming event or release
- US politics threads containing terms like trump OR republican OR congress