Skip to content

papi-ux/nova

Nova

Game streaming that feels native on Android.

Stream PC games to phones and handhelds over your local network. Built for Polaris, compatible with other Moonlight-compatible hosts.

Stars License Release

Install · Quick Start · Compatibility · Known Limitations · Roadmap · Why Nova · With Polaris · Screenshots · Build · Security · Changelog · FAQ

Support: Issues · Discussions


Nova on Android: server browser, game grid, library detail sheet, quick menu, and live stream HUD

Install

Get it on Obtainium   Get it on GitHub Store   Get it on GitHub   Latest APK

Recommended install path

  1. Download the latest release from GitHub Releases, add Nova to Obtainium, or open it in GitHub Store on Android.
  2. Install the APK that matches your Android device. Most phones and handhelds use Nova-Android-arm64-v8a.apk; x86_64 Android devices and emulators use Nova-Android-x86_64.apk.
  3. Open Nova, add or discover your host, then pair it.
Public release asset Use it for
Nova-Android-arm64-v8a.apk Recommended Android install for phones and handhelds
Nova-Android-x86_64.apk Android x86_64 devices and emulators
*.apk.sha256 Integrity checks for the public APKs

The latest direct APKs are always available through GitHub's latest-release URLs: https://github.com/papi-ux/nova/releases/latest/download/Nova-Android-arm64-v8a.apk and https://github.com/papi-ux/nova/releases/latest/download/Nova-Android-x86_64.apk. The Obtainium link above is preconfigured for the ARM64 public asset so updates resolve to one APK cleanly. The GitHub Store link opens Nova's public release repo for users who prefer that installer; GitHub Store filters assets for the device it is running on, so its desktop app may show Nova as unavailable because Nova ships Android APKs.

F-Droid and IzzyOnDroid packaging notes are tracked in docs/fdroid.md, including current status, APK scan notes, and source-build blockers.

If you install manually, verify the download before sideloading:

sha256sum -c Nova-Android-arm64-v8a.apk.sha256

Note

If you distribute Nova from a private GitHub fork, Obtainium needs a Personal Access Token with repo scope. Public release repos do not.

Note

v1.0.0 is the first public Nova release line, v1.0.1 adds the first store-packaging pass, and v1.0.2 hardens the security surfaces found during public scanner review. Nova is already usable, but this is still an early public release and you should expect bugs, regressions, and rough edges while the Android client and Polaris integration continue to harden. app/ is the only shipping client today.

Built and tested most heavily on: Retroid Pocket 6, Retroid Pocket Flip 2, Pixel 10 Pro.

Quick Start

First stream

  1. Install Nova from GitHub Store, Obtainium, or GitHub Releases.
  2. Add your server from the Servers screen. Polaris hosts appear automatically on the LAN when discovery is enabled.
  3. Pair once using one of three paths:
    • Trusted Pair (TOFU) on a trusted subnet
    • QR pairing from the Polaris web UI
    • Manual PIN pairing for standard Moonlight servers
  4. Launch a game from the game grid or the Polaris library.
  5. Use the quick menu for stream tuning, overlays, controller actions, and quit/disconnect controls.

If you use Polaris

Nova gets the best experience when the host is Polaris:

  • featured Continue surface with live/watch state, cover art, and one-tap resume
  • host-recommended Headless or Virtual Display launch modes
  • live ACT / TGT FPS HUD readouts
  • watch active stream without stealing ownership
  • owner-aware quit and resume
  • clear Baseline / AI tune / Cached AI / Recovery tune labels in Polaris-backed flows
  • live host tuning for Adaptive Bitrate, AI Optimizer, and MangoHud
  • richer library metadata, cover art, and per-game recommendations

If you use another compatible host

Nova still works as a standard Moonlight client. Pair normally, launch normally, and stream normally. Polaris-only UI simply stays out of the way.

Compatibility

Area Status Notes
Android handhelds Primary target Designed first for landscape handheld use
Android phones and tablets Supported Works well, but the UX is tuned most heavily for handhelds
Polaris Best experience Full launch-mode, watch-mode, tuning, library, and live-session integration
Other Moonlight-compatible hosts Compatible Standard Moonlight-compatible client flow
High refresh devices Supported Nova can request 90/120 Hz when the device display and host both support it
Official release assets arm64-v8a, x86_64 Public GitHub Releases ship separate APKs per Android ABI

Known Limitations

  • Advanced launch modes, watch mode, live host tuning, and richer session telemetry are Polaris-specific.
  • Nova is not on the Play Store; the public install paths are GitHub Releases, Obtainium, and GitHub Store.
  • High refresh streaming is limited by the real display panel on the Android device, not just the selected setting in Nova.
  • Public releases currently ship arm64-v8a and x86_64 APKs. Other ABIs are available from local source builds.
  • Today, only the Android client ships.

Why Nova

Nova is a Moonlight-compatible Android client built for handhelds first, not desktop assumptions squeezed onto a touch screen.

  • Handheld-first UI: large game art, clear session actions, controller-friendly navigation, and OLED-aware themes
  • Clear launch surfaces: host library screens keep the primary action obvious instead of burying resume/watch behind generic grids
  • Practical session controls: quick menu, multi-mode HUD, reconnect overlay, and live stream state
  • Deep input support: gyro aim, audio haptics, gamepads, mouse modes, and touch controls
  • Polaris-aware workflow: library metadata, launch-mode choices, watch mode, session ownership, live tuning, and stream reports

With Polaris

Capability What It Does
Launch modes Pick Headless or Virtual Display per launch when the host supports it
10-bit opt-in Enabling HDR can request a 10-bit stream even on SDR handheld displays
Watch Stream Join an active session as a passive viewer instead of taking ownership
Session truth HUD and quick menu show the live mode, owner/viewer role, and negotiated stream state
AI state Library and quick menu can distinguish baseline device tuning, live AI, cached AI, recovery tuning, and host-adjusted recommendations
Stream tuning Toggle Adaptive Bitrate, AI Optimizer, and MangoHud from the quick menu
Library Cover art, genres, source badges, recommendations, and per-game launch guidance

Core Features

  • Streaming and HUD: H.264, HEVC, and AV1 decode; full, banner, and FPS-only HUD modes; actual vs target FPS labels; reconnect overlay; quality presets for quick setup
  • Input: gyro aim, audio haptics, broad controller support, Direct/Trackpad/Relative mouse modes, and compact handheld on-screen controls
  • Polaris flow: host-backed library, Continue/watch flows, explicit Headless vs Virtual Display launches, AI source labels, live tuning, and warnings before risky MangoHud launches

Screenshots

Themes
Main menu and theme system
HUD modes
Nova HUD modes and on-stream toggles
Games home
Games home with Continue rail and host shortcuts
Library grid
Polaris library with filters, search, and HDR-ready badges
Library detail sheet
Per-game launch modes and next-launch tuning
Quick menu
Quick menu for tuning, overlays, controls, and session actions
Architecture
block-beta
  columns 1

  block:kotlin["com.papi.nova — Kotlin"]:1
    columns 4
    api["api/\nREST + SSE"]
    manager["manager/\nResilience"]
    ui["ui/\nHUD, Themes\nLibrary, Menu"]
    service["service/\nQS Tile\nKeep-alive"]
  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"]
  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
Loading

All new Nova-specific behavior lives in the Kotlin layer. The Java core stays close to Moonlight and is changed surgically.

Build From Source

Requirements

Tool Version
JDK 17
Android NDK 27.0.12077973
Android SDK compileSdk 36
Git with submodule support

Clone

git clone --recursive https://github.com/papi-ux/nova.git
cd nova

Repository Layout

Path Purpose
app/ Current Android client

Android is the only public release target today.

Build

# Release APKs
./gradlew assembleNonRoot_gameRelease

# Debug APKs (installs alongside release as com.papi.nova.debug)
./gradlew assembleNonRoot_gameDebug

By default, local source builds produce split APKs for arm64-v8a and x86_64.

Tip

Official GitHub releases ship a signed arm64-v8a APK for real devices as Nova-Android-arm64-v8a.apk.

If you want a different ABI set locally: ./gradlew assembleNonRoot_gameDebug -PnovaAbis=arm64-v8a,armeabi-v7a,x86,x86_64

Install on device

Use 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
Build flavors and tests
Flavor Package Notes
nonRoot_game com.papi.nova Standard release build
nonRoot_gameDebug com.papi.nova.debug Debug build, installs alongside release
./gradlew :app:testNonRoot_gameDebugUnitTest

FAQ

Does Nova work with other Moonlight-compatible hosts, not just Polaris?

Yes. Nova is a Moonlight-compatible client. Polaris adds the richest integration, but Nova still works with other Moonlight servers.

What is Trusted Pair?

Trusted Pair is Nova’s TOFU flow. If Polaris trusts the subnet you are on, Nova can complete first pairing without the usual PIN ceremony. You can still use QR or manual PIN pairing when you want the traditional flow.

What is the difference between Headless and Virtual Display?

Headless launches against Polaris’ isolated compositor path without touching your physical desktop layout. Virtual Display asks the host for a virtual display-backed launch instead. Nova’s Polaris library now shows what the host recommends, what the app prefers, and which modes are currently allowed.

Can Nova request a 10-bit stream on an SDR display?

Yes. When you explicitly enable HDR in Nova and the server supports Main10, Nova can request a 10-bit stream even if the handheld screen itself does not advertise HDR10. This is especially useful with Polaris on handhelds such as Retroid devices.

What does Watch Stream do?

Watch Stream lets a second device join an already running Polaris session as a passive viewer. It does not take ownership, and viewer sessions are limited to the active stream profile rather than silently renegotiating their own version.

Why does Nova warn me before enabling MangoHud?

On Polaris-backed Steam Big Picture and Steam/Proton titles, MangoHud can crash helper processes early enough to leave the session black-screened. Nova flags those launches before you enable MangoHud so the safer choice is obvious.

Is there a native Steam Deck or iOS client yet?

Not today. Nova currently ships as an Android client only.

Why can't I find Nova on the Play Store?

Nova is distributed through GitHub Releases, Obtainium, and GitHub Store. The official public release path is GitHub first.

AI Transparency

Nova is built and released by me, with assistance from tools such as OpenAI Codex, Claude, and local models.

I use those tools for documentation polish, release workflow cleanup, store-readiness checks, build/test triage, implementation review, and to compare approaches while debugging. They do not decide what Nova or Polaris are, what features ship, or what releases are published. I review, edit, build, test, and approve the changes before release, and I own the final engineering and trust-boundary decisions.

Contributing

Contributions are welcome, especially focused fixes, UI polish, docs, translations, and careful feature work. Nova is still a small maintainer-led project, so the easiest pull requests to review are the ones that explain the problem clearly and keep the change scoped.

  1. Fork the repo and branch from master.
  2. Build with ./gradlew assembleNonRoot_gameDebug.
  3. Test on a real device or emulator.
  4. Open a pull request that explains what changed, why it helps, and what you were able to test.

Note

The native streaming layer in app/src/main/jni/moonlight-core/ is a git submodule. Run git submodule update --init --recursive after cloning.

Donate

Nova is a fun project I build in my spare time simply because I want more people to make the switch to Linux gaming while making users safer, clearer, and easier to trust. If it becomes part of your setup, that alone makes my day, donations are appreciated but never expected. They help with my actual coffee budget, which coffee obviously keeps the project moving. Bug reports, testing notes, and thoughtful feedback help too.

Ko-fi   PayPal

License

Nova is licensed under the GNU General Public License v3.0. See LICENSE.txt for the full text.

Nova builds on Artemis, Moonlight Android, and moonlight-common-c under GPLv3 lineage.

Packages

 
 
 

Contributors