NuvioTV is a Kotlin-first Android TV application built with Gradle. This guide walks you through everything required to clone the repo, configure your local environment, and produce a working debug or release APK. Read the entire page before starting — several properties affect the native build system and must be set correctly.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/NuvioMedia/NuvioTV/llms.txt
Use this file to discover all available pages before exploring further.
Prerequisites
Before cloning, confirm the following are installed and available on yourPATH:
| Requirement | Minimum version |
|---|---|
| Android Studio | Latest stable |
| JDK | 11+ |
| Android SDK | API 24 (minSdk) — API 36 (compileSdk / targetSdk) |
| Gradle | 8.0+ (wrapper included in repo) |
| NDK | 29.0.14206865 (set in app/build.gradle.kts) |
./gradlew), so you do not need a separate Gradle installation.
Copy the example properties file
The build reads secrets from Open
local.properties at the project root. The example file ships with safe placeholder values.local.properties and fill in the values described in the next section.Open in Android Studio
Open the cloned directory in Android Studio (File → Open). Android Studio will sync the Gradle project automatically. Let it finish before running any Gradle tasks.
Select a build variant
In Android Studio, open the Build Variants panel and select
fullDebug (GitHub release flavor) or playstoreDebug (restricted flavor). See Build Variants below for the difference.Build and deploy
Run a build from the terminal or the Android Studio Run button. See Build Commands below for the full set of Gradle tasks.
local.properties Configuration
All secrets and optional feature flags are supplied throughlocal.properties. The file is never committed to source control. Below is a complete reference for every key defined in local.example.properties.
Supabase Backend
SupabaseModule Hilt provider injects them via BuildConfig.SUPABASE_URL and BuildConfig.SUPABASE_ANON_KEY.
Supabase keys are required only for account-dependent features: sign-in, multi-profile management, cloud library sync, and watch-progress sync. The app runs fully in local-only mode without them — addons, playback, and local watch progress all work without a Supabase connection.
Trakt OAuth
urn:ietf:wg:oauth:2.0:oob) is the correct out-of-band value for TV applications and should not need to change unless you are pointing at a custom Trakt application.
Premiumize OAuth
Playback Analytics Endpoint
PlaybackIssueReportApi Retrofit client. Defaults to https://nuvio.tv/. Set to an empty string or a local endpoint when developing without network access to the production server.
Contributor / Supporters Endpoint
UniqueContributionsApi Retrofit client, used to display the contributors and supporters list in Settings. Leave blank to disable this feature.
Local FFmpeg Decoder
USE_LOCAL_FFMPEG_DECODER=false (the default), the build uses the prebuilt libs/lib-decoder-ffmpeg-release.aar. Setting it to true compiles the :ffmpeg-decoder-downmix Gradle module from source — this requires a full FFmpeg source tree and an out-of-tree build directory. Most contributors should leave this as false.
Dolby Vision Profile 7 Native Bridge
| Key | Purpose |
|---|---|
DOVI_NATIVE_ENABLED | Enables the dovi_bridge native library and runtime bridge |
DOVI_EXTRACTOR_HOOK_READY | Marks extractor hook integration as active in BuildConfig |
DOVI_ENABLE_REAL_LINK | Links the prebuilt libdovi.a into dovi_bridge (vs. stub build) |
DOVI_LIBDOVI_PREBUILT_ROOT | Root path to the DV7/libdovi prebuilt tree — headers and .a are resolved from here |
DOVI_LIBDOVI_STATIC_LIB | Explicit override for the .a path (optional; takes precedence over prebuilt root) |
DOVI_LIBDOVI_INCLUDE_DIR | Explicit override for the include directory (optional) |
Build Variants
Theapp module defines a single flavor dimension named distribution with two product flavors:
- full
- playstore
The This flavor includes the
full flavor is the GitHub Releases distribution. It enables every feature gate:app/src/full/ source set, which provides:AppFeaturePolicywith all features enabledPluginManagerandPluginRuntimefor Cloudstream extension supportExternalExtensionLoader— loads Cloudstream plugins as side-loaded.cs3DEX files viaDexClassLoader- In-app update checks via the GitHub Releases API (
GitHubReleaseApi)
com.nuviodebug.com.main source set and all core subsystems. The difference is purely in which feature gates are open and which source set provides AppFeaturePolicy.
Build Commands
All commands below should be run from the project root. The Gradle wrapper (./gradlew) is included and does not require a separate installation.
Kotlin Compilation Check
Run this first to verify the Kotlin sources compile without producing an APK:Debug Builds
Release Builds
local.properties or as environment variables:
NUVIO_RELEASE_STORE_FILE, NUVIO_RELEASE_KEY_ALIAS, NUVIO_RELEASE_KEY_PASSWORD, NUVIO_RELEASE_STORE_PASSWORD.
Install and Launch on a Connected Device
ABI Splits
The build is configured for per-ABI APK splits (armeabi-v7a, arm64-v8a, x86, x86_64) plus a universal APK. When building an App Bundle (bundleFullRelease), splits are disabled automatically and the bundle handles ABI selection. For development builds, the universal APK is the easiest target to install.