-
-
-
Inspiration
- We started from a simple gap: information keeps growing, but reading time doesn't. We wanted to fill that gap with listening.
- Our goal is to enable effortless, sustainable daily catch-up on tech news for people who want to stay current without manual curation.
What it does
- Fetches recent articles from topics selected during onboarding and generates short audio from summarized content.
- Delivers daily so you can listen seamlessly in the app (supports background playback and lock-screen controls).
- Lets you adjust topics and listen hands-free to stay up to date.
How we built it
- Frontend: Expo (React Native) + TypeScript + Expo Router. Smooth playback with
react-native-track-player and our PlayerContext.
- Backend: Convex-powered async pipeline for scraping, scripting, TTS, and storage. Firecrawl for article extraction; Convex Storage for audio.
- TTS/Transcode: Gemini TTS to WAV or direct m4a via Cloud Run transcoder; stored as playable URLs.
- Notifications: Daily action checks for new content within the last 24 hours and sends FCM push when available.
Challenges we ran into
- Balancing quality and latency across scraping → script → TTS while keeping the morning delivery window.
- Platform differences for background playback, lock-screen controls, and player state handling on iOS/Android.
- De-duplication across sources and safe concurrency (semaphores) for generation jobs.
Accomplishments that we're proud of
- End-to-end automated pipeline from RSS crawl to playable audio, persisted in Convex Storage.
- Reliable daily content check with push notifications when new audio exists.
- A listening-first mobile UX with background playback, seek, and rate control.
What we learned
- Centering the system on Convex simplifies async orchestration and data integrity.
- Good scripts depend on extraction and prompt design more than raw length; evaluation criteria matter.
- Audio UX quality is in the details: silence, normalization, intro/outro, queue control.
What's next for TuneHop
- Smarter personalization of topics and de-duplication across feeds.
- Offline listening and enhanced playback controls (e.g., smarter skip).
- More natural voices and language handling via improved TTS prompts and voice choices.
- Lightweight sharing to Slack/Discord and better source references in-app.
Built With
- convex
- convex-cronjobs
- convex-storage
- expo-localization
- expo-router
- expo.io
- express.js
- ffmpeg
- firebase-cloud-messaging-(fcm-http-v1)
- firecrawl-api
- gemini-2.5-flash-preview-tts
- google-cloud-run
- google-generative-language-api-(gemini-2.5-flash)
- google-oauth-2.0
- i18n-js
- javascript
- jose
- pnpm
- react-native
- react-native-community/slider
- react-native-firebase-auth
- react-native-gesture-handler
- react-native-reanimated
- react-native-safe-area-context
- react-native-screens
- react-native-track-player
- react-navigation
- revenuecat
- typescript
- xai-grok
Log in or sign up for Devpost to join the conversation.