A lightweight, battery-efficient internet radio app for Android, optimized for streaming audio playback.
Features • Download • Building • Tech Stack • Privacy
- One-tap playback — Tap to start/stop streaming
- Media controls — Notification, lock screen, and Quick Settings tile
- Smart audio — Auto-pause on headphone disconnect, resume on reconnect
- Sleep timer — 15/30/60/90 minute auto-stop
- Equalizer — Normal, Bass Boost, Vocal, and Treble presets
- Chromecast — Cast to any device (on-demand dynamic module)
- Home screen widget — Glance widget with Material 3 theming
- Android Auto — Hands-free media controls
- Wear OS — Standalone companion app
- ChromeOS — Resizable windows, keyboard/mouse support
- App shortcuts — Long-press to instantly start playback
- Auto-reconnect — Exponential backoff retry on stream errors
- Open source licenses — In-app OSS license viewer
| Variant | Description |
|---|---|
| Play | Google Play build with Firebase Crashlytics + Analytics |
| FOSS | Fully open-source build, no Google dependencies |
- ~2.5 MB release APK with aggressive R8 optimizations
- On-demand Chromecast module (~750KB) downloaded only when needed
- ARM + x86_64 ABIs (phones, tablets, ChromeOS)
- HTTP/2 via OkHttp 5 with connection pooling and DNS caching
- Modern TLS only —
ConnectionSpec.MODERN_TLSrejects legacy ciphers - Network security config — cleartext traffic blocked, debug proxy support
- Optimized buffering tuned for 64kbps live radio (2.5s initial, 15-60s adaptive)
- ICY metadata for track info display
- IPv4 preference on mobile networks for faster connections
- Partial wake lock + WiFi lock during playback only
- Automatic lock release when paused/stopped
- Foreground service with efficient notification updates
- Kotlin 2.3.20 with Compose UI + Material 3 Expressive
- Media3 1.10.0 (ExoPlayer + MediaSession + Cast)
- OkHttp 5.3.2 for HTTP/2 networking
- DataStore for preferences
- Glance for home screen widget
- Firebase Crashlytics/Analytics (Play builds only)
- aboutlibraries for OSS license display
- LeakCanary in debug builds
- AGP 9.2.1 with configuration cache
- Eclipse Adoptium Temurin JDK 21 via Foojay resolver
- Gradle 9.5.0 with parallel builds and build cache
- JaCoCo coverage with 5% minimum threshold
- Baseline profiles for AOT compilation
- Convention plugins (
build-logic/) for shared config
# Install mise (https://mise.jdx.dev/getting-started.html)
mise install
# Preferred local build commands (clean, minimal Gradle output)
just build # uses default flavor ("foss")
just build-foss
# Debug build (Play variant)
./gradlew assemblePlayDebug
# Debug build (FOSS variant)
./gradlew assembleFossDebug
# Release build (requires signing config)
./gradlew assemblePlayRelease assembleFossRelease
# Run tests
./gradlew testPlayDebugUnitTest :wear:testDebugUnitTest
# Lint
./gradlew lintPlayDebug
| Artifact | Description |
|---|---|
app-play-release.aab |
Signed AAB for Play Store |
app-play-release-unsigned.apk |
Play release build with Crashlytics |
app-foss-release-unsigned.apk |
FOSS release build (no Google deps) |
app-play-debug.apk |
Debug build with LeakCanary + StrictMode |
- Android 7.0 (API 24) or higher
- Internet connection for streaming
SIR collects no personal data. All preferences are stored locally on-device. See the Privacy Policy.
This project is licensed under the MIT License - see the LICENSE file for details.
Copyright © 2026 Cascadia Collections