This is a submission for Weekend Challenge: Passion Edition
What I Built
In the Philippines, basketball is not a sport. It is infrastructure. Every street corner (we call it a "kanto") has a hoop, sometimes just a rim bolted to a coconut tree. Every summer, every barangay (neighborhood) runs its own liga, and every liga has one irreplaceable figure: the courtside announcer.
He sits behind a plastic table with one busted speaker and turns a random Tuesday elimination game into Game 7 of the NBA Finals. Half Tagalog, half English, one hundred percent passion.
I play basketball every Sunday night at 7 PM, without fail, around my work and family schedule. That announcer voice is the soundtrack of my whole basketball life. So for the Passion Edition, I built him.
Kanto Caster is a web app where you type any basketball play, pick a hype level (Chill Liga, Semis, or Game 7 Finals), and an AI liga announcer calls it live, in authentic Taglish, out loud, over a murmuring crowd. And because Taglish is the whole point but not everyone speaks it, every call shows a subtle English translation under the board text, so anyone can enjoy both the sound and the jokes.
Demo
Try it live: https://kantocaster.vercel.app
Type a play, pick a hype level, hit "Call the Play!", then "Play on the Speaker" to hear it with the crowd under it. One honest note: the live demo runs on free API tiers with a small daily voice budget. If the announcer has gone hoarse for the day, the text calls and translations still work, and the voice comes back tomorrow.
A call it generated at the Game 7 Finals hype level:
Bryan sa steal, tumatakbo, coast to coast, buzzer beater... LAYUP GOOD! KAMPEON ANG BARANGAY, SI BRYAN "THE BULLET" ANG NAGWAGI!
And the English gloss the app shows under it:
Bryan with the steal, he's running, coast to coast, buzzer beater... LAYUP GOOD! THE BARANGAY ARE CHAMPIONS, BRYAN "THE BULLET" WINS IT FOR THEM!
Code
Kanto Caster
AI Taglish barangay liga basketball announcer. Type the play, Claude writes the courtside commentary in authentic liga announcer Taglish (with an English translation shown under it), and ElevenLabs speaks it out loud.
Built for the DEV Weekend Challenge: Passion Edition (deadline July 13, 2026, 6:59 AM UTC). Targets the "Best use of ElevenLabs" bonus category.
Stack
- Node.js + Express (single server.js)
- Anthropic Messages API (claude-sonnet-4-6) for commentary
- ElevenLabs TTS (eleven_multilingual_v2, handles Taglish well)
- Vanilla HTML/CSS/JS frontend, no build step
Run locally
cp .env.example .env # then fill in your keys
npm install
npm start
# open http://localhost:3000
Deploy
Vercel (primary): the repo ships with vercel.json and api/index.js that wrap the same Express app as a serverless function, while public/ is served statically. Steps:
- Push the repo to GitHub and import it at vercel.com/new (framework preset: Other, no build command)
- Add the env vars in Project Settings:
ANTHROPIC_API_KEY…
MIT licensed. Node.js + Express, one server file, vanilla HTML/CSS/JS frontend. No framework, no build step.
How I Built It
The flow is three API calls and a lot of care about authenticity:
- Claude (claude-sonnet-4-6) writes the call as a veteran barangay announcer in natural Taglish
- A second, separate Claude call translates it into English for the on-screen gloss, so the announcer prompt stays pure
- ElevenLabs (eleven_multilingual_v2) voices it, with low stability and high style settings for that hoarse, overdriven liga announcer energy
The most interesting part was getting the announcer to sound real instead of like a meme. My first prompt leaned on catchphrases and it produced reaction spam, all shouting, no play. So I studied how Filipino announcers actually call games. The most famous call in Philippine basketball history is nine words: "Six seconds to work with. Jimmy launches it... Baaang!" Real calls narrate a sequence, setup, action, then one explosive punch at the exact moment the play finishes, and they last about as long as the play itself. The prompt now enforces that structure and a 10 to 25 word budget, and the difference is night and day.
The crowd layer taught me a similar lesson. I tried synthesizing crowd noise procedurally, twice, and it sounded like strong wind and then like angry robots. I ended up adapting a public domain recording ("High School Cafeteria" by aradlaw, via Wikimedia Commons), finding the flattest 16.5 second stretch programmatically, and equal-power crossfading it into a seamless 15 second loop. It plays quietly under the announcer with a mute toggle, and the choice is remembered.
Small things that mattered: the whole UI is designed after the two most iconic objects of Philippine liga culture, the yellow tarpaulin banner and the LED scoreboard. Errors show in clear red with actionable messages. A dependency-free rate limiter (10 requests per minute per IP) protects the free API tiers on the public demo.
Basketball has been my passion since childhood, and I build AI automation systems for a living. Voice AI finally got good enough at code-switched languages like Taglish that this project stopped being a gimmick and started sounding real. When I played the first generated call out loud, I laughed for a full minute. It sounded like home.
Next up: a highlight reel mode that calls a full quarter, and maybe bringing it to an actual liga this summer with a Raspberry Pi and a real busted speaker, for authenticity.
Prize Categories
Best Use of ElevenLabs. The entire product is the voice. What makes this more than a text-to-speech demo is code-switching: eleven_multilingual_v2 switches between Tagalog and English mid-sentence without breaking character, which is exactly how real Filipino announcers talk and, as far as I know, the hardest thing to ask of a TTS model. The delivery settings (stability 0.35, style 0.85) push it into genuine courtside hype, and the short punchy call format gives the model the dramatic pauses that make it land.


Top comments (0)