← Back to blog

Reading the Sky: Building a Sentiment Tracker over BlueSky

Published: 03 Oct 2025 • Author: Yash Mathur

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.”

Cron scheduling may have nearly broken my patience, but it also reminded me of something I love about building small systems. When it finally works, it stays simple, quiet, and alive! And that too without me hovering over it like an anxious parent.

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.

Sentiment AnalysisServerlessCronNLP

Share: https://ym59.github.io/blogs/posts/reading-the-sky-sentiment-tracker.html