Inspiration

WorldWave started from a simple frustration: discovering live TV and radio from other countries is still weirdly hard. Streams are scattered across directories, many links fail, and most apps separate TV, radio, favorites, and discovery into different experiences.

I wanted to build a calmer way to explore the world through live media: pick a country, browse what is available, tap play, and keep moving.

What it does

WorldWave is a SwiftUI app for discovering live TV and radio from around the world. Users can browse by country, category, search, or an interactive globe, then play channels and stations through a shared native playback engine.

It includes:

  • Live TV and radio modes
  • Country and category browsing
  • Search across channels and stations
  • Interactive globe discovery
  • Favorites and recents
  • Onboarding that builds a personalized first lineup
  • Family Mode with a parent-controlled allow-list
  • Pro features powered by RevenueCat
  • Support for iPhone, iPad, Mac, and CarPlay-oriented playback flows

How I built it

WorldWave is built with Swift 6.3, SwiftUI, SwiftData, AVFoundation, Firebase, and RevenueCat.

The TV directory uses the public iptv-org API, while radio discovery uses Radio Browser with mirror failover. Playback is handled by a single AVPlayer-based engine that can move between TV and radio, track recents, handle failed streams, and fail over when community streams break.

RevenueCat powers the Pro layer, including unlimited favorites, sleep timer, AirPlay convenience features, Family Mode, iCloud sync plans, CarPlay radio access, lifetime unlock, and tip jar support. I designed the purchase flow so monetization appears after the user has seen value, not before.

Challenges I ran into

The hardest part was reliability. Public stream directories are messy: URLs fail, stations disappear, some TV streams play only audio, and radio mirrors can go down. I had to build failover logic, filtering, caching, and recovery states so the app feels stable even when the underlying sources are unpredictable.

Another challenge was designing a subscription model that felt fair. I wanted WorldWave to be useful for free while still having a clear Pro upgrade path. RevenueCat helped centralize entitlement state so the app could keep the business logic clean.

What I learned

I learned a lot about building media apps around imperfect real-world data. A beautiful UI is not enough if playback fails silently, search is slow, or the app blocks on network calls. The product only feels good when the invisible systems are solid.

I also learned that paywalls work best when they are attached to meaningful moments: saving more favorites, enabling Family Mode, syncing across devices, or bringing radio into the car.

What's next

Next I want to polish the first-run experience, expand the Pro feature set, improve stream health checks, add deeper personalization, and continue refining the app for iPad, Mac, and CarPlay.

Built With

Share this project:

Updates

Submission history