A modern open-source Android internet radio player that finds streams from station websites.
I built Freqcast because I couldn't find a radio app that stayed simple. Most alternatives either include ads, depend on proprietary station catalogs, or make adding custom stations harder than it should be.
Freqcast is fully local, requires no account, and works with standard HTTP/HTTPS streams and HLS. The goal is simple: if a station has a public stream, you should be able to listen to it without fighting the app.
Most radio apps expect you to manually find the actual stream URL.
Freqcast lets you paste the station's website instead. It first checks Radio Browser, then scans the website itself, discovers a playable stream, verifies that it works, and adds it to your library. In many cases, you never have to hunt for a .mp3, .aac, or .m3u8 URL yourself.
- ➕ Paste a station website instead of hunting for a stream URL — Freqcast automatically discovers and verifies the playable stream whenever possible
- 🔎 Discover stations — search the Radio Browser directory by name, genre, country, language, or "near me", and add results straight to your library
- 🔁 Background playback with automatic reconnect
- ⏪ Timeshift for compatible streams
- 🎶 Live ICY metadata
- 😴 Sleep timer and multiple wake-up alarms
- 🏠 Home screen widget and Android Auto
- 📤 Import/export station lists (JSON, OPML, M3U, PLS)
- 📱 Tablet and foldable layouts
- 🌐 Localized into English, Russian, Spanish and Simplified Chinese
Internet radio is one of those technologies that has quietly survived for decades, but the Android ecosystem around it has become surprisingly fragmented.
I wanted a player that simply plays internet radio well, stores everything locally, supports modern Android APIs, and makes adding stations effortless—even when all you have is the station's homepage.
Freqcast started as that personal project and gradually evolved into a fully featured open-source player.
Grab the latest APK from the Releases page and install it — no Play Store listing. 🎉
Requires Android 10 (API 29) or higher.
- 🧬 Clone the repo and open it in Android Studio (or use ./gradlew directly — the wrapper is committed)
- ☕ Requires JDK 24 and Gradle 9.0+ (bundled via the wrapper)
- 🏗️ Build: ./gradlew build, or ./gradlew installDebug to install on a connected device/emulator
- 🧰 make wraps common tasks: make format, make lint, make test, make build, make check, make run
./gradlew test
./gradlew verifyRoborazziDebug
./gradlew koverHtmlReportDebug📊 Coverage is uploaded to Codecov on every push/PR (informational, not a merge gate). CI (.github/workflows/ci.yml) also runs ktlintCheck ✅ and builds the debug APK 🏗️ on every push/PR; release.yml builds and signs 🔏 a release APK on version tags.
| Permission | Why |
|---|---|
| INTERNET, ACCESS_NETWORK_STATE | 🌐 stream playback, connectivity checks |
| FOREGROUND_SERVICE, FOREGROUND_SERVICE_MEDIA_PLAYBACK | 🔁 background playback |
| POST_NOTIFICATIONS | 🔔 media notification (Android 13+) |
| WAKE_LOCK | 🔋 keep the network alive while playing with the screen off |
| RECEIVE_BOOT_COMPLETED, SCHEDULE_EXACT_ALARM | ⏰ wake-up alarms survive reboot and fire at the exact time |
| ACCESS_COARSE_LOCATION | 📍 only used for Discover's "near me" search; sent for that one search, never stored |
If you'd like to support development, see FUNDING.md (Boosty / crypto).
Licensed under GPL-3.0 — free to use, modify, and distribute, including commercially. Modified or redistributed versions must also be released under GPL-3.0 with source available.
