Music League Stats
The Game
Music League is a competitive music discovery game played in rounds. Each league runs for a set number of rounds — mine are ten — with one round per week, each built around a specific theme: 80s music, commute soundtracks, middle school dance hits. Everyone submits a song anonymously that fits the theme, a Spotify playlist is generated for the group to listen to across the week, and then everyone votes — six votes each, with a maximum of three to any single song.
Each round ends with a podium: the top three vote-getters are celebrated. At the end of the league, overall standings are tallied and the winners are recognised. For my US work leagues, my wife designed custom cassette tape trophies for the podium finishers — a touch that turned a fun game into something people genuinely looked forward to.
I run two kinds of leagues. The work leagues tend to be musically diverse and skew toward popular music — a reflection of a wider range of tastes and backgrounds in the group. The friend leagues track closer to my own musical sensibilities, though with a narrower genre range. Both are genuinely competitive. Both have introduced me to artists I wouldn't have found on my own, and both have shaken up my Spotify algorithm in ways I'm grateful for.
Why I Built It
The Music League app itself is fairly minimal out of the box: points per round, total points, and at the end of the league, a summary of who your biggest fan was and who you voted for most. It does provide a CSV export with all the underlying data — and the moment I saw that, I knew I could build something much richer.
The question wasn't whether the data supported more analysis. It clearly did. The question was which metrics would actually be interesting to the people playing. Voting patterns, streaks, genre performance, point flow across the league, who consistently over- or under-performed relative to expectations — all of that was sitting in the CSV, waiting. So I built the dashboard I wished the app had.
The result is pinned to multiple Discord and Microsoft Teams chats. People do visit it — not constantly, but they explore it, reference it mid-season, and occasionally use it to settle friendly arguments about who's been carrying the league.
Features
-
Leaderboard
Running point totals across all rounds, with per-round breakdowns and historical rank movement so you can see who's on a streak and who's fallen off.
-
Song Stats
Per-song analytics including vote distribution, average scores, and submission history — so every player can see exactly how each of their picks performed.
-
Fan Map
A D3.js chord diagram visualising who votes for whom across the league. No great surprises when I first ran my own data through it — but a satisfying visual way for people to see which players they naturally align with most, and which rivalries are playing out in the numbers.
-
Economy
Tracks cumulative point flow across the league — which players consistently attract votes, where points are concentrated, and how that shifts over time.
-
Headlines
Auto-generated narrative headlines for each completed round. Built on a rule-based system that identifies standout metrics and notable moments — highest-voted song, biggest upset, record-breakers — and then passes those structured inputs to an LLM to render them as readable, punchy headlines.
How It's Maintained
The dashboard is updated weekly while a league is active — a quick refresh after each round closes to pull in the new CSV data. When no league is running, it sits static as a record of the most recent season. It's a lightweight maintenance commitment for something that gets genuine use, which is a good ratio.