Nova is an Android client with a Moonlight-compatible streaming core and a Kotlin layer for Nova-specific product behavior. The README stays focused on what users can do; this page keeps the source layout, build commands, and architecture details in one place.
block-beta
columns 1
block:kotlin["com.papi.nova - Kotlin"]:1
columns 4
api["api/\nREST + SSE"]
manager["manager/\nRuntime tasks\nPolaris startup"]
ui["ui/\nHUD, Themes\nLibrary, Menu"]
preferences["preferences/\nSettings\nProfiles"]
end
block:java["com.papi.nova - Java (Moonlight core)"]:1
columns 5
PcView["PcView\nServers"]
AppView["AppView\nGames"]
Game["Game\nStream"]
nvstream["nvstream/\nProtocol"]
binding["binding/\nDecode + input"]
end
block:native["moonlight-common-c - C / NDK"]:1
columns 3
enet["enet\nTransport"]
fec["Reed-Solomon\nFEC"]
opus["Opus\nAudio"]
end
kotlin --> java --> native
style kotlin fill:#7c73ff22,stroke:#7c73ff,color:#d4dde8
style java fill:#4c526522,stroke:#687b81,color:#a8b0b8
style native fill:#1a1a2e,stroke:#4c5265,color:#687b81
All new Nova-specific behavior lives in the Kotlin layer where practical. The Java core stays close to Moonlight and is changed surgically.
| Path | Purpose |
|---|---|
app/ |
Shipping Android client |
app/src/main/java/com/papi/nova/api/ |
Polaris REST and SSE integration |
app/src/main/java/com/papi/nova/manager/ |
Runtime helpers and Polaris startup coordination |
app/src/main/java/com/papi/nova/preferences/ |
Kotlin settings model, repository, profile override, and Compose UI |
app/src/main/java/com/papi/nova/ui/ |
Nova Library, quick menu, HUD, themes, and Compose surfaces |
app/src/main/jni/moonlight-core/ |
Moonlight native streaming submodule |
baselineprofile/ |
Baseline Profile generation for release performance coverage |
docs/ |
Packaging, performance, and technical notes |
Android is the only public release target today.
| Tool | Version |
|---|---|
| JDK | 17 |
| Android SDK | compileSdk 36 |
| Android NDK | 27.0.12077973 |
| Git | with submodule support |
git clone --recursive https://github.com/papi-ux/nova.git
cd novaIf the repo was cloned without submodules:
git submodule update --init --recursiveAndroid native builds run a preflight check for app/src/main/jni/moonlight-core/moonlight-common-c before invoking ndk-build. If that tree is missing, run the submodule command above instead of chasing downstream C compiler errors.
Nova currently builds the checked-out native streaming tree directly. Prebuilt native artifacts or AAR packaging may be useful later, but that should be a separate release-engineering decision with its own review and provenance checks.
# Release APKs
./gradlew assembleNonRoot_gameRelease
# Debug APKs, installed as com.papi.nova.debug
./gradlew assembleNonRoot_gameDebugBy default, local source builds produce split APKs for arm64-v8a, armeabi-v7a, and x86_64.
To override the ABI set locally:
./gradlew assembleNonRoot_gameDebug -PnovaAbis=arm64-v8a,armeabi-v7a,x86,x86_64Use the ABI-specific APK that matches your device from app/build/outputs/apk/nonRoot_game/<buildType>/.
Example for a real ARM64 device:
adb install -r app/build/outputs/apk/nonRoot_game/debug/app-nonRoot_game-arm64-v8a-debug.apk| Flavor | Package | Notes |
|---|---|---|
nonRoot_game |
com.papi.nova |
Standard release build |
nonRoot_gameDebug |
com.papi.nova.debug |
Debug build, installs alongside release |
Official GitHub releases ship signed APKs for ARM64 devices, 32-bit ARM Android TV devices such as Chromecast with Google TV and Google TV Streamer, and x86_64 devices.
./gradlew :app:testNonRoot_gameDebugUnitTestFor release readiness, pair focused unit coverage with a release assemble:
./gradlew :app:testNonRoot_gameDebugUnitTest :app:assembleNonRoot_gameReleaseNova includes Baseline Profile generation infrastructure for startup and library flows. Release-performance evidence and current limitations are tracked in Video Baseline Evidence.