Android TV client for watching F1 TV content with a remote-friendly Leanback UI.
This repository is an updated fork focused on current Android TV devices, local sideload installs, and up-to-date playback behavior. It is not affiliated with Formula 1 or F1 TV.
- Browse current and archived sessions.
- Play main feeds, onboard cameras, tracker/data channels, and other multi-channel session feeds when F1 TV exposes them.
- Support multiple audio tracks, including commentary-free feeds when available.
- Show and switch video quality from the player controls.
- Display the active video quality and audio language in the playback overlay.
- Support subtitles/closed captions when provided by the upstream stream.
- Support custom radio audio injection with adjustable sync delay.
- Use a TV-first sign-in flow instead of requiring a browser on another device.
- Playback capability depends on what F1 TV returns for a given session, region, account tier, and device path.
- The app can use higher-quality streams, including 50 fps content and 4k HDR variants, when your subscription is eligible and the device can decode them.
- If a preferred playback path fails, the app falls back to more widely compatible stream variants automatically.
- An Android TV or Google TV device running Android 9+.
- A valid F1 TV subscription with access to the content you want to watch.
- Sideloading enabled if you are installing the APK manually.
This project is distributed as a sideloaded APK. It is not maintained through the Play Store.
Download a release APK from your distribution point of choice and sideload it with ADB or your preferred TV installer.
- Install JDK 21.
- Install the Android SDK and platform tools.
- Clone the repository.
- Optionally create a
.envfile in the project root for build-time defaults (see below). - Use one of the Gradle install tasks below.
.\gradlew.bat :app:installDebug
.\gradlew.bat :app:installReleaseIf no custom release signing properties are configured, the release build falls back to the debug keystore so it remains installable for local testing.
The app can read a few build-time defaults from a root .env file:
F1_username=
F1_password=
TOKEN_REFRESH_INTERVAL_MS=
CUSTOM_RADIO_URL=These are optional. The normal flow is still signing in on device and changing settings from the app UI.
- Android Gradle Plugin based project with Kotlin DSL.
- Kotlin + Coroutines.
- Hilt for dependency injection.
- Moshi for JSON.
- Room for local persistence.
- Media3 / ExoPlayer for playback.
- JavaCV / FFmpeg for in-app custom radio normalization.
.\gradlew.bat :app:assembleDebug
.\gradlew.bat :app:assembleRelease
.\gradlew.bat :app:compileDebugKotlin
.\gradlew.bat :app:installDebug
.\gradlew.bat :app:installRelease- TV-native sign-in screen with saved credentials.
- Home screen focused on current season and available sessions.
- Session screen with per-channel browsing for onboard and data feeds.
- Playback controls for seek, audio track selection, channel switching, quality selection, subtitles, and custom radio sync.
- App language options for English, German, Spanish, French, Dutch, Polish, Portuguese, Russian, or system default.
- This app only plays streams and metadata that F1 TV currently exposes to the authenticated account.
- Availability of subtitles, alternate audio, onboard feeds, HDR, or higher resolutions varies by session, subscription and device.
- Buffering or stream-rule failures are often upstream service issues rather than local player bugs.
- Changes on the F1 TV side can break playback without warning.
Thanks to Groggy, the original creator of the project this fork builds on.
Thanks to the contributors to f1viewer for the public groundwork around F1 TV API behavior.
Thanks to Thiago Andrade for the icon and visual design work carried forward in the project.
Thanks to Leonardo Rossetto for his earlier work this fork was built on.
Thanks to LoVega1337 and Loïc Yhuel for their knowledge about the 4K/HDR manifest.




