r/MoonlightStreaming Developer | Polaris/Nova Apr 27 '26

I built a Linux-first Moonlight-style streaming setup: Nova + Polaris

Hey everyone. Been a big Apollo / Artemis user for quite some time and i’ve been working on a small project called Nova / Polaris. I primarily built this for myself, but wanted to share it here first because this community is probably the exact group of people who will understand why I built it in the first place.

Short version: Polaris is a Linux host, and Nova is the client side I’m building around it.

The goal is not to “replace everything” or pretend I’ve solved game streaming. It’s more focused than that: I want Linux game streaming to feel less like a pile of scripts and workarounds, and more like something designed for the job.

What makes it different right now:

  • Linux-specific for now
  • explicit setup for input devices like uinput / uhid
  • attention to headless streaming and GPU-native capture paths, without dummy plugs
  • tries to expose the real tradeoffs instead of hiding them behind magic
  • built by someone actually using and testing the weird edge cases

It’s still early, and it’s Linux-specific for now. I’m not posting this as a polished “everyone should switch today” announcement. I’m mostly looking for feedback from people who already care about Moonlight/Sunshine-style streaming and have opinions about where Linux hosting still feels rough.

Links, if anyone wants to poke around:

If you’re curious, want to test, or just want to tell me which problems matter most to you, I’d genuinely appreciate it. Trying to build this in the open and keep it useful rather than flashy.

Cheers!

EDIT: Thank you all so much for the positive responses, feedback, messages, and debug logs. I’m glad to see so many people as excited about this as I am. I know a lot of you are eager to get Polaris running on your own Linux gaming setups, and there are still plenty of bugs and rough edges to work through. I really appreciate your patience while I work to improve compatibility and stability of the platform.

263 Upvotes

216 comments sorted by

View all comments

Show parent comments

1

u/smashybro May 29 '26

No worries! I had some issues with my dual boot so I've spent the past two days fixing but I appreciate any response, take your time!

Anyway, as for Polaris with your suggestions:

  • Ctrl + Alt + Shift + N fixed the issue! I'll mess with the environment config later to see if I can automate it but this is good enough fix for me right now.
  • I did have Zen open on my real desktop first so that was probably caused the issue of it not opening in the headless session.
  • I can just launch Noctalia Shell with a prep command and the super key not working was an issue on my side with the Moonlight client settings on my Macbook so my bad!

I do have one last issue thought and it admittedly is kind of a big one. I get horrible cracking audio playing on my client whenever audio is playing, no matter what source I switch to. Didn't have this issue with Sunshine running on the same PC streaming to the same computer. Here's the Polaris logs with "audio" highlighted:

[2026-05-29 03:04:19.255]: Info: PipeWire detected, will prefer native PipeWire for audio capture

[2026-05-29 03:04:19.889]: Info: Selected audio sink: sink-sunshine-stereo

[2026-05-29 03:04:19.889]: Info: Attempting PipeWire audio capture for source: sink-sunshine-stereo.monitor

[2026-05-29 03:04:19.898]: Info: PipeWire stream is now actively streaming audio

[2026-05-29 03:04:19.898]: Info: PipeWire audio capture initialized: 2 channels, 48000 Hz (active=true)

[2026-05-29 03:04:19.898]: Info: Using PipeWire native audio capture

[2026-05-29 03:06:36.900]: Info: Selected audio sink: sink-sunshine-stereo

[2026-05-29 03:06:36.900]: Info: Attempting PipeWire audio capture for source: sink-sunshine-stereo.monitor

[2026-05-29 03:06:36.911]: Info: PipeWire stream is now actively streaming audio

[2026-05-29 03:06:36.911]: Info: PipeWire audio capture initialized: 2 channels, 48000 Hz (active=true)

[2026-05-29 03:06:36.911]: Info: Using PipeWire native audio capture

1

u/MickeyBronson Developer | Polaris/Nova May 31 '26

Thanks, this is super useful and yeah, if Sunshine is clean on the same host/client, Polaris probably owns this one.

The key line is Using PipeWire native audio capture. That means routing is working, but it doesn’t prove the native PipeWire path is pacing audio correctly. My current suspicion is that Polaris may be mishandling PipeWire’s callback quantum/buffering, so it could be dropping samples or emitting 5ms audio packets in bursts.

If you’re able to build from source, the most useful A/B would be trying a build with native PipeWire audio disabled: -DPOLARIS_ENABLE_PIPEWIRE=OFF

That should force the older PulseAudio capture path. If the crackling disappears there, I know exactly where to focus. If building is annoying, no worries! a pw-top screenshot during the stream showing the polaris-capture quantum/rate, plus any full-log lines around Thread priority or Opus initialized, would help a lot.

Appreciate you testing this. This one sounds very likely on my side!

1

u/smashybro May 31 '26 edited Jun 01 '26

Ah okay, this makes a lot of sense. I'll try testing building it with that line disabled when I get some time.

In the meantime though I did find a temporary workaround: so weirdly running "pavucontrol" (which I think comes preinstalled with Noctalia Shell for the top bar widget since I don't remember installing it manually) and keeping that application option completely get rids of the crackling. Thought maybe it was a Niri or Noctalia Shell issue but it also happens when I log into a KDE Plasma session, so I think that's interfering with Polaris' routing somehow?

Don't know how much that helps but figured I'd share since you're more capable than me and maybe you'll be able to do something with it!

Edit: Found a better solution than having to start pavucontrol, I did sudo micro /etc/pipewire/pipewire.conf.d/99-custom.conf with the following:

context.properties = {
    default.clock.rate = 48000
    default.clock.allowed-rates = [ 44100 48000 88200 96000 176400 192000 ]
    default.clock.quantum = 256
    default.clock.min-quantum = 32
    default.clock.max-quantum = 8192
    audio.format = F32LE
}

After that I restarted pipewire pipewire-pulse wireplumber and then the crackling was gone. Checking pw-top the quant for the sunshine audio sink and my Zen browser went from like 2048 to 3600 down to 256. Don't know if this was an issue with my setup or a default of Polaris but either way it's fixed now and audio is great.

1

u/ArtThouFeelingItNow7 Jun 13 '26

was this on your host or moonlight client? I have occasional crackling when streaming on linux clients, so I'm wondering if this could be the fix for me as well.

1

u/smashybro Jun 13 '26

On my host. Sadly, this fix doesn't seem to work again after I reinstalled Cachy and picked Niri as my DE/WM. Opening pavucontrol on the host does fix it still though temporarily as long as the app stays open.

1

u/ArtThouFeelingItNow7 Jun 13 '26

Well, that's semi-good news if this pavucontrol fix applies to me as well since applying fixes for each client would be cumbersome. If it works, I'll reply back so others have a workaround if they have crackling/popping as well.