Sunshine + Moonlight + Dish: the perfect cloud-gaming-at-home trio
For my money, the most underrated piece of consumer software released in the last decade is the open-source pair Sunshine and Moonlight. Together they let you stream the games on your gaming PC to literally any screen in your house: your TV, your iPad, your Steam Deck, an old Android tablet you forgot you owned. Low latency, high quality, free.
There’s one piece of the experience they leave a little awkward: the controller.
This post is about how to use Dish as the third leg of the stool. Once you’ve got all three running, you have a self-hosted cloud gaming setup that genuinely beats GeForce Now in the things that matter.
A quick recap
If you’re new to the stack:
- Sunshine runs on your gaming PC. It captures your screen and audio and broadcasts them as a low-latency video stream over your LAN.
- Moonlight runs on your TV / phone / Steam Deck / whatever. It tunes in to that broadcast and decodes it. You see your PC games on a different screen.
- Both are free, open source, beautifully maintained, and supported on basically every platform.
If you haven’t tried Sunshine + Moonlight yet, do that first. There are excellent guides on both projects’ websites. Come back when you’ve got “I’m streaming Cyberpunk to my TV” working.
The controller problem
In a typical Sunshine + Moonlight setup, the controller is plugged into whatever device is running Moonlight. If you’re streaming to a Shield TV, the Shield’s gamepad is your controller. If you’re streaming to a Steam Deck, the Deck’s built-in controls are your controller. If you’re streaming to your phone… well, hopefully you have a Bluetooth gamepad paired.
That works fine for a lot of cases. It falls apart when:
- You want to play on the TV with the controller in your lap, and the device running Moonlight is a Shield TV or a Fire TV that doesn’t have a great gamepad story.
- You want couch co-op. Moonlight forwards multiple controllers from one device, but each player has to be in front of the streaming screen and the streaming device has to be able to enumerate all the controllers.
- You want to use a phone or tablet you already own as the controller. Moonlight doesn’t really do this; it expects video and input on the same device.
Where Dish fits in
Dish solves the controller problem by decoupling input from video. You stream the video to whatever screen you like with Moonlight. You handle the controller, separately, with Dish.
The topology looks like:
gaming PC ─── (video over Moonlight) ───► your TV / Steam Deck / iPad
gaming PC ◄── (controller over Dish) ──── your phone in your hand
The video and the input are completely independent connections. Either side can drop and recover without bothering the other.
Setup
I’m going to assume you’ve got Sunshine and Moonlight working already.
1. Install Dish on your controller device
Get Dish for Android on your phone from Google Play or as a signed APK from GitHub Releases. Dish for Windows, macOS, and Linux clients (including Steam Deck) are in active development and will land in later releases. The protocol and Satellite are already designed for them, but you can’t install them as the controller today.
2. Install Satellite for Windows
Satellite is the receiver side of Dish. Get the signed SatelliteSetup.exe from the Satellite releases page and run it. It bundles ViGEmBus 1.22.0 and drops into your system tray with a small dish icon; the local web UI is at http://localhost:9877.
You can run Satellite on the same gaming PC that’s running Sunshine. They use different ports and don’t fight. (A Linux Satellite is on the roadmap; today’s V1 receiver ships on Windows only. A macOS Satellite exists as a dev build but refuses controller injection, so we don’t recommend it as a usable receiver yet.)
3. Pair
Open Dish. It auto-discovers Satellite over mDNS (with a UDP broadcast fallback). Tap the gaming PC, type the 4-digit PIN that appears in Satellite’s web UI, done. Dish remembers your PC forever.
4. Set up Moonlight to ignore the local controller
Here’s the one tweak. In Moonlight’s settings, disable controller forwarding (sometimes called “Use this device’s gamepads”). You don’t want Moonlight to also try to forward inputs from the device it’s running on. That would conflict with Dish.
5. Play
Open Moonlight, connect to Sunshine, launch the game. The video appears on your TV. Pick up your phone. Press a button on Dish. Your character moves.
Why this is better than GeForce Now
I’m a paid subscriber to a couple of the cloud gaming services, and they’re all good now in ways they weren’t five years ago. The self-hosted stack still has advantages they can’t match:
- Your library is your library. No “supported titles” list. If it runs on your PC, you can stream it.
- No queueing. Your PC is always available to you specifically.
- Mod support. Cloud gaming services sandbox the games. Sunshine streams whatever your PC is doing, including modded Skyrim or any Steam Workshop content.
- Latency. A self-hosted LAN stream is consistently 5 to 15 ms total. Cloud services are 30 to 80 ms in the best case.
- Resolution and framerate. Sunshine will happily stream 4K 120 Hz HDR if your PC and your client can keep up.
- Free. Forever. No subscription that quietly raises its price.
Couch co-op specifically
This is where Dish shines hardest.
Plug a couple of Android phones into Dish, pair each one to the same Satellite for Windows, and you’ve got a 4-player couch co-op setup with zero hardware investment beyond what’s already in everyone’s pockets. Moonlight handles the video on the TV. Each player has their own Dish and their own virtual Xbox 360 pad. Cuphead, Streets of Rage 4, Overcooked, they all just work.
Try setting that up with Bluetooth and four mismatched controllers. We’ll wait.
Common pitfalls
- Use 5 GHz Wi-Fi for both Moonlight and Dish. 2.4 GHz will work but you’ll feel it. 5 GHz is night and day. 6 GHz (Wi-Fi 6E) is even better.
- Wire your gaming PC. Keep your gaming PC on Ethernet. Save Wi-Fi airtime for the clients.
- Disable Moonlight’s controller forwarding. Otherwise Moonlight and Dish will both try to be the controller and the game will get duplicate inputs.
- Power-save on Android. Some phones throttle outbound packets when the screen has been static. Dish counters this with a 200 ms heartbeat, but if your phone is very aggressive, exempt Dish from battery optimization in Android settings.
What’s next
If you’ve made it this far, you’ve got a self-hosted gaming setup that frankly nobody else in your friend group has. Tell them about it. Or don’t, and quietly enjoy your single-digit-millisecond couch co-op.
Want to dig further?
- The latency deep-dive, exactly where the milliseconds go
- How encryption works on the Dish wire
- Why we named these things “Dish” and “Satellite”, a love letter to the whole broadcasting metaphor
If this stack made your gaming setup better, donations keep all three projects (well, our part of them) going.
Gostou do que está lendo?
Dish e Satellite são gratuitos e de código aberto. As doações garantem que continuem assim.