This is a submission for the Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass
What I Built
StrideCast is a mobile-first PWA that writes and narrates a podcast for your run, timed to your duration, pace, mood, and a topic you choose. Then it plays it in airplane mode while tracking your route.
The idea started with a simple annoyance: the phone is the thing that pulls you out of a run. Notifications, feeds, one more scroll before you start. StrideCast makes the screen the shortest part of the experience. Setup takes about 30 seconds, and after that it's one big START button and the phone goes in your pocket.
It's for everyday runners and trail joggers who want company on a run without cellular data, an account, or an app that watches where they go.
Demo
The video walks through the full flow: setup, live generation progress, the "Offline-ready β" state, the run screen, and the saved summary with an offline route.
Code
π StrideCast
Your run, your story, no signal needed.
StrideCast is a mobile-first PWA running companion that generates a personalized podcast for your run using open-source AI β then plays it offline while tracking your pace and route.
Built for the DEV Hacktoberfest Open-Source AI Challenge: Week 1 (theme: "Touch Grass").
π± Screenshots
β¨ How It Works
- Set up (~30 seconds): Pick your duration, pace, mood, voice, and podcast topic
- Generate: Local AI writes a podcast script and narrates it segment by segment
- Cache: Audio files download into the browser Cache API for 100% offline playback
- Run: Turn on Airplane mode and head outsideβ¦
How I Built It
Everything in the AI pipeline runs locally. There are no cloud APIs.
- Script writing: Gemma2:2b, served by Ollama. The backend calculates the words needed for your run (about 150 per minute) and asks the model for structured, segment-based scripts of 2-3 minutes each.
- Voice: Kokoro synthesizes each segment into audio.
- Backend: FastAPI with Pydantic v2, streaming progress to the app over Server-Sent Events, so you can watch the script get written and the voice get recorded.
- Frontend: React 19, TypeScript, and Tailwind v4, packaged as a PWA with vite-plugin-pwa (Workbox). Finished audio is saved into the browser Cache API.
- On-device data: Zustand and IndexedDB hold your settings and run history. Tracking uses the Geolocation API with noise filtering, Haversine distance, and the Screen Wake Lock API. The route is drawn as an SVG, so it needs no map tiles and works offline.
Why Does Open Innovation Matter?
- It works where there's no signal. A closed API needs a connection at the exact moment you want to be disconnected. Local models mean the whole run can happen on a trail with zero bars.
- Your location stays yours. GPS breadcrumbs, pace splits, and run history never leave your devices. With no server and no account, there's nothing to leak or monetize.
- No per-run cost, no surprises. Generating a 30-minute podcast with hosted LLM and voice APIs would charge every time, and endpoints can change or disappear. With open weights, a run costs electricity.
- Everything is swappable. The model and voice are config values, so a better small model next month is a one-line change.
Prize Categories
- Best Use of Gemma: Gemma, run locally through Ollama, writes every script, and the model is swappable through one config value.







Top comments (0)