A quiet idea: what are people saying on BlueSky?
BlueSky has quietly built its own corner of the internet, one that isn’t constantly yelling at you in 280-character bursts. So naturally, I wanted to build a sentiment tracker for it. Not the firehose of doom like Twitter (or X, as the branding committee insists we call it), but something calmer and more focused: a clean dashboard that tracks how people are talking about different things.
The plan was simple. Fetch posts, run them through a Hugging Face model, and display live sentiment breakdowns. No dedicated backend, no servers quietly burning money in the background. Just GitHub Actions, Cron triggers, and some well-placed automation.
The Twitter-shaped hole in the plan
If this had been Twitter, the infrastructure would’ve been almost boring. Everyone and their cat has written a streaming sentiment bot for X. There are libraries, tutorials, and examples everywhere. BlueSky is newer, leaner, and far less documented. Which is great for building something interesting, and absolutely terrible when you need things to work smoothly.
Scheduling: the part that almost broke my soul
Here’s the thing about GitHub Codespaces. They’re brilliant… until you realize they stop running after what feels like ten reels’ worth of time. Which means any background scheduling you set up just disappears when it naps. GitHub Actions workflows also don’t love being poked too often without some external babysitter. For something that needed to run every 15 minutes, this was a headache.
That’s where cron-job.org swooped in like a hero in a slightly nerdy cape. A free external service that pings the GitHub workflow URL right on schedule, no matter what. It solved what was rapidly becoming my least favorite part of this build. If this project had a credits roll, cron-job.org would get a special thanks.
The pipeline in motion
Every 15 minutes, the cron trigger calls a GitHub Action that launches a Python script.
This fetches BlueSky posts based on keywords and categories, sends them to a RoBERTa sentiment model on Hugging Face,
and writes a clean sentiment.json file to the repo.
The frontend dashboard then picks this up and renders charts showing sentiment breakdowns, trending categories, and timestamps.
No servers. No databases. Just automation stitched together carefully enough to look like a living system.
Polishing the sky
The dashboard isn’t just a wall of numbers. It uses a clean HTML layout with category breakdowns, sentiment distributions, and last-updated times. Mobile and dark mode are built in, because dashboards should look good even at 2 AM when you’re debugging why a positive post got flagged as “mildly furious.”
The final setup fetches posts, analyzes tone, updates a live dashboard, and costs exactly zero to run. Which, honestly, might be my favorite feature of all.