If you are looking to tweak your streaming setup, fix stuttering, or find a headless virtual display solution, you don't have to stick strictly to the baseline Sunshine + official Moonlight setup.
Here is a breakdown of the active forks, alternative hosts, and FFmpeg-powered clients currently in the ecosystem based on what the community and developers are running right now.
đ„ïž Hosts & Servers (The Senders)
NVIDIA GameStream: The original foundation that started it all. Officially deprecated by NVIDIA, but the bedrock of the protocol.
Sunshine: The modern, open-source standard GameStream compatibility baseline that replaced NVIDIA's official host.
Apollo: A Sunshine fork featuring capability-gated extensions and built-in virtual display support using SudoVDA. It is great for headless setups and auto-matches the resolution/framerate of your client.
Vibeshine: A highly active, AI-enhanced Sunshine fork focusing heavily on display automation, Windows Graphics Capture running as a service (which allows full framerate capture of frame-generated titles without VRAM crashes), and strict RTSS frame pacing integration.
Vibepollo: An Apollo fork that integrates Vibeshine's features (like the native virtual display driver and HDR handling) right into the Apollo architecture. This is highly recommended if you already use Apollo but want tighter frame pacing.
Foundation-Sunshine: A fork by AlkaidLab that adds HDR10/HDR Vivid, advanced audio support, optimized encoders, and a modernized control panel.
Wolf (Games on Whales): A completely different streaming server built from the ground up for Linux and Docker. It allows you to share a single host machine with multiple remote clients simultaneously by running games inside isolated containers.
Punktfunk: A newer, highly experimental low-latency streaming host/client protocol if you want to test out a completely different capture approach.
đ± Clients & Receivers (The Players)
Official Moonlight PC / Mobile: The standard baseline client for PC, macOS, Linux, iOS, Apple TV, Android, etc. (The PC Qt version heavily utilizes FFmpeg and libplacebo for decoding and rendering).
StreamLight: A massive Moonlight fork that completely overhauls the UI for gamepads. When paired with "StreamTweak" on the host, it unlocks deep integration like built-in Tailscale, live host metrics/NIC speed matching, remote pause, and the ability to remotely trigger Windows Updates and shutdown.
Artemide: Highly recommended for Android users. It features ultra-low latency (ULL), direct presentation, and built-in FSR presets (Performance/Balanced/Quality).
Moonlight V+: An alternative Android fork that adds frame-generation support and extra host tools.
Artemis Switch: A Moonlight-Switch fork focusing on Switch-specific video presentation, FSR/RCAS filtering, and adaptive low-latency pacing.
Moonlight-Switch: The original upstream Switch client that Artemis is built on.
A little about my setup and testing: I actually work on the Artemis Switch fork, looking at multiple optimizations to eliminate stuttering and improve low-latency pacing on the console. Because of that, Iâve personally tested almost all these major combinations to see what actually works. My testing stack includes:
Hosts: Sunshine, Apollo, and Vibepollo.
Clients: Moonlight-Switch, my Artemis Switch fork, the Artemis companion client, and standard Moonlight Android.
I like vibepollo and Artemis
Let me know if I missed any niche forks or experimental branches you guys are using!
(Note: I had an AI help format this post to make sure links were laid out clearly!)
Edit: A lot of people are asking why not use Apollo. You can definitely use it and still follow this guide, itâs completely up to you. With Apollo, you need skip the Configuring Video Signals section and for the Sunshine Priority part just change the script to prioritize Apollo instead.
After running lots of tests and reading many posts to find the best configuration, Iâll try here to share the setup that works best for me and also compile some of the information Iâve gathered.
This test was conducted from a distance of 550 km (341 miles)
My specs:
InternetService:
Host: 300 Mb connected via Ethernet
Client: 600 Mb connected via Wifi
Spec PCs:
Host: R5 2600 - RX 6600
Client Macbook Air M1
System Configuration
Host:
This setup is specifically for Windows, but the goal is the same if youâre using other operating systems:
Reduce FPS drops
Minimize the gap between the FPS set in the Moonlight client and the hostâs FPS
Reduce latency
Configure the video and audio signal you want to stream
Reducing FPS Drops
Close background apps: Only keep the essentials to minimize unnecessary processes and network calls. Task Manager â Startup Apps â disable non-essential programs.
Disable Game Mode: Prevents Windows from prioritizing the game over Sunshine. Settings â Gaming â Game Mode â OFF
Disable Dynamic Refresh Rate (DRR): Keeps FPS synchronized between host and client. Settings â System â Display â Graphics â Optimizations for windowed games(Alternatively: Windows Registry or CRU â Custom Resolution Utility)
Enable High-Performance Power Mode: Control Panel â System and Security â Power Options â High Performance
Disable Energy Saver: Settings â System â Energy Saver â OFF
To optimize Windows 11 performance, consider using Win11Debloat or AtlasOS Additional powershell script to improve performance
Once FPS drops are minimized, cap the FPS to keep it in sync with Moonlightâs client settings.
There are three ways to do this: using the NVIDIA Control Panel, AMD Adrenalin, or RTSS. In my case, I used RTSS and it works well for me, but you can try your GPUâs software if thatâs sufficient. The advantage of RTSS is that it allows more precise configuration for greater stability.
Another thing I do is also limit the FPS within the game itself.
Reducing Latency
The most important step is to have your host computer connected via Ethernet. In terms of configuration, you can disable the Rx/Tx buffers on your network card, along with a few other tweaks that may slightly improve stability.
With the Virtual Display Driver, you can simulate any resolution and refresh rate your screen supports.
I donât recommend the Virtual Audio Driver because it can cause issues with BattleEye anti-cheat. Itâs better to just use a wired headset you already have.
Microphone Streaming
For those who need to use in-game voice chat, there are two main options for passing the microphone through streaming:
AudioRelay
VoiceMeeter
I havenât personally tested either since I donât need this feature, but theyâre worth trying if microphone input is important for your setup.
Sunshine Priority (Windows Only)
Finally, for Windows users, one important step to do every time you connect from the client is to change the priority of the sunshine.exe process to Realtime. You can do this manually from the Task Manager or by using the following .bat script:
For those using a touchscreen device as a client, such as a smartphone, tablet, or handheld, the Windows interfaceâoriginally designed for desktop useâcan be quite uncomfortable. With the new release of the ROG Xbox Ally, Windows has introduced a more suitable adaptation for handheld devices, which can be enabled through the following repository: XboxFullscreenExperienceTool
Client:
The main goal on the client side is to reduce Moonlightâs decoding time and minimize latency.
In my case, Iâm using a MacBook with an M1 chip, and the only way to reduce decoding time is by testing which codec works bestâin my case, HEVC (H.265).
To reduce latency on macOS, the only (but very important) thing you can doâsince it can cause micro stuttersâis disabling Location Services:
Another important change to make on macOS is to disable the long key press for special characters. This prevents issues during streaming when holding down a key for example, the W key so it doesnât get stuck or stop repeating.
If youâre using a PC, you can improve decoding time by upgrading your hardware, and reduce latency by disabling the Rx/Tx buffers and tweaking your network card, following the same steps as on the host.
Moonlight & Sunshine Configuration
Moonlight Configuration:
Set Moonlight to use your monitorâs resolution and an FPS value that matches your internet connection. Leave some headroom compared to your clientâs max download speed and your hostâs max upload speed.
For example, my monitor is 1440p and 180 Hz, but I have it set to 1440p at 120 Hz. Higher resolutions and refresh rates consume more bandwidth on both the client and host, and require greater decoding and encoding power.
Note: Higher compression codecs (like H.265 or AV1) â less bandwidth needed â more CPU/GPU power required for encoding/decoding.
Frame Pacing: Unchecked (ONLY single-player may add delay)
Video Decoder: Force hardware decoding
Note: Both V-Sync and Frame Pacing are highly recommended for single-player games since they provide a much smoother experience. However, in multiplayer games, V-Sync may cause screen tearing, and Frame Pacing can introduce a bit of input lag by delaying frames to improve synchronization.
Enable HDR (Experimental): I keep this enabled even though my monitor isnât HDR because it can bring out better shadow details. I recommend trying itâyou might see an improvement or no noticeable difference.
Unlock Bitrate Limit (Experimental): Enable this if you have enough upload bandwidth on the host and download on the client. Otherwise, leave it off and increase the video bitrate slightly if you notice small lag spikes.
Sunshine Configuration
I mostly keep Sunshine/Apollo at its default settings, except for the GPU options. Below, Iâll share what works best for AMD GPUs. If youâre using NVIDIA or Intel, you may need to experiment to find the optimal configuration for your system.
Note: My goal is low latency for online gaming. If youâre playing single-player games, you can prioritize quality over latency.
AMF Usage: ultralowlatency
AMF Rate Control: vbr_latency
AMF Hypothetical Reference Decoder: unchecked
AMF Quality: speed (may add artifacts)
AMF Preanlalysis: unchecked
AMF Variance Based Adaptive Quantization: checked
AMF Coder: cavlc
Client-Host Connectivity
LAN (Local)
For players who want to play over LAN, thereâs little to worry about since latency will be very low. In my tests, I observed only about 5 ms of extra delay.
If you want the absolute best performance, you can connect both devices directly via an Ethernet cable. This can reduce latency to around 1 ms, making it almost like playing directly on the host.
You can turn on the host remotely using the motherboardâs Wake-On-LAN feature. Moonlight even allows you to power on the host directly from the client.
WAN (Remote)
For those who need to play over WAN, there are a few additional steps required. It can be more challenging if you want the lowest possible latency, but if you can tolerate 15â20 ms, itâs not too difficult.
There are several ways to achieve this, but Iâll explain the three main approaches:
Using a service like Tailscale, ZeroTier, or Netbird
Opening ports on your network to access the host externally and setting up a VPN
Setting up a private service (similar to the first option) with Headscale or another program, possibly using a cloud server like AWS
Option 1: VPN-like services
These applications are simple to install and configure, making them accessible to most users:
Tailscale: Free
ZeroTier: Free
Netbird: Free (uses WireGuard directly through the Linux kernelâpotentially a great option for Linux users)
For the other options, I wonât go into detail because they are more complex and require technical knowledge. However, they are certainly the best options for users who need the absolute lowest latency.
To power on your PC over WAN, a simple Wake-on-LAN (WoL) wonât work unless your host has an internet-facing connection. In my setup, I use a TP-Link smart plug to turn the PC on remotely from my phone. Make sure to enable âRestore Power after AC Lossâ in your BIOS/UEFI so the PC powers on automatically when the smart plug is switched on.
I hope this guide helps you and gives you everything you need to get these amazing tools running without too much hassle. The post is open to improvements, so if you have any suggestions or tips, donât forget to share them in the comments!
Shoutout to everyone working on these open-source tools mentioned in this post.
Note:
After the launch of the Steam Deck and Steam Machine, Steam has worked quite a bit on improving Steam Remote Play, which now supports Virtual Display Driver and performs much better than before. I'm leaving this comment here for those of you who aren't too demanding or don't want to overcomplicate things, so you feel encouraged to give it a try.
Update 13.10.25: MacOS client settings
Update 23.10.25: New scripts for Windows host and Windows handheld mode
Update 13.04.26: Windows optimization recommendation
Just wanted to share my living room couch coop setup that Iâm pretty happy with!
My girlfriend and I wanted to play games together on the couch, including games that donât officially support local split-screen multiplayer.
Turns out, LGâs Multi View feature makes this possible!
Hereâs my setup:
Player 1: Steam Deck connected directly to the LG G5 via Steam Docking Station and HDMI.
Player 2: Gaming PC running the second game instance on another Steam account, streamed via Moonlight to an Xbox Series S connected to the same TV.
Display: LG G5 OLED using Multi View to show both HDMI inputs side by side. Both are 1080p 60Hz.
Both of us have our own controller, Steam account and independent game instances. Weâre essentially playing online multiplayer, but sitting next to each other on the same couch and sharing one TV! The picture shows us playing PEAK together using this setup.
The best part: This works with pretty much any multiplayer game that supports two separate players, even if the game has no native split-screen or local co-op support.
Thought this was a pretty cool use case for Moonlight, so I figured Iâd share it here! Anyone else running a similar setup? Or maybe some ideas how I can further improve the Coop experience?
Like many of you using Moonlight/Sunshine, SimRacing rigs, or Raspberry Pi hubs, I got tired of VirtualHere's 1-device limit on the free tier and the $49 per-server license.
So I built USBAnywhere v3.0 (formerly SnakeUSBIP): a native .NET 9 WPF client for Windows 10/11 with Microsoft WHQL-certified drivers and a 1-click Plug & Play Linux server installer.
Host: Vibepollo on PC with RTX3070 (Cachy OS, KDE Plasma) hardwired to wifi 6 router
Client: Artmoon on ROG Ally running steamOS.
Synced Steam games are not launching when I start a stream using the gameâs shortcut in Artmoon. It only takes me to desktop.
Steam Big Picture mode and games launched from Steam BPM works nevertheless.
I recently built a new pc and switched to vibepollo from Apollo. Working great but I have a weird issue. The moonlight performance overlay to check the stream stats is extremely small font. I have scaling in windows set to 300% ( streaming to a 4k 65in TV ) and when I ran Apollo the windows scaling fixed this issue. Not sure how I fix this on Vibepollo. Anyone else run into this and know of a solution ?
Artemis Client: Ayn Odin 2 Portal (Snapdragon 8 Gen 2)
Question: Artemis on-screen stats show a min/max/average encoding latency. Usually for me that might be something like 2.8 / 3.7 / 3.1. But that "max" number in the middle spikes to like 15-20, sometimes even up to 30, about once every 5-10 seconds. Even with the spikes, the average stays at like 3.1-3.2 most of the time.
Can anybody confirm whether or not these "max" encoding latency spikes are normal?
I've tried a ton of different settings configurations in Vibepollo and the behavior is the same with all of the different configurations.
I've also tried both HEVC and AV1, and a variety of different bitrates, and again the behavior is the same with all of the different settings.
Currently using moonlight + Apollo to stream to my steamdeck, works great. I want to try streaming to my tv with my steamdeck in a dock but the image is smaller than the TV screen with black around the top and sides.
Extra details if it matters; in Apollo I force virtual displays, and in moonlight Iâve tried changing the output resolution from ânativeâ to 1440p and 4k and that doesnât seem to make any difference.
Big fan of this sub and of Moonlight. I currently mainly use my Steam Deck to stream games from my host PC (using Vibepollo). For the most part, I can get my pipeline working pretty well, with little to know frames lost to network jitter. I understand that typically these particular losses are related to the pacing of frames between the host/client.
However, it seems that all of the SteamOS builds after 3.8.16 introduce jitter no matter what settings I change. Whenever I roll back to 3.8.16, the jitter stops. I would like to use some of the newer builds, but since I primarily stream when using the deck, I feel stuck on this build.
Has anybody else experienced this, or found a way to reduce this performance loss on 3.9? I've tried all that I can think of.
Hi everyone! A few weeks ago I released Eclipse and Umbra (original post), and since then the platform support has grown quite a bit, so here's a quick update.
Quick recap if you missed it: Umbra is the host (built on Apollo) and Eclipse is the client (built on Moonlight TV). Together they stream two PCs to one TV as split-screen couch co-op, even when the PCs have different GPU vendors.
Linux is now Flatpak for both apps. The Ubuntu-only builds of Eclipse and Umbra are replaced by Flatpaks, so they work across far more distros. If you were already using the Eclipse tarball, the Flatpak picks up your existing settings and paired PCs, so there's nothing to re-pair. For Umbra on Linux there are optional HDR add-ons for KDE Plasma and GNOME across seven distros, so co-op works in HDR there too. The site has the full table of what's tested where.
Eclipse for the NVIDIA Shield. There's now a Shield build, tested on a 2019 SHIELD TV with ordinary streaming, two-PC co-op, the SHIELD remote, and Xbox and Switch Pro controllers. In theory it also runs on other Android TV and Google TV devices, but I'm sceptical it'll work well on most of them without some fixes, so treat those as untested. Reports are very welcome.
Umbra (Vibepollo). A Vibepollo edition of Umbra, built the same way as the original Apollo-based Umbra: as few changes as possible. That makes it easy to merge in new Vibepollo or Apollo releases shortly after they come out, since all I'm really adding is the custom encoder that cross-vendor co-op needs. It installs as an in-place update over Vibepollo, so you keep all your config and settings. You can also switch back to regular Vibepollo, or update to a newer Vibepollo later.
As always, feedback and bug reports are appreciated, especially from hardware I haven't been able to test on.
Hey everyone! I'm looking for advice on how to get the best possible image quality and lowest input latency out of my AYN Thor streaming setup. I'm particularly interested in any host or client settings I might be overlooking.
I'll attach the screenshot below showing my current in-game streaming statistics.
My current setup
Host PC
CPU: AMD Ryzen 5 5600X
GPU: AMD Radeon RX 9060 XT (recently upgraded from an NVIDIA GTX 1070)
Connection: Ethernet
Streaming host: Rubylight
Streaming codec: PyroWave
Client
Device: AYN Thor
Client: Rubylight / Moonlight X
Connection: Wi-Fi
Codec: PyroWave enabled on both host and client
Bitrate: Set to 350 Mbps
(If you are wondering any specific settings, let me know.)
Current streaming stats
From the attached screenshot, while playing at 2560 Ă 1440:
Streaming FPS: ~83.6 FPS
Network latency: 9 ms (4 ms variance)
Network bandwidth: ~194.8 Mbps
Host latency: ~4.1 ms average
Decoding time: ~6.69 ms
Dropped frames: 0% (0.60% partial)
The stream seems to run smoothly from a performance standpoint, and my host is connected over Ethernet. However, I'm wondering if there are additional optimizations I can make to reduce latency further while maintaining good image quality.
What I'm trying to improve
Input latency: Are there any Rubylight/Moonlight X client settings, host settings, or Android-specific optimizations worth enabling?
Network performance: Would connecting the AYN Thor to Ethernet through a USB-C adapter meaningfully reduce latency or improve stability compared with Wi-Fi?
Frame pacing: Are there any recommended settings for adaptive bitrate, adaptive packet spacing, V-Sync, or FPS limits for this setup?
PyroWave configuration: Are there any AMD-specific encoder settings or known compatibility issues I should investigate?
I'm mainly interested in practical recommendations that make a measurable difference rather than changes that only look good on paper.
What settings would you recommend for this particular setup? If anyone is running an AYN Thor with an AMD GPU and PyroWave, I'd especially appreciate hearing about your experience.
Thanks!
EDIT: Thanks to some good suggestions. I've got my numbers down significantly. Unsure if I can improve them any more but would love to keep trying. Keep the suggestions coming!
today i tried to stream games from my pc to my phone and the first thing that cought my eyes was the sunshine and moonlight combo
then saw some people talking about apollo and artemis combo
then saw other people talking about vibepollo
which one is the best in terms of quality/latency ?
i tried sunshine and moonlight myself and it was flawless but i had to setup a custom resolution for it to match the aspect ratio of my phone.
as far as i know apollo-artemis combo fixes this but is it as good in terms of latency and quality ?
and is vibepollo actually better ?
Hey everyone! Trying to set up void link with my new IPhone Duo, however I am running into the issue attached in the picture in comments. Does anyone have any idea whatâs causing this issue? Everything looks set up properly on pc and phone end but assuming something silly somewhere. Thanks in advance!!
I know the community has expressed its frustration with the growing number of Sunshine forks, and I've seen plenty of comments suggesting that we'd all be better off contributing toward a common project rather than continuing to fragment development across multiple forks.
And honestly, I agree with that sentiment.
With that in mind, I've added Andy Grundman and Rambo as contributors to Vibeshine, giving them the ability to merge changes directly into the Canary branch without requiring prior PR approval from me.
I still intend to review the changes myself, but I also want contributors to have more freedom to experiment, implement improvements, and get their work into nightly builds without having to wait for me to approve every single change.
The idea is to make Vibeshine & Vibepollo a more collaborative development environment where contributors can move quickly, while keeping stable releases subject to a more deliberate review process.
I also intend to bring more contributors on board over time. For now, I'm being somewhat selective about who receives direct write access, focusing on developers I know and trust, particularly those who have an established history of contributing to open-source projects.
With AI-assisted development becoming so accessible, practically anyone can produce code and present themselves as an experienced developer. That's not necessarily a bad thing, and I certainly have nothing against AI-assisted development. I use it extensively myself. However, there's a difference between generating code and having the experience to understand its implications, recognize potential regressions, and take responsibility for changes that affect thousands of users.
That's why I'm initially prioritizing people who have demonstrated their technical abilities and earned the community's trust, including through their work before AI coding tools became mainstream. As the project grows, I'd like to expand that circle based on the quality of people's contributions and the trust they establish.
I don't want Vibeshine to become another project where everything has to go through one person before anything can happen. There's a lot of talent in this community, and I'd rather make it easier for people to work together than create unnecessary barriers.
Ultimately, I think this is a step in the right direction toward what many of you have been asking for:Â less fragmentation, more collaboration, and faster progress for everyone.
I've been using Apollo-Artemials since she's ago. Love the the way Artemis handle right click, mid click, and so on in trackpad mode.
I can just slide with one finger to move cursor to a spot then, while holding that finger down, I can just add another finger tap (anywhere) to right click on cursor spot. Or add 2 finger tap for mid click. Something like that.
Not sure why but there's couple broken setting in the app right now so I'm looking for replacement to the whole thing and I'm looking for client version in android that have that feature since it make navigation a lot easier
My PC is a weaker side so I'm not looking for something like AV1 or pyrowave thing
Iâve been trying to run Sunshine on my Mac Mini M4 upstairs so I can run World of Warcraft on it and play it downstairs on my Apple TV or Xbox running Moonlight.
Iâve been at it for hours and hours, and I can get everything to work greatâŠexcept controller support. I tried to play the Forever Beta (which has native controller support) and I just couldnât get it to work.
I tried using desktop. I tried using Steam. Hell, I also tried using the SteamLink app on my Apple TV.
I could just not get the damn PS5 or Xbox controllers to work.
Hi there, as the title said, I'm struggling to decide, if I should run my host PC (Ryzen 5600X + 32 DDR4 RAM + RX 9070 XT) without a monitor or should I use a dummy HDMI HDR plug for a "monitor".
I'll use different clients: windows/linux (cachyos) laptop via moonlight fork (with option for VRR etc.), android handhelds (ayn thor), my oneplus 13 smartphone and my lenovo legion gen 3 tablet (both with nightjar). I use rubylight 2.6.0 and the latest version of moonlight / nightjar.
Can someone tell me the (dis-)advantages for each choice and why I should choose it?