Stream your PC games and desktop to a laptop, TV, phone or handheld.
A free Windows host built around AMD Radeon, ready for Moonlight and Sunshine-compatible clients.
Download 2.2.10 · Get started · Website · Docs · Android client
Windows x64 · Free and open source · Formerly Butterpollo
Watch the full demo → · 60 seconds · 1080p · 60 fps
- More room for your game. Frame copies and colour conversion run on Radeon compute queues alongside your game's graphics work, with AMD's encoder driven natively.
- See every detail. H.264, HEVC and AV1 streaming, with 10-bit HDR through HEVC and AV1 on supported hardware.
- Full colour with PyroWave. 10-bit HDR 4:4:4 keeps fine coloured text and edges crisp. Use Rubylight Android or another PyroWave-capable client over a fast local network.
- A screen for each device. Virtual displays match your client's resolution and refresh rate, with HDR and your monitor layout restored after the stream.
- Your library, ready to play. Steam and Playnite sync, per-app settings, RTSS frame limits and Lossless Scaling integration.
- Your controls come with you. Controllers, keyboard, mouse, touch and pen, plus surround audio and microphone passthrough with compatible clients.
- Everything in one console. Pair devices, manage games and watch frame rate, bitrate and encoder timing from your browser. Stream from the lock screen or a headless PC, too.
Rubylight works with Moonlight and other Sunshine-compatible clients across PCs, phones, tablets, TVs, consoles and handhelds. Available codecs, HDR and extra controls depend on your hardware and client. NVIDIA NVENC, Intel Quick Sync and software encoding are also included; Rubylight's tuning and measurements focus on Radeon.
All features → · How the frame pipeline works → · Choose your stream format →
- Install on your PC. Run
rubylight-setup-2.2.10.exefrom the release. - Open your console. Visit
https://localhost:47990on the host PC and create your local account. - Pair and play. Open Moonlight on a device on the same network, select your PC, enter its PIN in Rubylight's Devices page, then launch Desktop.
Coming from Apollo or Vibepollo? Rubylight can import your settings, paired devices and app library. After an import, sign in with your existing console account. Updates notify you first; automatic installation is opt-in.
First-stream walkthrough, portable setup and migration →
Nearly 120 fresh HDR pictures per second under GPU load. Rubylight 2.2.9 delivered 14.34 ms average picture age with HEVC and 13.65 ms with AV1, measured from rendering through local hardware decoding on an RX 7900 XT.
| Native HDR under GPU load | Average picture age | p95 picture age | Fresh pictures/s |
|---|---|---|---|
| HEVC | 14.34 ms | 16.03 ms | 119.99 |
| AV1 | 13.65 ms | 18.00 ms | 119.98 |
October 12, 2026 · Rubylight 2.2.9 · 1968×2184 native virtual HDR at 120 fps · 80 Mbps · Desktop Duplication · synthetic GPU load capped at 60 fps · each figure averages two runs' corresponding statistics.
Chart provenance: Rubylight on October 12 with a 5120×1440/240 Hz physical desktop; historical Vibepollo on October 8 with a 2560×1440/120 Hz physical desktop. Both use a 120 Hz virtual HDR source.
- Smooth on stock Moonlight over Wi-Fi. Official Moonlight 6.2.0 rendered 59.99 FPS in both 165-second 1080p60 HEVC SDR sessions on a Radeon 780M laptop, with 0.50–0.59 ms average decoding time across the two runs. Real-client results →
- Native HDR verified. 28/28 stream and timing checks passed across Desktop Duplication and Windows Graphics Capture, together with 4/4 HDR pixel checks. HDR results →
Full October 12 measurement record, settings and methods →
See the historical October 8 comparison and other dated measurements
Recorded with Rubylight rc.24 on October 8: 43–48% lower p95 picture age under game-like GPU load. In matched 120 fps HDR tests against Vibepollo 2.0, Rubylight reduced average picture age by 7.4 ms in both HEVC and AV1. The slower frames improved too: HEVC p95 fell from 37.62 to 21.56 ms, and AV1 from 36.77 to 18.96 ms.
The fixture draws a timestamped picture while a separate GPU workload simulates a game. Each cell is the mean of two runs' corresponding metrics; p95 and p99 describe the slower frames.
| Picture age under GPU load | Rubylight rc.24 | Vibepollo 2.0 |
|---|---|---|
| HEVC average / p95 / p99 | 19.61 / 21.56 / 23.10 ms | 26.96 / 37.62 / 39.25 ms |
| AV1 average / p95 / p99 | 17.15 / 18.96 / 22.18 ms | 24.53 / 36.77 / 38.05 ms |
Rubylight delivered 117–120 fresh pictures per second; Vibepollo delivered 103–118 in HEVC and 106–111 in AV1. These gains belong to this GPU and workload. With no game load at 1440p, the two hosts were effectively equal. Recorded runs and settings →
Two separate tests show where frame preparation and queueing matter:
- PyroWave processing under load: moving colour conversion to compute reduced repeat-frame processing through conversion and encoding from 5.7 to 0.55 ms at 1080p HDR 4:4:4. This component probe excludes capture, transport, decoding and display.
- An encoder at its limit: at 5120×1440 HEVC with 240 fps requested, a smaller queue cut average present-to-send time from 42.7 to 11.1 ms, while throughput stayed at 220 fps.
RX 7900 XT, October 7, 2026. Separate before/after fixtures; their timings cover different parts of the frame journey. Methods and scope.
Light at idle. An October 12, 2026 Windows Task Manager snapshot on the author's PC showed about 16.6 MB of memory for the host and service combined (13.8 MB + 2.8 MB), with 0% CPU reported for both.
From 10 ms encoding to 5 ms in 4K 60 fps, btw :) I tried it with PyroWave and it was close to native. Really impressive.
u/3stwie4 on Reddit
More from the community
Quotes from Reddit, lightly edited for typos and length. Several were written while the project was still called Butterpollo.
WTF. Runs like Butterchicken (that's where it got the original name from)
u/Closef35 on Reddit
My encoding times are actually slashed in half, which is incredible. I thought PyroWave on Vibeshine was the best I was gonna get, but my max encode would still spike to 7-8 ms at 2K 100 fps. Still below the 10 ms cutoff, but I wanted more headroom for higher quality or if a game is more demanding. My max is now 3.5 ms with the occasional pip to 5 ms every few minutes. Image quality is top notch, and combined with Nonary's work on VRR Moonlight smoothing that out, my setup has finally been something I am not itchy to improve or tweak anymore.
u/astero-dax on Reddit
Dude... What the fuck is this host? I could not believe it. It's the lowest latency I got after testing a ton of hosts. Congratulations, dude.
u/LukasSTM on Reddit
Fantastic job! Host processing latency has never been this low 🎉 Clean UI too 🔥 Well done! Thanks for your time and the effort you put into this! I'll report feedback if I find any issue.
u/Short_Dimension7967 on Reddit
Thanks. Going to try this. Edit: Runs amazing. There is a noticeable improvement in latency, and the host latency is now much better too. Edit: Switched to PyroWave on RC19. I honestly see no difference between host and client. Amazing work!
u/ChartFlashy6299 on Reddit
Running pretty good so far, no framedrops, no stutter, and a good migration from Vibepollo. And I love that it is written in Rust, one of the best optimized languages! Thank you for the work!
u/almosgeci on Reddit
| I want to… | Read |
|---|---|
| Get my first stream running | Getting started |
| Set up displays, HDR, frame limits or updates | Configuration |
| Fix pairing, capture, colour or smoothness | Troubleshooting |
| See everything it does and how fast | Features · Performance · Architecture |
| Build or integrate Rubylight | Build guide · Developer guide · API reference |
Release notes · Share your setup, games and results in Issues.
Rubylight is GPL-3.0. It began as a fork of Vibepollo, whose native AMF encoder came from the same author (#342); anything that works out here is GPL-3.0 for Vibepollo to take. Thanks to Nonary for Vibepollo, ClassicOldSong for Apollo, and LizardByte and the Sunshine contributors. The AMD encoder's low-latency defaults draw on qiin2333's work in AlkaidLab's Foundation Sunshine. PyroWave and Granite are by Themaister (MIT); the PyroWave Moonlight protocol and clients are joemossjr16's work.
License · Third-party components · Project history
Copying or building on this code? Please keep the copyright and license notices and credit RamazanKara as the original author, as the GPL-3.0 requires for notices and modifications. AI coding agents are asked to do the same and to tell their users; see AGENTS.md.
The name came from a tester's verdict: “smooth as butter.”
