This is a submission for if you're curious.)
Every run since gets logged on Strava—pace, heart rate, cadence, the works. But the data just sits there as numbers on a screen. It never feels like anything.
So I built Race Recap Radio.
Upload a .gpx or .tcx file exported from Strava, Garmin, Coros, Nike Run Club, or similar platforms, and the app turns your run into a broadcast-style race recap. Gemini writes the commentary from your actual run data, while ElevenLabs brings it to life with energetic sports commentary.
Real splits become real narrative beats: the grind, the redline heart-rate moment, the closing kick, and the payoff.
The demo on the homepage is my actual June 28 evening 10K: 10.11 km in 1:14:04, with my heart rate climbing from 158 to 197 bpm and a late surge that set two PRs.
Here's part of what Gemini and ElevenLabs produced:
"Alright sports fans, buckle up! We're diving deep into the Evening Run, a monumental 10.11 kilometer effort... Then came the ultimate test! The heart rate climbed, reaching a blistering 197 bpm, absolutely redlining! That's precisely where the notable surge ignited, between kilometer 8.6 and 9.1! And what a closing kick!"
Nothing in that commentary is invented. Every moment comes directly from the run itself—the surge, the heart-rate spike, the finishing kick—all detected from the uploaded activity.
The part I care about most is that it's not just my run.
Upload your own .gpx or .tcx file and you'll get a recap built entirely from your activity. Parsing happens entirely in your browser, so the raw GPS trace never leaves your device—only a compact summary is sent to generate the commentary.
Demo
🔗 Live app:
- Or click "Upload your run" and drop in your own
.gpxor.tcx. Below is a completely different 5K I uploaded to demonstrate that every upload generates a fresh recap rather than replaying canned audio.
Turn any run into a hype broadcast-style audio recap
Race Recap Radio 🎙️
Turn a run into a hype, broadcast-style audio recap. Feed a run's real
splits, heart rate, and PRs to Gemini, which writes a sports-commentator
script, then to ElevenLabs, which voices it. Built for the dev.to
How I Built It
Everything flows through a single RunSummary model. Whether the source is the baked-in demo or an uploaded activity, every run is normalized into the same structure—distance, pace, heart rate, cadence, per-kilometer splits, best efforts, PR count, and detected race events—before anything touches an API.
Parsing real running files
Supporting both .gpx and .tcx turned out to be the trickiest engineering challenge.
TCX files provide cumulative distance at every point, which is essential because treadmill workouts often contain no GPS coordinates at all. GPX files, on the other hand, only contain latitude and longitude, so distance has to be reconstructed using the haversine formula between consecutive points.
Multi-lap TCX files introduce another wrinkle by resetting their cumulative distance every lap, so those segments have to be stitched back together manually. Regardless of format, the raw activity never leaves the browser.
Turning data into commentary
Gemini receives the summarized run data—splits, heart-rate progression, detected surges, PRs, and pacing trends—and writes a structured 45–60 second sports broadcast.
The prompt guides the narration through a consistent flow:
- hype introduction
- the grind
- the redline moment
- the closing kick
- the payoff
If a run has no heart-rate data or no PRs, Gemini naturally adapts instead of mentioning missing information.
Giving it a voice
I originally chose a voice from ElevenLabs' shared Voice Library, only to discover that library voices require a paid subscription for API access—even on free accounts.
The fix was switching to one of the built-in premade voices ("Charlie — Deep, Confident, Energetic"), which works perfectly on the free tier. It was a small lesson, but exactly the kind of issue that can quietly break a live demo.
Protecting the free tier
ElevenLabs' free tier has a very limited generation quota, so I designed the app around it.
- The homepage demo plays a pre-generated MP3 committed as a static asset, meaning unlimited playback without API usage.
- Live generations are protected by Upstash Redis with both a per-IP hourly limit and a deployment-wide lifetime budget.
- If a generation fails midway, its reserved quota is refunded so transient failures don't permanently consume the available budget.
Stack: Next.js 16, React 19, TypeScript, Tailwind CSS v4, Framer Motion, @google/genai, ElevenLabs REST API, Upstash Redis.
Running is already emotional.
I wanted the recap to sound the way it felt.
Prize Categories
Submitting for:
- 🧠 Best Use of Google AI — Gemini transforms real running telemetry into an original sports commentary instead of a templated summary.
- 🔊 Best Use of ElevenLabs — The voice isn't just an output; it's the experience that turns data into something worth listening to.
Community-Analysen & Experten-Meinungen 0
Verwandte Story-Cluster & Quellen (Vektor-KI)
Ähnliche Beiträge
Auch interessante Nachrichten Race Recap Radio — I turned my 10K into a hype sports broadcast
Thematisch verwandte Begriffe: Race, Recap, Radio, turned · 6 Treffer
Razer's new Tartarus V2 Pro is the weirdest gaming keyboard I've ever wanted, loaded with fancy switches and ergonomic relief
Videos werden geladen ...
Beiträge werden geladen ...
Videos werden geladen ...
Beiträge werden geladen ...
Videos werden geladen ...
Beiträge werden geladen ...
Videos werden geladen ...
Beiträge werden geladen ...
Videos werden geladen ...
SOCIAL SHARE CARD GENERATOR