Self-hosted game streaming for Linux.
Stream PC games to Nova and Moonlight clients without letting the stream take over your desktop. Polaris combines an isolated Linux compositor runtime, GameStream-compatible pairing, GPU-aware capture, and a web console that shows what the host is actually doing.
Quick Start · Install · Compatibility · Tour · Nova · Docs · FAQ · Security · Changelog · Roadmap
Support: Issues · Discussions
Important
Polaris is a Linux host today. Fedora 42, Fedora 43, Fedora 44, and Arch Linux are the recommended package paths. Bazzite and Ubuntu 24.04 packages are available for testers, but they need more real-hardware coverage.
Note
Start with Headless Stream if you want games to launch into a stream-only runtime without changing your KDE, GNOME, or wlroots desktop layout.
fedora_version="$(rpm -E %fedora)"
wget "https://github.com/papi-ux/polaris/releases/latest/download/Polaris-fedora${fedora_version}-x86_64.rpm"
sudo dnf install "./Polaris-fedora${fedora_version}-x86_64.rpm"
sudo polaris --setup-host
polariswget https://github.com/papi-ux/polaris/releases/latest/download/Polaris-arch-x86_64.pkg.tar.zst
sudo pacman -U ./Polaris-arch-x86_64.pkg.tar.zst
sudo polaris --setup-host
polarisOpen https://localhost:47990/#/welcome, create your web UI account, and pair a client. After credentials are created, https://localhost:47990 opens the normal console.
- Open the first-run setup at https://localhost:47990/#/welcome.
- Confirm the recommended Linux path:
headless_mode = enabled,linux_use_cage_compositor = enabled, andlinux_prefer_gpu_native_capture = disabled. - Pair with Trusted Pair on a trusted LAN, QR pairing for Nova, or manual PIN for standard Moonlight clients.
- Start a game from the Polaris library, Nova, or a Moonlight client.
- Watch the live session dashboard to confirm the active runtime and encoder path.
Tip
If you changed port in ~/.config/polaris/polaris.conf, the web UI is at https://localhost:<port + 1>. If you want background autostart, enable the user service with systemctl --user enable --now polaris.
Polaris v1.0.12 focuses on corrected Fedora/Bazzite NVIDIA release assets.
- Fedora/Bazzite RPM assets are rebuilt with CUDA enabled so NVIDIA/NVENC hosts can use the validated GPU-native upload path.
- Tagged Fedora RPM release builds now fail validation if
polaris --versionreportsBuild features: cuda=disabled. - Fedora CUDA header patching is normalized for CUDA 13.2 and Fedora 42/43/44 release builds.
- Browser Stream, Linux stream-runtime diagnostics, and Headless Stream behavior remain aligned with
v1.0.11.
See the changelog for the full release history.
Use the release package for your distro before considering source builds. Packages install the host binary, web console assets, desktop metadata, and user service file; host integration remains explicit through sudo polaris --setup-host.
| Host | Best path |
|---|---|
| Fedora 42 | Polaris-fedora42-x86_64.rpm from the latest release |
| Fedora 43 | Polaris-fedora43-x86_64.rpm from the latest release |
| Fedora 44 | Polaris-fedora44-x86_64.rpm from the latest release |
| Arch Linux | Polaris-arch-x86_64.pkg.tar.zst from the latest release |
| Bazzite 44 | Layer the matching Fedora 44 RPM with rpm-ostree; see Bazzite guide |
| Ubuntu 24.04 | Polaris-ubuntu24.04-x86_64.deb experimental tester path; see Ubuntu guide |
| Debian-family or custom host | Source build; see Building Polaris |
Detailed source builds, local Arch package builds, distro dependency lists, and Browser Stream build flags live in docs/building.md.
Warning
Only grant cap_sys_admin with sudo polaris --setup-host --enable-kms when you actually need DRM/KMS capture. Polaris works fine without it on the default compositor and Headless Stream paths.
| Area | Status | Notes |
|---|---|---|
| Linux host OS | Supported | Polaris is Linux-first today |
| Fedora 42/43/44 | Recommended | Official RPM assets |
| Arch Linux | Recommended | Official package asset |
| Bazzite | Experimental | Desktop Mode validated on NVIDIA with Headless Stream; real Steam/Game Mode needs more coverage |
| Ubuntu 24.04 | Extremely experimental | DEB asset is available, but this path needs broader real-hardware validation |
| Debian-family distros | Supported from source | Less turnkey than Fedora or Arch |
| NVIDIA / NVENC | Best-tested | Main fast path and most validated encoder/runtime combination |
| VAAPI / software encode | Supported | Works, but is less battle-tested than NVENC |
| Nova for Android | Best experience | Full launch contract, watch mode, tuning, and richer live state |
| Standard Moonlight clients | Compatible | Core streaming works without Nova-specific UX |
| Browser Stream | Experimental | Browser-based streaming path using WebTransport and WebCodecs; best tested on Chromium-family browsers |
- Polaris is not a Windows host today. Linux is the supported platform.
- Bazzite support is experimental. Desktop Mode has NVIDIA validation with the recommended Headless Stream settings, while real Steam/Game Mode, AMD, and Steam Deck client flows need more hardware coverage.
- Ubuntu 24.04 DEB packaging is extremely experimental; other Debian-family distros are still source-build oriented.
- NVIDIA/NVENC is the most heavily validated hardware path. Other encode backends work, but they are not equally battle-tested.
- Some UX surfaced in Nova, such as explicit launch recommendations, watch mode polish, and live tuning, depends on the Nova Android client.
- MangoHud can still be risky on Steam Big Picture and some Steam/Proton launches.
Traditional Linux streaming hosts often treat your real desktop as disposable: mode switches, broken layouts, portal prompts, and post-session cleanup are all your problem.
Polaris takes a different route:
- Desktop-safe streaming: games run in a dedicated compositor instead of hijacking your normal desktop layout
- Runtime transparency: the dashboard shows the real backend, transport, frame residency, and format
- Headless-first Linux path: designed to avoid HDMI dummy plugs, display scripts, and manual compositor surgery
- Practical control surface: live preview, telemetry, quality controls, library management, and pairing in one UI
- Shared viewing: additional clients can watch an active stream without stealing ownership
Nova is the Polaris-aware Android client and the best way to experience the newer host features.
| 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 |
| AI recommendations | Nova can distinguish baseline device tuning, live AI, cached AI, recovery tuning, and host-adjusted runtime notes |
| Live tuning | Adaptive Bitrate, AI Optimizer, 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 |
The Obtainium shortcut is prefiltered to Nova's public app-nonRoot_game-arm64-v8a-release.apk asset so updates resolve cleanly. Polaris is also compatible with standard Moonlight clients on any platform.
Polaris is built around a dashboard that answers the questions stream hosts usually have to reverse-engineer from logs: what runtime is active, what capture path is in use, whether the GPU-native path survived, and how much headroom remains.
When a stream is active, Polaris shifts from setup to operations: preview, charts, runtime-path telemetry, recording controls, and recommendations are visible in one place.
|
Game library |
Pairing |
More screens
|
Configuration |
Troubleshooting |
Polaris launches games into a dedicated stream runtime, captures that runtime instead of your desktop session, and routes frames into the best available encoder path for the host.
The practical result: your real desktop can keep its layout, refresh rate, and windows while the stream gets its own controlled environment. The dashboard shows the active runtime, capture transport, frame residency, encoder, and session role so you can verify what actually happened.
For the deeper runtime model, see Runtime and Streaming Model.
Config file: ~/.config/polaris/polaris.conf
# Headless Stream path
headless_mode = enabled
linux_use_cage_compositor = enabled
linux_prefer_gpu_native_capture = disabled
# Pairing on your trusted LAN
trusted_subnets = ["10.0.0.0/24"]
# Encoding
encoder = nvenc
# Optional
adaptive_bitrate_enabled = enabled
max_sessions = 2Tip
With Headless Stream you generally do not need KDE window rules, kscreen-doctor scripts, HDMI dummy plugs, or manual portal juggling. Turn on the recommended stream runtime and let Polaris manage the compositor, app routing, and input isolation.
Full config tables, AI provider examples, HDR notes, and credential recovery steps live in docs/configuration.md.
| Guide | Use it for |
|---|---|
| Runtime and Streaming Model | Headless Stream, capture/encoder paths, Browser Stream, session lifecycle, HDR/Main10 behavior |
| Configuration | Config file paths, common options, AI provider settings, credential reset |
| Building Polaris | Source builds, local packages, distro dependencies, Browser Stream build flags |
| Troubleshooting | Runtime logs, capture fallbacks, audio/session issues |
| Bazzite Install Guide | Bazzite layering, validation status, rollback, Game Mode notes |
| Ubuntu Install Guide | Ubuntu DEB status, source fallback, validation notes |
Do I need an NVIDIA GPU?
No, but NVENC is the most heavily tested path today. VAAPI and software encode paths are supported, but current Linux compositor and DMA-BUF work has been tuned most heavily around NVIDIA.
Does Polaris work with Moonlight on iOS, macOS, and PC?
Yes. Polaris speaks the Moonlight protocol. Any Moonlight client can connect. Polaris-specific features such as launch-mode selection, watch mode UX, optimization guidance, and richer session state require Nova on Android.
Do I need to uninstall Sunshine before trying Polaris?
No. Polaris keeps its host config separate at ~/.config/polaris, so installing it should not remove or overwrite an existing Sunshine setup. For testing, stop Sunshine before starting Polaris because both are GameStream/Moonlight hosts and can collide on the same default ports and discovery records.
systemctl --user stop sunshine
systemctl --user enable --now polarisIf your Sunshine install runs as a system service instead of a user service, use the matching service command for your distro. You can switch back by stopping Polaris and starting Sunshine again.
Does Moonlight lock streams to 60 FPS?
No. Moonlight can request higher frame rates on clients that expose them, but Polaris treats the client's requested display mode as the ceiling. If a client requests 1280x800x60, Polaris will not force a 90 FPS optimization above that request even when the device profile supports it.
Does headless mode work on Hyprland, Sway, or GNOME?
The headless labwc runtime creates its own Wayland instance, so it is not tied to one desktop environment. Polaris has been tested most heavily on KDE Plasma Wayland, but the model is not KDE-specific.
How does Trusted Pair work?
Trusted Pair is Polaris’ TOFU flow. If the client is on a configured trusted subnet, Polaris can auto-approve first pairing. You can still use QR or manual PIN pairing if you want a stricter or more traditional flow.
Can Polaris stream 10-bit to an SDR handheld screen?
Yes, if the client explicitly requests a 10-bit path and the active encoder/runtime support Main10. See Runtime and Streaming Model for the difference between 10-bit SDR and true HDR.
Can Polaris stream true HDR on Linux?
Yes, but Polaris only advertises true HDR when the active capture path reports HDR display metadata. Headless labwc/wlroots sessions remain honest SDR until that runtime can provide real metadata. See Runtime and Streaming Model for details.
Can multiple people watch the same stream?
Yes. Set max_sessions above 1. Polaris tracks owner vs viewer roles explicitly, and passive watch mode is designed so a second client can observe without taking over the session. Viewers must match the active owner profile rather than silently creating a different downgraded stream.
My KDE layout gets corrupted after streaming
That failure mode is the reason Polaris exists. Enable headless_mode = enabled and linux_use_cage_compositor = enabled, and Polaris will stop treating your physical displays as the stream path.
Steam Big Picture shows a black screen or tiny window
First clear Steam’s HTML cache:
rm -rf ~/.local/share/Steam/config/htmlcache/Then avoid MangoHud on Steam Big Picture and Steam/Proton launches. Polaris and Nova now warn more aggressively there because MangoHud can crash helper processes before the session gets a usable frame.
How does the AI optimizer work?
The AI optimizer is optional and disabled by default. When enabled, it sends device specs, app metadata, and recent session history to the provider you configure: Anthropic, OpenAI, Gemini, or a local OpenAI-compatible endpoint such as Ollama or LM Studio. Results are cached locally.
Polaris is a maintainer-led project. I use AI-assisted tools as research, debugging, comparison, and drafting aids, especially when validating unfamiliar Linux compositor, packaging, and client behavior.
Those tools do not decide what Polaris is or what ships. I review changes, test every aspect, and own the final decisions around validation, trust boundaries, and release quality.
Contributions are welcome, especially focused fixes, docs, translations, packaging improvements, and careful feature work. Polaris 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.
- Fork the repo and branch from
master. - Make your changes and test them locally.
- For web UI changes, run
npm run lint,npm test, andnpm run buildin the repo root. - For browser-facing changes, run
npm run test:e2eagainst a local Polaris instance when possible. - Open a pull request that explains what changed, why it helps, and what you were able to test.
Note
The web UI lives in src_assets/common/assets/web/ and uses Vue 3 with Tailwind CSS v4. The backend lives in src/. CMake builds both together.
Polaris is a spare-time project built to make Linux game streaming 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.
Polaris is licensed under the GNU General Public License v3.0. See LICENSE for the full text.
Polaris builds on Apollo and Sunshine under GPLv3 lineage, and remains compatible with Moonlight clients.