DEV Community

Krishna Kotikalapudi
Krishna Kotikalapudi

Posted on AI-assisted

I built a weekly recap of the Premier League for a friend.

Hacktoberfest Weekend Challenge: Build for a Friend Submission 🤝

This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend

What I Built

My friend is a die-hard Arsenal fan. Between early classes, late labs, and a hectic FSAE Formula Student workload, he prefers to listen to what happened in the Premier League over the weekend.

He prefers to listen en route to classes, so I built TheGoonerBriefing: a weekly matchday recap made for the walk to class. It pulls the latest Premier League results, turns them into a conversational script, and reads it out loud as a 2.5-minute audio file. That's roughly one walk to class, or one very optimistic bus ride, and he can play it without looking at his phone.

Demo

🎧 Listen to a sample briefing

A test script

(Headphones recommended. Playing it in a lecture hall is between you and your conscience.)

Code


How I Built It

The pipeline has three steps, and none of them involve me typing "so, anyway, Arsenal drew" into a voice memo:

  1. Data: Results, scorers and red cards come from the free Fantasy Premier League API, the one that powers the FPL site. It needs no account or API key. Plain Python picks out Arsenal's result, any hat-tricks or red cards, and their next fixture, then saves it all as one facts.json file. So the scores are real, and not whatever the group chat remembers.
  2. Script: Gemma (gemma-4-12b-qat) turns the raw match data into a recap written the way people actually talk. It has all the confidence of a Twitter keyboard warrior, but with the facts to back it up.
  3. Voice: Kokoro, an open-weight text-to-speech model, reads the script aloud. It's no Peter Drury, so don't expect poetry about a 0-0 draw, but it is free and shows up every Monday.

I started with a user base of exactly one, which is the only audience guaranteed to text me back. It also meant real feedback from a real person: I could tweak the length, tone, and pace after each listen, which is what "build for a friend" is really about.

Where it is today: v1 is run manually, which is a fancy way of saying "I press the button." The next step is a weekly GitHub Action or cron job so the briefing is ready every Monday without me. Until then, I am the scheduler, and I accept no complaints about uptime.

Where it could go: the pipeline doesn't actually care that it's football. Data goes in, Gemma turns it into a spoken script, and Kokoro reads it out. Swap the data source and the same setup works for:

  1. Premier League: the full league, not just Arsenal
  2. Other football: European leagues and cup competitions
  3. Other sports: cricket, F1, tennis
  4. News: a short morning headline briefing for anyone with a commute

If it works for one friend, the rest is just new data sources.

Why Does Open Innovation Matter?

I wanted TheGoonerBriefing to be something that keeps working long after the weekend is over. Open models make that possible. Gemma writes the script and Kokoro speaks it, with no per-request billing, and the whole thing can keep running for as long as he keeps showing up to class.

A choice I actually had to make

For the voice, I seriously considered ElevenLabs. Their voices are excellent, and the free months on offer made it tempting. I went with Kokoro for two reasons that came from this specific project:

  1. The challenge is about open-source AI at the core. Kokoro is open-weight, so the voice layer fits that brief instead of sitting outside it.
  2. It's a gift, so it should keep working. I'm not planning to maintain a subscription on his behalf, and I'd rather hand him a pipeline he can run himself.

Both tools are good at what they're built for, and for a weekly personal project that someone else can fork and own, open-weight won out. And since the code is open, he can fork it, change the length and tone to whatever suits his mornings. It's his briefing now, not mine.

Prize Categories

Best Use of Gemma: Gemma (gemma-4-12b-qat) is the brain of the operation. It turns raw match data into a spoken recap, and without it the briefing would just be Kokoro reading out a JSON file.


Top comments (0)