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
Share this project:

Updates