r/MoonlightStreaming 15d ago

A Comprehensive Guide to Moonlight/GameStream Servers, Clients, and Forks (2026 Edition)

321 Upvotes

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).
  • Artemis / Moonlight Noir: Apollo’s dedicated Android companion client, offering excellent host UX and virtual display integration.
  • 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!)


r/MoonlightStreaming Sep 21 '25

Guide/Tutorial Ultimate Guide to Configuring Moonlight + Sunshine for Remote Play

499 Upvotes

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:

  • Internet Service:
    • 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

Enable: https://pastebin.com/42YBtx6T

Disable: https://pastebin.com/bKpmmFQC

FPS Capping

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.

Device Manager → Network Adapters → Properties → Advanced →

  • Flow Control Disable
  • Advanced EEE Disable
  • Energy-Efficient Ethernet Disable
  • Gigabit Lite Disable
  • Green Ethernet Disable
  • Power Saving Mode Disable
  • Interrupt Moderation Disable
  • Large Send Offload Enable

Configuring Video Signals (avoid this step when using Apollo)

There are two scenarios:

  1. You have a monitor connected with the same resolution and refresh rate on both the client and the host.
  2. You have a monitor on the host that is different from the client.

For the first case, congratulations! You don’t need to do anything and can skip this part.

For the second case, you have two options:

  1. Install a Virtual Display Driver to Windows, and optionally a Virtual Audio Driver.
    1. With the Virtual Display Driver, you can simulate any resolution and refresh rate your screen supports.
    2. 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:

@echo off
powershell -command "Get-Process sunshine -ErrorAction SilentlyContinue | ForEach-Object { $_.PriorityClass = 'RealTime' }"
pause

Always remember to run it as administrator.

Windows Adaptation for Handheld Devices

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:

System Preferences → Security & Privacy → Privacy → disable 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.

defaults write -g ApplePressAndHoldEnabled -bool false

More info about shuttering in Mac OS

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.

Codec Compression Bandwidth CPU/GPU
H.264 Lower High Lower
H.265 Medium Medium Medium
AV1 High Lower High

More info: https://www.reddit.com/r/MoonlightStreaming/s/MqoI9LVQ4C

Recommended Settings:

  • Display Mode: Full Screen
  • V-Sync: Unchecked (Recommended in single-player)
  • 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:

  1. Using a service like Tailscale, ZeroTier, or Netbird
  2. Opening ports on your network to access the host externally and setting up a VPN
  3. 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

Update 17.07.26: Steam Remote Play alternative


r/MoonlightStreaming 6h ago

Playing Red Dead Redemption 2 using bank wifi

Enable HLS to view with audio, or disable this notification

47 Upvotes

I’m currently using tailscale vpn and moonlight to play games outside my home.


r/MoonlightStreaming 1h ago

Finally, it's working how I wanted!!

Post image
Upvotes

45m ethernet cable, 1 gigabit ethernet adapter for client and setting virtual display at 4k on vibepollo. Feels like the tv is connected via HDMI to my PC.

I have just one question, the virtual display properties show extremely high refresh rate (400hz or something). What could be the reason behind it?


r/MoonlightStreaming 10h ago

Moonlight XR - v0.3 released - Free open source game streaming with realtime 2D->3D conversion

Thumbnail
github.com
19 Upvotes

Moonlight XR is a streaming client for Sunshine/Apollo that allows you to stream any content from your PC to your Quest, Pico (and other) headsets and turn those streams into 3D in real-time. (3D as in 3D movies, not VR).

## Moonlight XR v0.3

This is the biggest update yet, bringing a lot of new features and bug fixes! Hope you all enjoy.

First things first **You will need to uninstall the v0.1 or v0.2 and pair to your pc again** (Should never need to do this again!) The app's package name changed (part of preparing for Google's developer verification), so v0.3 installs

alongside old versions instead of upgrading. Install v0.3, pair with your

host once, then uninstall the old copy. Your host-side settings are untouched.

Everything below was verified on both a Quest 3 and a Pico 4 Ultra. Other headsets have issues? Please send me the logs, you'll find them in the Downloads folder of your headset.

### In-headset settings panel

Allows you to change various settings in real-time, including more granular control of the screen. Any controls not in here can be found in the menu of Moonlight XR's launcher (before immersive mode), some settings such as resolution can only be changed before the stream starts.

### Virtual keyboard

Virtual keyboard for input to host PC.

### Environments: New 3D rooms

Added a "minimal room" and a "PSX Cinema". These are not just 360 images but actual 3D spaces with lighting from the screen impacting them. I will be adding more, much higher quality, over time but for now these were to test that I could do it without a game engine and get a workable result.

The PSX cinema is credit to ["VR Cinema Environment"](https://skfb.ly/6VuIX) by

fangzhangmnm (CC BY 4.0).

### Ambilight

A glow behind the screen, sampled from the picture's edges, Philips style.

On by default as the performance hit is essentially zero and adds a nice effect. It can be toggled off in the realtime settings, and the intensity can also be changed.

### Exit button

Let's you exit without needing to depend on your headset's built in home button. Truly revolutionary stuff!

### Environment Resolution Picker

A new setting for how sharply the 3D rooms render, in the 2D settings menu:

Low (used automatically on Quest 2 era headsets), Standard (the default),

High, and an experimental Ultra that ignores what the headset asks for and

may hitch or stutter. If a room looks aliased to you, try High.

### Settings menu cleanup

Everything you can change live in the headset now lives only there. The 2D settings menu keeps only what has

to be set before a session starts. VR mode also drops its "experimental"

label.

### Sharpening

Compositor sharpening on the screen layers, on runtimes that offer it. It

runs inside the compositor's own sampling pass, so it is free. Defaults to quality, I find everything looks better with it on but it's up to you!

### Bug fixes

- Double-clicking works now.

- Resizing by a corner keeps the screen centred where you put it instead

of walking it toward the dragged corner.

- The corner resize brackets no longer can get stuck within the boundaries of the screen

- The pairing PIN no longer vanishes after a few seconds when you look away

or take the headset off to type it into the host.

- Starting a session with passthrough enabled no longer sometimes comes up

in a black room on Pico.

- Opening a panel with the glow on no longer blanks the display for a

moment on headsets with a low compositor layer limit.

### Smaller things

- The controller laser is filtered with a One Euro filter: steadier on small

buttons, no added lag on fast moves.

- With passthrough off and no environment picked, you now get black rather

than a surprise panorama.

- Picking an environment no longer also clicks whatever was on the host

screen behind the grid.

- A plain text log (Download/MoonlightXR/moonlight.log on the headset) that

you can send with bug reports. Grab it over USB, or simply send it from within your headset.

### Older headsets

On XR2 Gen 1 devices (Quest 2 / Pico 4/Neo 3 Link era) the app now applies a more

conservative first-run profile: 1440p, 72 fps, and a lower depth inference

rate, with realtime 3D kept on. I haven't actually confirmed these are good settings as I don't have any of those headsets right now. If it runs badly (or well!) on yours then please let me know (and send the log file!).

### Known issues

- Occasional audio pops and brief stutters during streams. Under

investigation; current evidence points at the stream path rather than the

renderer. Often settles after the first couple of minutes.

- The disocclusion stretch at object edges in realtime 3D remains; a mono

source cannot supply those pixels, and anything better is future work.

- Keyboard: no pipe/tilde/backtick, no key repeat yet.


r/MoonlightStreaming 14h ago

Solved 4K 120Hz Moonlight micro-stutters with MoCA 2.5 and beat Wi-Fi 7 mesh for $300

23 Upvotes

Hey everyone,

I’ve been using a TP-Link Deco Wi-Fi 7 mesh system for home networking, with my host gaming rig on the floor above our living room. It worked fine when my client was an Apple TV at 1440p 60 Hz, but once I built a dedicated living room HTPC to push 4K 120 Hz/HDR streams via Vibeshine & Moonlight, wireless packet pacing was rearing its head and leading to micro stutters and frame pacing problems.

We had 3 phone jacks with cat 5e cable but in totally inconvenient locations so I quickly abandoned them, and I did not want to fish new wire because it would be difficult with our home. The house had 7 coax wall ports spread across three floors and the basement. I had avoided MoCA for a while because I didn't know how the builder had routed the lines back in 2006, but I finally decided to unscrew every single wall plate and trace the runs.

I found out that every floor had at least one legacy daisy-chained splitter inside the wall cavity capped at 1000 MHz, which severely attenuates MoCA 2.5. I also found out that these daisy chained lines on each floor all connected to one line that ran outside to two legacy splitters cascaded together on the side of the house.

What I Did

Outdoor Hub: Ripped out the two cascaded exterior splitters and replaced them with a single balanced 4-way MoCA 2.5 Splitter inside a weatherproof capsule. Because we don’t use cable internet, I capped the splitter's ⁠IN⁠ port with a terminator to prevent internal RF reflections, and capped the old cable input line. All ports sealed with dielectric grease, and I cleaned the pins of the connectors with 90% isopropyl alcohol beforehand to get rid of any oxidation that built up over 20 years.

Unused coax ports bypass: For rooms where I didn't need active coax jacks, I removed the old splitters entirely and joined the in-wall cables using 3 GHz female-to-female barrel couplers. Then I switched the coaxial port plate to a plate to one with a blank face. This eliminated unnecessary signal loss and turned that floor run into an unattenuated direct line. If we do need to use that line in the future it just needs to have a splitter installed and the coaxial face plate replaced.

Coax ports in use: Swapped the old in-wall splitters for 2-Way MoCA 2.5 splitters to keep these jacks live.

Cellular Internet: Kept our 5G gateway at its optimal window location for peak cellular metrics, ran a 30 ft flat white Cat 6 cable cleanly along the baseboard, and injected our main mesh router directly into the coax plant via a MoCA 2.5 adapter.

Wired Backhaul: Connected the remaining MoCA adapters directly to my mesh satellite units. These units are also wired to my client HTPC, host rig and Jellyfin server.

I spent about $300 and 2.5 hours of my time. In return I got true 2.5 Gbps across all three floors.
Moonlight runs at 4K 120 fps HDR at 200 Mbps with ~ 5-6ms network transit delay and zero frame drops. All mesh Wi-Fi nodes now run on dedicated wired backhaul as well, freeing up the wireless bands and giving the Steam Deck a rock-solid connection anywhere in the house as well for moonlight streaming. If you have pre-existing coax sitting dead in your walls, opening up the plates and mapping your splitters is an easy and high ROI project. Do it!


r/MoonlightStreaming 6h ago

Apollo Virtual Display issues

4 Upvotes

I have had streaming working pretty well for a while. But recently the virtual display functionality doesn't seem to work/start via Apollo. Whenever I connect a session via moonlight (SteamOS and xbox) I get my main monitor 1 desktop running at 1440p instead of the virtual 4k one.

  • I have always create virtual display checked for both clients.
  • I have a 4k Display mode override set.
  • I have tried checking the headless option.
  • I see a third monitor (either steam machine or legacy moonli for xbox) in the windows display settings. But it "isn't active" even when connected via moonlight.
  • I have cleared my monitor cache by deleting the registry as per this link

I can't say I remember changing anything before it stopped working and was wondering if anyone had ideas to fix the virtual display function.


r/MoonlightStreaming 3m ago

Which hardware to buy for my 4k tv?

Upvotes

Hi everyone.

i was planning to buy a cheap hardware and sideload artemis on it.

Is the firestick 4k max the best option (with lowest decoding times) i can get with a 50/60€ or there are better alternatives?

i plan to stream games in 4k 60fps, or 120fps when it's possible.

i have a wifi 7 router.


r/MoonlightStreaming 40m ago

High decoding time on Google tv streamer 4k

Upvotes

Hi, I have a rx6800 and set all the settings right but the decoding time for my Google tv streamer is still around 8ms. What am I doing wrong? If I switch it to 1080p it remains the same.

The main issue I'm facing is stuttering.


r/MoonlightStreaming 9h ago

TCL Tv C6K Problem

4 Upvotes

Hi, I’d like to know if anyone has encountered issues similar to mine and could help me get a playable experience. I’m trying to stream from my PC to my living room TV, but I’m running into a few problems.

If I use Moonlight as the client, the stream runs smoothly (stable 60 fps), but my TV freezes and crash if I try to adjust the volume or exit the app, wich makes unplayable. There are forks of Artemis that fix this, but I can't get the stream to run as smoothly on Artemis as it does on Moonlight. On Artemis, it feels like I'm playing at 30 fps, regardless of the settings I choose. I’ve already tested other Artemis forks, like Artemide, but the framerate issue still persists.

It is also worth mentioning that I have tested with several different hosts: Sunshine, Apollo, Vibepollo, and Vibeshine. The problem remains the same: smooth streaming, but TV crashing in Moonlight and low FPS in Artemis.

I’m loosing my mind out trying to find a solution—if anyone can help, I’d appreciate it.


r/MoonlightStreaming 17h ago

Virtual monitor for streaming/sunshine and moonlight

3 Upvotes

Dynamic Virtual Monitor for Sunshine/Moonlight on KDE Wayland — KRFB + Any Resolution + Dynamic Refresh Rate

I originally made a guide for using a KDE KRFB virtual monitor with Sunshine/Moonlight at 1920×1080 @ 120 Hz.

Since then, I changed the setup significantly.

The new version is fully dynamic:

  • No dummy HDMI/DisplayPort plug
  • Physical monitor can remain enabled
  • No hard-coded resolution
  • Resolution comes from the Sunshine/Moonlight client request
  • Automatically creates the requested virtual monitor resolution
  • Automatically creates missing refresh-rate modes
  • Supports 60/90/120/240 Hz
  • Works with resolutions such as 1280×800, 1920×1080, 1920×1200, 2560×1440 and 3840×2160
  • Automatically positions the virtual monitor beside the physical displays
  • No need to manually fix the display position in KDE Display Settings every time

The important part is that KRFB creates the virtual display and KScreen controls its resolution, refresh rate and position.

What the setup does

The basic flow is:

Moonlight
    │
    ▼
Sunshine
    │
    │ client requests resolution/FPS
    ▼
sunshine-vm-dynamic.sh
    │
    ├── creates KRFB virtual monitor
    │
    ├── detects the virtual KScreen output
    │
    ├── positions it automatically
    │
    ├── checks for requested refresh rate
    │
    ├── creates custom mode if necessary
    │
    └── activates requested mode
    │
    ▼
Virtual-sunshine-vm
    │
    ▼
Sunshine
    │
    ▼
Moonlight

The physical monitor does not need to be disabled.

Requirements

This guide is intended for:

  • KDE Plasma
  • Wayland
  • KRFB
  • KScreen / kscreen-doctor
  • Sunshine
  • Moonlight

On Arch/Arch-based systems, install KRFB:

sudo pacman -S krfb

Check that the virtual-monitor executable exists:

krfb-virtualmonitor --help

Also check:

kscreen-doctor --help

You should see the addCustomMode functionality.

STEP 1 — Create the script directory

mkdir -p ~/.local/bin

STEP 2 — Create the dynamic virtual-monitor script

Create:

nano ~/.local/bin/sunshine-vm-dynamic.sh

Paste the following:

#!/bin/bash

set -u

WIDTH="${1:-${SUNSHINE_CLIENT_WIDTH:-1920}}"
HEIGHT="${2:-${SUNSHINE_CLIENT_HEIGHT:-1080}}"
FPS="${3:-${SUNSHINE_CLIENT_FPS:-60}}"

OUTPUT="Virtual-sunshine-vm"
NAME="sunshine-vm"
PASSWORD="CHANGE_THIS_PASSWORD"
PORT="5905"

echo "Dynamic Desktop: ${WIDTH}x${HEIGHT}@${FPS}"

KSCREEN="/usr/bin/kscreen-doctor"

kscreen_output() {
    "$KSCREEN" -o 2>/dev/null |
        sed $'s/\033\\[[0-9;]*m//g'
}

# ------------------------------------------------------------
# Detect Wayland
# ------------------------------------------------------------

export XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"

if [ -z "${WAYLAND_DISPLAY:-}" ]; then
    for socket in "$XDG_RUNTIME_DIR"/wayland-*; do
        [ -S "$socket" ] || continue
        WAYLAND_DISPLAY="$(basename "$socket")"
        export WAYLAND_DISPLAY
        break
    done
fi

if [ -z "${WAYLAND_DISPLAY:-}" ]; then
    echo "ERROR: Could not find a Wayland display."
    exit 1
fi

# ------------------------------------------------------------
# Remove any previous virtual monitor.
# ------------------------------------------------------------

pkill -f '/usr/bin/krfb-virtualmonitor' 2>/dev/null || true
sleep 2

# ------------------------------------------------------------
# Create the virtual monitor at the requested resolution.
# ------------------------------------------------------------

/usr/bin/krfb-virtualmonitor \
    --resolution "${WIDTH}x${HEIGHT}" \
    --name "$NAME" \
    --password "$PASSWORD" \
    --desktopfile org.kde.krfb.virtualmonitor \
    --scale 1 \
    --port "$PORT" &

# ------------------------------------------------------------
# Wait for KScreen to register the virtual monitor.
# ------------------------------------------------------------

FOUND=0

for i in $(seq 1 30); do
    if kscreen_output | grep -q "$OUTPUT"; then
        FOUND=1
        break
    fi

    sleep 0.5
done

if [ "$FOUND" -ne 1 ]; then
    echo "ERROR: Virtual monitor was not detected."
    exit 1
fi

# ------------------------------------------------------------
# Get the KScreen output number.
# ------------------------------------------------------------

OUTPUT_ID=$(
    kscreen_output |
    awk -v name="$OUTPUT" '
        $0 ~ name {
            print $2
            exit
        }
    '
)

if [ -z "$OUTPUT_ID" ]; then
    echo "ERROR: Could not determine output ID."
    exit 1
fi

echo "Virtual monitor output ID: ${OUTPUT_ID}"

# ------------------------------------------------------------
# Automatically position the virtual monitor.
#
# Find the rightmost physical display and place the virtual
# monitor immediately to its right.
#
# No physical resolution is hard-coded.
# ------------------------------------------------------------

PHYSICAL_RIGHT=0
PHYSICAL_Y=0

while read -r ID NAME; do

    if [ "$ID" = "$OUTPUT_ID" ]; then
        continue
    fi

    GEOMETRY=$(
        kscreen_output |
        awk -v id="$ID" '
            $0 ~ "^Output: " id " " {
                inside=1
                next
            }

            inside && /^Output:/ {
                exit
            }

            inside && /Geometry:/ {
                print $2, $3
                exit
            }
        '
    )

    if [ -z "$GEOMETRY" ]; then
        continue
    fi

    POSITION=${GEOMETRY%% *}
    SIZE=${GEOMETRY#* }

    X=${POSITION%,*}
    Y=${POSITION#*,}

    DISPLAY_WIDTH=${SIZE%x*}

    RIGHT=$((X + DISPLAY_WIDTH))

    if [ "$RIGHT" -gt "$PHYSICAL_RIGHT" ]; then
        PHYSICAL_RIGHT="$RIGHT"
        PHYSICAL_Y="$Y"
    fi

done < <(
    kscreen_output |
    awk '/^Output:/ {print $2, $3}'
)

echo "Positioning virtual monitor at ${PHYSICAL_RIGHT},${PHYSICAL_Y}"

if ! "$KSCREEN" \
    "output.${OUTPUT_ID}.position.${PHYSICAL_RIGHT},${PHYSICAL_Y}"; then

    echo "WARNING: Could not automatically position virtual monitor."
else
    echo "Virtual monitor positioned automatically."
fi

# ------------------------------------------------------------
# Find or create the requested refresh rate.
#
# KScreen/KRFB may report 120 Hz as something like 119.xx Hz.
# Therefore a small tolerance is used.
# ------------------------------------------------------------

MODE_ID=""

echo "Checking for ${WIDTH}x${HEIGHT}@${FPS} Hz..."

MODE_ID=$(
    kscreen_output |
    awk \
        -v name="$OUTPUT" \
        -v res="${WIDTH}x${HEIGHT}" \
        -v target="$FPS" '
        $0 ~ name {
            inside=1
            next
        }

        inside && /^Output:/ {
            exit
        }

        inside && /Modes:/ {
            best_id=""
            best_diff=999999

            for (i=1; i<=NF; i++) {

                token=$i

                if (token ~ /^[0-9]+:/ && token ~ res "@") {

                    id=token
                    sub(/:.*/, "", id)

                    mode=token
                    sub(/^[0-9]+:/, "", mode)

                    split(mode, p, "@")
                    rate=p[2] + 0

                    diff=rate-target

                    if (diff < 0)
                        diff=-diff

                    if (diff <= 2 && diff < best_diff) {
                        best_diff=diff
                        best_id=id
                    }
                }
            }

            if (best_id != "") {
                print best_id
                exit
            }
        }
    '
)

# ------------------------------------------------------------
# Requested mode does not exist.
# Create it as a custom mode.
# ------------------------------------------------------------

if [ -z "$MODE_ID" ]; then

    echo "No ${WIDTH}x${HEIGHT}@${FPS} mode found."
    echo "Adding custom ${WIDTH}x${HEIGHT}@${FPS} Hz mode..."

    if ! "$KSCREEN" \
        "output.${OUTPUT_ID}.addCustomMode.${WIDTH}.${HEIGHT}.${FPS}000.full"; then

        echo "ERROR: Failed to add ${WIDTH}x${HEIGHT}@${FPS} custom mode."
        exit 1
    fi

    sleep 1

    # Find the newly-created mode.
    MODE_ID=$(
        kscreen_output |
        awk \
            -v name="$OUTPUT" \
            -v res="${WIDTH}x${HEIGHT}" \
            -v target="$FPS" '
            $0 ~ name {
                inside=1
                next
            }

            inside && /^Output:/ {
                exit
            }

            inside && /Modes:/ {

                best_id=""
                best_diff=999999

                for (i=1; i<=NF; i++) {

                    token=$i

                    if (token ~ /^[0-9]+:/ && token ~ res "@") {

                        id=token
                        sub(/:.*/, "", id)

                        mode=token
                        sub(/^[0-9]+:/, "", mode)

                        split(mode, p, "@")
                        rate=p[2] + 0

                        diff=rate-target

                        if (diff < 0)
                            diff=-diff

                        if (diff < best_diff) {
                            best_diff=diff
                            best_id=id
                        }
                    }
                }

                if (best_id != "") {
                    print best_id
                    exit
                }
            }
        '
    )
fi

# ------------------------------------------------------------
# Verify that a mode was found.
# ------------------------------------------------------------

if [ -z "$MODE_ID" ]; then

    echo "ERROR: Could not find ${WIDTH}x${HEIGHT}@${FPS} mode."
    echo
    echo "Available virtual monitor modes:"
    kscreen_output | sed -n "/${OUTPUT}/,/^Output:/p"

    exit 1
fi

echo "Using KScreen mode ID: ${MODE_ID}"

# ------------------------------------------------------------
# Apply the mode.
# ------------------------------------------------------------

if ! "$KSCREEN" \
    "output.${OUTPUT_ID}.mode.${MODE_ID}"; then

    echo "ERROR: Failed to configure ${WIDTH}x${HEIGHT}@${FPS}."
    exit 1
fi

echo "Configured ${WIDTH}x${HEIGHT}@${FPS}"

exit 0

IMPORTANT

Change:

PASSWORD="CHANGE_THIS_PASSWORD"

to your own KRFB password.

Do not use the password from this Reddit post.

STEP 3 — Make the script executable

chmod +x ~/.local/bin/sunshine-vm-dynamic.sh

Check the script before running it:

bash -n ~/.local/bin/sunshine-vm-dynamic.sh

There should be no output.

STEP 4 — Test the virtual monitor

The script accepts:

WIDTH HEIGHT FPS

For example:

~/.local/bin/sunshine-vm-dynamic.sh 1920 1080 60

Then:

~/.local/bin/sunshine-vm-dynamic.sh 1920 1080 120

You can also test:

~/.local/bin/sunshine-vm-dynamic.sh 1280 800 90


~/.local/bin/sunshine-vm-dynamic.sh 1280 800 120


~/.local/bin/sunshine-vm-dynamic.sh 1920 1200 60


~/.local/bin/sunshine-vm-dynamic.sh 1920 1200 120


~/.local/bin/sunshine-vm-dynamic.sh 2560 1440 120


~/.local/bin/sunshine-vm-dynamic.sh 3840 2160 60


~/.local/bin/sunshine-vm-dynamic.sh 3840 2160 120

And even:

~/.local/bin/sunshine-vm-dynamic.sh 1920 1080 240

If the requested refresh rate doesn't already exist, the script uses:

kscreen-doctor output.<ID>.addCustomMode.<width>.<height>.<refresh>

For example, 240 Hz becomes:

240000 mHz

The important part is that the script doesn't assume that 120 Hz is the maximum.

STEP 5 — Verify the virtual monitor

Run:

kscreen-doctor -o

You should see something similar to:

Output: 1 Virtual-sunshine-vm
        enabled
        connected
        Modes:
            1:1920x1080@60.00
            2:1920x1080@119.93
            3:1920x1080@239.XX

The exact mode numbers and refresh-rate values will vary.

For example, KDE may report:

119.93

instead of:

120

That is normal.

Likewise, a requested 90 Hz mode may appear as:

89.89

The script intentionally allows a small refresh-rate difference when selecting a mode.

STEP 6 — Sunshine configuration

The important difference from my original guide:

There is no "Force Capture Method" step in this setup.

Do not look for a "Force Capture" option and don't add one just because an older version of this guide mentioned it.

The dynamic script is responsible for creating and configuring the virtual monitor.

Configure the script as the Sunshine preparation command used when a client connects.

The script already understands Sunshine's client environment variables:

SUNSHINE_CLIENT_WIDTH
SUNSHINE_CLIENT_HEIGHT
SUNSHINE_CLIENT_FPS

Therefore, when Moonlight requests a particular resolution/FPS, Sunshine can pass that information to the script.

For example, a client request can result in:

SUNSHINE_CLIENT_WIDTH=2560
SUNSHINE_CLIENT_HEIGHT=1440
SUNSHINE_CLIENT_FPS=120

and the script effectively performs:

2560x1440@120

without you hard-coding 2560×1440 into the script.

STEP 7 — Why this is better than the old version

The old setup was essentially:

1920x1080
      +
120 Hz

Everything was hard-coded.

The new setup is:

Moonlight request
       │
       ▼
Requested width
Requested height
Requested FPS
       │
       ▼
Dynamic script
       │
       ├── KRFB resolution
       ├── KScreen mode detection
       ├── custom mode creation
       └── automatic positioning

So the same script can handle:

1280x800 @ 60
1280x800 @ 90
1280x800 @ 120

1920x1080 @ 60
1920x1080 @ 90
1920x1080 @ 120
1920x1080 @ 240

1920x1200 @ 60
1920x1200 @ 120

2560x1440 @ 60
2560x1440 @ 120

3840x2160 @ 60
3840x2160 @ 120

You don't need a separate script for each resolution.

STEP 8 — Automatic monitor positioning

One problem with the earlier version was that after creating the virtual monitor, part of the display could overlap the physical monitor.

The new script fixes this automatically.

It examines the current KScreen geometry:

Geometry: X,Y WIDTHxHEIGHT

It finds the rightmost physical display and calculates its right edge.

Then it places the virtual monitor there:

physical monitor
        │
        │
        ▼
┌───────────────────┐ ┌───────────────────┐
│                   │ │                   │
│ Physical monitor  │ │ Virtual monitor   │
│                   │ │                   │
└───────────────────┘ └───────────────────┘

There is no hard-coded physical resolution in this calculation.

This is important for systems with different monitor layouts.

STEP 9 — Start it automatically

Once manual testing works, the script can be connected to your Sunshine startup/client preparation workflow.

The important part is that the script should be executed as the user running the KDE Wayland session.

It needs access to:

XDG_RUNTIME_DIR
WAYLAND_DISPLAY
KScreen
KWin
KRFB

Do not run the virtual-monitor configuration as a normal system service without access to the user's Wayland session.

STEP 10 — Check the logs

If something doesn't work, first run:

kscreen-doctor -o

Then run the script manually:

~/.local/bin/sunshine-vm-dynamic.sh 1920 1080 120

The output is very useful.

For example:

Dynamic Desktop: 1920x1080@120
Virtual monitor output ID: 1
Positioning virtual monitor at 5405,0
Virtual monitor positioned automatically.
Checking for 1920x1080@120 Hz...
Using KScreen mode ID: 2
Configured 1920x1080@120

If a mode doesn't exist:

Checking for 1920x1080@240 Hz...
No 1920x1080@240 mode found.
Adding custom 1920x1080@240 Hz mode...
Using KScreen mode ID: 10
Configured 1920x1080@240

That means the script successfully created the missing mode.

STEP 11 — Test with Moonlight

Open Moonlight on your client.

Connect to your Sunshine host and start the desktop.

Try different resolutions and refresh rates.

For example:

1920×1080 @ 60
1920×1080 @ 120
2560×1440 @ 120
3840×2160 @ 60

If your client exposes 90 Hz or 240 Hz:

1280×800 @ 90
1920×1080 @ 240

can also be tested.

The virtual monitor should automatically change to the requested configuration.

Troubleshooting

Virtual monitor isn't created

Check:

krfb-virtualmonitor --help

and:

kscreen-doctor -o

Make sure you are running KDE Wayland.

The requested mode doesn't exist

Run:

kscreen-doctor -o

The script should automatically create a custom mode when necessary.

For example:

No 1920x1080@240 mode found.
Adding custom 1920x1080@240 Hz mode...

is expected.

KDE reports 119.xx instead of 120

This is normal.

For example:

119.93 Hz

is the mode corresponding to the requested 120 Hz refresh rate on this setup.

The script accounts for this small difference.

KDE reports 89.xx instead of 90

Also normal.

For example:

89.89 Hz

can be the actual reported mode for a requested 90 Hz mode.

Displays overlap

The current script automatically calculates the position of the virtual display.

Run:

kscreen-doctor -o

and look for:

Geometry:

The script uses the physical display geometry rather than assuming a particular resolution.

Sunshine cannot see the virtual display

First check:

kscreen-doctor -o

You should see:

Virtual-sunshine-vm

Then make sure Sunshine is running inside the same KDE Wayland user session.

Final result

The finished setup looks like this:

                 KDE Plasma / Wayland
                         │
                         ▼
                 KRFB Virtual Monitor
                         │
                         ▼
                 Virtual-sunshine-vm
                         │
              ┌──────────┴──────────┐
              │                     │
        Dynamic resolution     Dynamic refresh
              │                     │
        1280×800              60 / 90 / 120
        1920×1080                  240
        1920×1200
        2560×1440
        3840×2160
              │                     │
              └──────────┬──────────┘
                         ▼
                      Sunshine
                         │
                         ▼
                      Moonlight

Notes

This setup is specifically for KDE Plasma Wayland using KRFB's virtual-monitor functionality. KRFB creates the compositor-level virtual output, while KScreen controls its modes and geometry

If you are using a different desktop environment, X11 instead of Wayland, or a different virtual-display implementation, the commands in this guide may not apply.

These steps written with the help of chatgpt because I can't find anything related to virtual monitor on Linux and I tried alot of steps didn't work out well and then I found this post

https://discuss.kde.org/t/how-to-create-a-virtual-monitor-display/2725/13

And there is alot good suggestion provided by other users and after alot of trial and error I manage to start sunshine using virtual monitor instead of physical monitor and without using any physical display port I.e., when using edid method hope it will help someone


r/MoonlightStreaming 12h ago

Anyone able to get it working for the Miyoo mini Plus?

1 Upvotes

It just keeps getting stuck on connecting for me. I've tried turning off my firewall, I've tested my connection through other devices and it's totally fine, it's just the Miyoo


r/MoonlightStreaming 12h ago

Muddy/murky images despite good connection and high bit rate

1 Upvotes

I stream my host pc using Apollo and use my rog Xbox ally to connect to it. I have a virtual display set up for my ally. When I stream to my Ally the quality seems and feels good with little to no latency (my host pc is on Ethernet. But when I output it to my living room tv (4k lg tv) the image looks incredibly dark and murky. This is also after setting my Xbox ally’s display, and virtual display to 4k at 60hz. There is also horrible ghosting as well.


r/MoonlightStreaming 12h ago

Moonlight stuck on connecting

1 Upvotes

Anyone able to solve this issue? Really want to play PC games on my Miyoo :')


r/MoonlightStreaming 13h ago

Moonlight not finding sunshine pc

1 Upvotes

Pretty much the title, I’ve tried every hot fix I can find, I’ve messed with my firewall, my wifi setting, made sure they’re paired to the same wifi. Nothing works, even when manually inputting the IP address. Anyone have any ideas? On steam deck in case that matters.


r/MoonlightStreaming 18h ago

how to use function keys on a bluetooth keyboard which has no function key separate key on my keyboard?

1 Upvotes

and using windowkey button just takes me out of moonlight app. thanks


r/MoonlightStreaming 19h ago

Help with issues after HyperOS system update

1 Upvotes

Hi, Can anyone Help please?

I'm using a Redmi Pad 2 11" (4GB RAM) as an Artemide 0.5 client.

My host PC is running the latest version of Vibepollo with the following specs:

Ryzen 5 3600

16GB RAM 3200MHz

RX 6600M

Aorus B450M Motherboard

After a system update on my Redmi Pad 2, both the network latency and decoding latency spiked drastically, even on my local network. (I did find out that switching to the H.264 codec brings the decoding latency back to the original 12-15ms).

Can anyone help me fix this?


r/MoonlightStreaming 1d ago

Just add a boss key in Moonlight for PC.

Post image
7 Upvotes

Anyone interested?


r/MoonlightStreaming 1d ago

Messages from VoidLink Main Dev

47 Upvotes

Ever since being shadowbanned, I have been hoping to find a way to interact with users on this platform. It has been a while since the last post was shared on Reddit through community contributor u/nokerb, and I have some updates and news that I would like to share with VoidLink streaming users.

- Apple is deprecating iOS 12, iOS 13, and iOS 14. Since release, VoidLink has maintained the same system compatibility as moonlight-iOS, meaning support for iOS 12. However, later this year and next spring, possibly even earlier, VoidLink may have to drop support for iOS 12 through iOS 14. The situation is as follows:

Please note, however, that does not mean moonlight-iOS will also be forced to raise its minimum system requirement. On the contrary, I believe moonlight-iOS will not face this issue.

VoidLink has recently received several major updates, and I hope users can upgrade and try them as soon as possible:

- Global controller navigation that covers more than 95% of operations for gamepad streamers. I specifically made compatibility adaptations for this feature across iOS 13 through iOS 27.

- High-performance frame generation streaming implemented through an iOS 26+ system API. In testing, an iPhone 13 Pro with the A15 chip running iOS 27 can achieve 60 -> 120 FPS frame generation streaming with intermediate frames at 1344×624, with native HDR support.

- DualSense controller support completed together with Sunshine-Foundation, including adaptive triggers, haptic feedback, touchpad passthrough, and motion sensor passthrough. Although the haptic vibration experience cannot fully match DualSense USB passthrough directly to a PC, it is still better than traditional rumble. You may also want to try setting the Haptic Engine to Built-in. The iPhone’s own vibration motor might be a pleasant surprise.
Special thanks to Sunshine-Foundation for their strong support. In fact, I have long been a community member and important partner of Sunshine-Foundation.

- Thanks to chrisnch@GitHub for decoding the private vibration protocol of the GameSir G8+ MFi controller and contributing a PR to the VoidLink project. The G8+ MFi is one of the few low-latency USB-C direct-connected telescopic controllers available for iOS, with a joystick polling rate between 250 and 330 Hz. Interestingly, GameSir’s official controller testing app requires Bluetooth to make this controller vibrate, while VoidLink only needs a direct USB-C connection.

- Regarding tvOS, I have heard the community’s feedback. I will be doing some related experiments and evaluations soon.

Finally, the previous post about VoidLink’s performance breakthrough:

https://www.reddit.com/r/MoonlightStreaming/comments/1rwptkg/voidlink_has_announced_a_performance_breakthrough/

led to some debate, and even some seemingly unpleasant skepticism, especially around the question of how streaming performance could possibly improve without Metal rendering. I would like to respond to that here:

- Why “standard rendering” matters:

Metal rendering certainly has excellent performance, but HDR rendering with Metal requires developers to implement custom shaders, and it cannot fully reproduce the HDR accuracy of Apple’s standard video processing pipeline. If you know how much effort many third-party projects, such as mpv-player/mpv, have spent studying Apple’s HDR tone mapping without being able to master it, it becomes easier to understand why Apple’s black-box standard video pipeline is an important asset for streaming.
What VoidLink does is significantly improve streaming smoothness and performance without giving up that asset.

Once again, thanks to u/andygrundman and u/mesnigan. Without their earlier work, I would not have been able to complete this improvement.

- This time, I prepared an even crazier video demonstration:

120 FPS Game Streaming for 17 Minutes Straight on iPad Pro 2018 (A12X SoC)

https://youtu.be/vHUg0ikPZvs?si=HK7gPFUUvl9-DD_m

This video was recorded using an iPhone camera in 120 FPS slow motion. Since YouTube only supports uploading and playing videos at up to 60 FPS, I set the video to play at 0.5x speed, starting from 00:43, so that every frame of the entire streaming session can be preserved.

During the 17-minute 2388×1668@120 FPS SDR game streaming session, aside from occasional minor stutters caused by game-rendering FPS drops shown by RTSS in the top-left corner, the video is almost completely smooth. For the A12X, an 8-year-old SoC, I think this can reasonably be called a miracle.

If you are interested in examining the streaming smoothness through this YouTube video, please avoid playing other videos at the same time, and make sure to watch it in fullscreen at 60 FPS.


r/MoonlightStreaming 1d ago

Tablet para moonlight barata

3 Upvotes

Que tablets baratas recomiendan para usar con moonlight (apollo/artemis para ser exactos). Busco que sea de 8 pulgadas más o menos para usar con un joystick plegable.

Por ahora me plantee la Samsung A11 o la Alldocube 60 mini turbo

Me preocupa más que nada el tiempo de decodificación de estás.

Alguno que las tengo o haya tenido y probado que tal va, le agradezco su experiencias


r/MoonlightStreaming 22h ago

Slow connection, reduce bitrate

1 Upvotes

I've been spending all morning to try and fix this error and now I'm at a complete loss.

My computer is wired through strong ethernet (1gb/s but normal uses 600-800 mb/s and my TV (Philips oled, running on android TV) is running very well on Wifi under other circumstances like streaming 4K videos through Netflix for example.

I learned that my ISP does not offer the option to connect both within the local network and I tried fixing that with the ZeroTier one option following the troubleshooting. It does seem to work a little bit, I've managed to mirror the pc screen, but I am still mostly getting a black screen saying my connection to pc is slow and to lower the bit rate.

I am using Apollo on my pc and can switch to Sunshine if that would make a difference, but otherwise I'm unsure what to do at this point.

Edit: I don't know if this was the only thing but I switched to Vibepollo and everything works fine now. I might even try and upscale the connection for sharper image. Even online games have no lag.

Shoutout to all the helpful advice for not so tech savvy people like me


r/MoonlightStreaming 23h ago

Artemis | Possible to change 3-finger tap, 4 finger tap behavior?

0 Upvotes

Basically I use have a use case for Artemis where I may frequently want to enable and disable the Artemis full keyboard. Doing this on mobile is pretty inconvenient though when you have to use 4 fingers. Is it possible to change that behavior somehow to 3 finger tap opens the full keyboard and 4 finger opens the soft keyboard instead?


r/MoonlightStreaming 23h ago

Any way to stream on older tv’s?

0 Upvotes

r/MoonlightStreaming 1d ago

iPad streaming media/audio stutters.

Enable HLS to view with audio, or disable this notification

5 Upvotes

I have been using Moonlight/Sunshine to stream from my PC to my iPad Air with no issue for 2 months. But yesterday for seemingly no reason I started getting these weird media lags.

The moment my iPad connects with Moonlight, the media/videos/twitch streams on my PC just stop and stutter the entire time it's connected. The audio also turns into an almost underwater constant stutter. The video gives you an idea of what it sounds like.

I've read a few different threads and checked on their discord, but no luck. I've tried

Turning off Bluetooth.

Turning off location.

Turning off airdrop.

Updating and rolling back Sunshine.

Rebooting.

Going into my router and changing the wifi channel to 149.

Nothing has worked for me.

Is there some kind of fix that I'm overlooking?

I don't understand the sudden change.

Any guidance would be appreciated, thanks. :(


r/MoonlightStreaming 1d ago

Consistent frame stutter on moonlight using MacBook M1 Pro

Enable HLS to view with audio, or disable this notification

5 Upvotes

FIXED: I turned off Airdrop receiving and it immediately fixed the stuttering. I guess AirDrop is constantly pinging every half-second in the background which causes the stutter.

When I connect to my PC via my MacBook Air M1 via Apollo I’m consistently getting this weird frame stutter every half-second.

I’ve tried:

turning off promotion on the MacBook, limiting it to 60fps on both the pc and MacBook instead of 120

turning on and off v sync, turning off g sync

Setting identical resolutions

using different codecs (h264, h265)

Using windowed vs fullscreen

Trying artemis instead of moonlight

Different bitrates both low & high

Ethernet in host pc

I have gigabit internet and have done remote streaming flawlessly in the past on other devices so idk whats going on

Pc specs: RTX 5070, Ryzen 9 9600x, 16GB DDR5 ram