Skip to content

papi-ux/nova

Nova

Polaris-aware game streaming for Android handhelds, phones, and TVs.

Stream PC games from Polaris or any Moonlight-compatible host with a client that understands handheld controls, live session state, launch intent, and host-side tuning instead of hiding everything behind a generic game grid.

Stars License Release

Quick Start · What's New · Install · Compatibility · Tour · Polaris · Docs · FAQ · Security · Changelog · Roadmap

Support: Issues · Discussions


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

Important

Nova is an Android client today. It is built and tested most heavily on handheld Android devices, Android TV, and modern phones, with the richest experience coming from Polaris.

Note

Nova still speaks the Moonlight/GameStream client path. Polaris unlocks the new launch, library, watch, tuning, and session-truth surfaces, but standard Moonlight-compatible hosts remain usable.

Quick Start

First stream

  1. Install Nova from GitHub Releases, Obtainium, or GitHub Store.
  2. Open Servers and add or discover a host. Polaris hosts appear automatically on the LAN when discovery is enabled.
  3. Pair with Trusted Pair on a trusted Polaris subnet, QR pairing from the Polaris web UI, or normal manual PIN pairing.
  4. Launch from the standard game grid or the Polaris-powered Library.
  5. During a stream, open the quick menu for tuning, overlays, controller actions, and quit/disconnect controls. Guide/Mode + Start/Menu opens the quick menu, and Guide/Mode + Y shows or cycles NovaHUD.

Recommended first setup

Device Start here
Android handheld or phone Nova-Android-arm64-v8a.apk
NVIDIA Shield or ARM64 Android TV Nova-Android-arm64-v8a.apk
Chromecast with Google TV, Google TV Streamer, or 32-bit ARM Android TV Nova-Android-armeabi-v7a.apk
Android x86_64 device or emulator Nova-Android-x86_64.apk

If a sleeping host does not report a MAC address, open the host menu and choose Edit Wake-on-LAN MAC. Nova stores that address and reuses it for future wake requests, which helps VPN and routed setups where discovery metadata is incomplete.

What's New in v1.1.0

Nova v1.1.0 is a stream performance and release-hardening update for Polaris-backed play.

  • Lower-overhead HUD metrics: NovaHUD now consumes structured stream samples from the video renderer while preserving the legacy overlay path.
  • Hot-path allocation cleanup: HUD sparkline samples use a fixed primitive buffer instead of rebuilding collection state during a stream.
  • Smoother first-run surfaces: Baseline Profile generation now covers library detail, settings, and launch-adjacent Compose paths.
  • Measured JNI policy: the JNI bridge now has a documented profiling gate for future @FastNative and @CriticalNative work.
  • Retroid 6 validation: the ARM64 debug APK was smoke tested over wireless ADB with Polaris library launch, HEVC stream resume, NovaHUD, Command Center disconnect, and clean crash checks.

See the changelog for the full release history.

Install

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

Use the public release APK that matches your device:

Public release asset Use it for
Nova-Android-arm64-v8a.apk Recommended Android install for phones, handhelds, and ARM64 Android TV devices
Nova-Android-armeabi-v7a.apk Chromecast with Google TV, Google TV Streamer, and other Android TV devices that expose only 32-bit ARM app support
Nova-Android-x86_64.apk Android x86_64 devices and emulators
*.apk.sha256 Integrity checks for public APKs

The Obtainium shortcut is preconfigured for the ARM64 public asset so updates resolve to one APK cleanly. Chromecast and other 32-bit ARM Android TV users should choose the armeabi-v7a asset manually or configure Obtainium to match Nova-Android-armeabi-v7a.apk.

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, https://github.com/papi-ux/nova/releases/latest/download/Nova-Android-armeabi-v7a.apk, and https://github.com/papi-ux/nova/releases/latest/download/Nova-Android-x86_64.apk.

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

Tip

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

Compatibility

Area Status Notes
Android handhelds Primary target Designed first for landscape handheld use
Android phones and tablets Supported Works well, with the UX tuned most heavily for handheld play
Android TV Supported Uses ARM64 or 32-bit ARM APKs with Leanback launcher support and D-pad/controller-friendly browsing
Polaris Best experience Full launch-mode, watch-mode, tuning, library, profile sync, and live-session integration
Other Moonlight-compatible hosts Compatible Standard Moonlight-compatible client flow
Steam Controller 2026 Partial Android HID support Android may expose Bluetooth mode as a Valve keyboard/mouse HID; Nova recognizes common Valve HID names for host gamepad presence and compatible D-pad/button events
Wake-on-LAN Supported Sends UDP magic packets directly from Android and supports manual MAC entry
High refresh devices Supported Nova can request 90/120 Hz when the device display and host both support it
Official release assets arm64-v8a, armeabi-v7a, x86_64 Public GitHub Releases ship separate APKs per Android ABI

Known Limitations

  • Advanced launch modes, watch mode, live host tuning, richer session telemetry, and Polaris Sync 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.
  • Steam Controller 2026 Bluetooth support depends on the HID shape Android exposes. Nova can recognize Valve keyboard/mouse HID presentations and route compatible controller-like keys, but Android does not expose full Steam Input profiles or hidden analog controls through a standard gamepad source.
  • Today, only the Android client ships.

Why Nova

Most Android game-streaming clients stop at pairing, a grid, and a stream. Nova is built for the newer reality: handheld Android hardware, Linux streaming hosts, multiple clients, host-side optimization, and players who need to know what will actually happen before they launch.

Nova takes a different route:

  • Handheld-first streaming: controller focus, TV navigation, OLED-aware themes, quick actions, and stream controls are designed for real handheld sessions.
  • Session truth in the UI: NovaHUD and the quick menu can show actual FPS, target FPS, role, launch mode, and Polaris-backed tuning state.
  • Launch intent instead of guesswork: Polaris-backed Library flows can show Headless vs Virtual Display options, host recommendations, per-game guidance, and risky MangoHud warnings before launch.
  • Profiles that explain themselves: Nova Settings now separates global defaults from profile overrides, shows what applies instantly or next stream, and lets overrides reset back to fallback values.
  • Shared and recoverable sessions: watch an active Polaris stream without taking ownership, reconnect after interruptions, or quit with owner-aware session controls.
  • Host-aware tuning: Auto Quality, cached AI tuning, recovery tuning, stream defaults, and Polaris Sync are surfaced as explicit states instead of silent background magic.

Use With Polaris

Polaris is the Linux host built alongside Nova. Together they expose a streaming contract that typical Moonlight-compatible clients do not see.

Polaris + Nova capability What it means
Launch contract Polaris tells Nova which launch modes are preferred, recommended, and currently allowed
Headless vs Virtual Display Nova can present both choices directly in the library instead of silently guessing
10-bit SDR Nova can explicitly request a Main10 stream even on SDR handheld panels when the host supports it
Watch Stream A second device can join as a viewer without taking over the owner session
Tuning provenance Nova can distinguish baseline device tuning, live AI, cached AI, recovery tuning, host-adjusted recommendations, and active target profiles
Polaris Sync Push Nova stream defaults to Polaris, pull Polaris' current profile back into Nova, or keep Polaris matched to Nova defaults
Live tuning Auto Quality and MangoHud can be surfaced directly in Nova's quick menu
Session truth HUD and quick menu can show live server-backed mode, role, shutdown state, and tuning state

Tour

Handheld Dashboard

Nova opens on a controller-friendly dashboard for servers, themes, help, and streaming entry points. Focus states are designed to stay visible on Android TV, handhelds, and phones.

Nova home dashboard with games home, continue rail, and host shortcuts

Polaris Library

The Polaris library gives Nova the context a plain app list cannot: cover art, filters, source badges, launch modes, Continue/watch states, and per-game guidance.

Nova Polaris library grid with search, filters, and game artwork

Library grid
Search, filter, and scan a host-backed game library with clear controller focus.

Nova game detail sheet with launch modes and next-launch tuning

Launch detail
Choose the right mode, review host recommendations, and see next-launch tuning before starting.

Stream Controls

During a stream, Nova shifts from browsing to operations: HUD modes, quick controls, reconnect state, tuning actions, and input helpers stay reachable without leaving the session.

Nova quick menu with tuning, overlays, controls, and session actions

Quick menu
Tune, toggle overlays, disconnect, quit, or inspect the active session.

Nova HUD modes showing stream telemetry overlays

NovaHUD
Cycle full, banner, and FPS-only telemetry with controller shortcuts.

Theme system

Nova main menu and theme system

How It Works

Nova keeps the Moonlight-compatible stream path, then layers a Kotlin Android experience around host awareness, controller-first navigation, profile-aware settings, and Polaris session metadata.

The practical result: standard hosts still work, while Polaris hosts can tell Nova more about what is launching, who owns the session, what tuning is active, and what settings should apply next. The native streaming layer stays close to Moonlight lineage; the newer Nova behavior lives in the Android/Kotlin layer.

For the deeper source layout and build model, see Technical Overview.

Docs

Guide Use it for
Technical Overview Source layout, architecture, local builds, tests, APK outputs
F-Droid Packaging Notes F-Droid and IzzyOnDroid packaging status
Kotlin Optimization Audit Kotlin migration and optimization notes
Video Baseline Evidence Baseline profile and release-performance evidence
Multi-platform Study Native client expansion notes
Steam Deck Native Port Study Steam Deck client research

Build From Source

Clone with submodules, then build the Android APKs:

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

Local builds produce split APKs for arm64-v8a, armeabi-v7a, and x86_64 by default. Release builds, test commands, local ABI overrides, and the architecture diagram live in Technical Overview.

FAQ

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

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

What makes Nova different from a normal Moonlight client?

Nova keeps compatibility with the Moonlight streaming path, then adds handheld-first navigation, a host-backed Library, launch-mode awareness, watch mode, Polaris Sync, tuning provenance, NovaHUD, profile overrides, and controller shortcuts that are designed around Android handheld and TV use.

What is Trusted Pair?

Trusted Pair is Nova's TOFU flow for Polaris. 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 can show what the host recommends, what the app prefers, and which modes are currently allowed.

What does Polaris Sync do?

Polaris Sync is a bidirectional settings flow for Polaris hosts. Nova can push its local stream profile to Polaris, pull Polaris' current stream profile back into Nova, or keep the Polaris profile matched to Nova defaults so launch settings stay predictable across devices.

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.

Does Wake-on-LAN work over WireGuard or another VPN?

It can, as long as the network path forwards the UDP wake packet to a host or subnet that can reach the sleeping PC. Nova sends Wake-on-LAN packets directly from Android. If the server did not provide a MAC address during discovery or pairing, use Edit Wake-on-LAN MAC in the host menu and enter the PC network adapter MAC address manually.

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

Languages