Skip to content

papi-ux/polaris

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

200 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Polaris

Polaris

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.

Stars License Release

Quick Start · Install · Compatibility · Tour · Nova · Docs · FAQ · Security · Changelog · Roadmap

Support: Issues · Discussions


Polaris dashboard, live session view, game library, and pairing flow

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.

Quick Start

Fedora 42/43/44

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
polaris

Arch Linux

wget 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
polaris

Open https://localhost:47990/#/welcome, create your web UI account, and pair a client. After credentials are created, https://localhost:47990 opens the normal console.

First stream checklist

  1. Open the first-run setup at https://localhost:47990/#/welcome.
  2. Confirm the recommended Linux path: headless_mode = enabled, linux_use_cage_compositor = enabled, and linux_prefer_gpu_native_capture = disabled.
  3. Pair with Trusted Pair on a trusted LAN, QR pairing for Nova, or manual PIN for standard Moonlight clients.
  4. Start a game from the Polaris library, Nova, or a Moonlight client.
  5. 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.

What's New in v1.0.12

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 --version reports Build 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.

Install

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.

Compatibility

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

Known Limitations

  • 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.

Why Polaris

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

Use with Nova

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

Get it on Obtainium   Get it on GitHub Store   Get it on GitHub

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.

Tour

Mission Control

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.

Polaris Mission Control dashboard with quick controls, GPU gauges, recent games, and system status

Live Session View

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.

Polaris live streaming view with preview, charts, runtime path, and recording controls

Library and Pairing

Polaris game library with imported games, cover art, and categories

Game library
Import from Steam, Lutris, and Heroic, attach art, organize categories, and tune launch behavior.

Polaris pairing interface with QR code, trusted pairing, and device management

Pairing
Use Trusted Pair (TOFU), QR for Nova, or manual PIN pairing for standard Moonlight clients.

More screens
Polaris configuration screen with general, input, audio-video, and AI settings

Configuration
General, input, audio/video, network, AI, and encoder settings in one place.

Polaris troubleshooting screen with diagnostics and system state

Troubleshooting
Inspect diagnostics without jumping between CLI tools and guesswork.

How It Works

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.

Configuration

Config file: ~/.config/polaris/polaris.conf

Recommended first config

# 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 = 2

Tip

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.

Docs

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

FAQ

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 polaris

If 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.

AI Transparency

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.

Contributing

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.

  1. Fork the repo and branch from master.
  2. Make your changes and test them locally.
  3. For web UI changes, run npm run lint, npm test, and npm run build in the repo root.
  4. For browser-facing changes, run npm run test:e2e against a local Polaris instance when possible.
  5. 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.

Donate

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.

Ko-fi   PayPal

License

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.

About

Linux GameStream host for Nova and Moonlight-compatible clients

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors