Open-source project
moonlight-stream/moonlight-qt avatar
moonlight-stream/moonlight-qt

Moonlight Qt: a GameStream client for Windows, Mac, Linux and Steam Link

GameStream client for PCs (Windows, Mac, Linux, and Steam Link)

18,830 stars1,350 forksC++GPL-3.0

At a glance

What is it?
Moonlight Qt is the desktop client for NVIDIA GameStream and Sunshine, built in C++ with Qt and SDL2. It handles hardware decoding, HDR, 7.1 audio and up to 16 gamepads, and it ships as installers, Snap, Flatpak and Debian packages. The catch is that the host side is the hard part.
Who is it for?
Adopt Moonlight Qt if you already have a GameStream-capable NVIDIA host or a Sunshine host and you want a desktop client that decodes in hardware and supports HDR, 7.1 audio and 16 gamepads. Do not adopt it if you expect it to provide the host: Moonlight is the client half, and the README points at Sunshine for non-NVIDIA setups.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What Moonlight Qt is, and who it is for

Moonlight Qt is a client. It runs on your desk, connects to a gaming PC elsewhere on the network, and streams that PC's video and audio to your screen while sending your input back. The README describes it as "an open source PC client for NVIDIA GameStream and Sunshine". That sentence is the whole product boundary: Moonlight does not host games, and it does not encode anything.

The intended user is someone with a gaming PC that already exposes GameStream or Sunshine, and a second machine that is weaker than the first. A laptop with integrated graphics, a Mac, a Steam Link box, a Raspberry Pi 4 or 5, or an ARM single-board computer. The client does the decoding, which is why hardware acceleration matters so much here. On a machine that can only decode in software, the stream will not keep up at high resolution.

There are mobile clients in the same family, moonlight-android and moonlight-ios, and the README links to both. If your target is a phone or tablet, Moonlight Qt is the wrong repository. If your target is a desktop or a set-top box running Linux, it is the right one.

How streaming works inside Moonlight Qt

The repository layout tells you most of the architecture. moonlight-common-c is a submodule and holds the shared protocol code that the mobile clients also use. qmdnsengine is a submodule for mDNS discovery, which is how the client finds hosts on the local network without you typing an IP address. h264bitstream is another submodule, used for parsing the H.264 stream. The app/ directory holds the Qt application itself, and the top-level moonlight-qt.pro is a qmake project file, not CMake.

The data flow is a decode-and-present pipeline. Video arrives from the host, is decoded using the platform's hardware decoder (the README claims hardware accelerated video decoding on Windows, Mac and Linux), and is then rendered. Codec support covers H.264, HEVC and AV1, with AV1 requiring Sunshine and a supported host GPU. YUV 4:4:4 is Sunshine only, which matters for text sharpness in remote desktop use. HDR streaming is supported, and audio goes up to 7.1 surround.

Input goes the other way. Gamepads are supported with force feedback and motion controls for up to 16 players. There are two mouse modes: pointer capture for games, and direct mouse control for remote desktop. System-wide keyboard shortcuts such as Alt+Tab can be passed through to the host, which is the difference between a stream that feels like a remote screen and one that swallows your window manager shortcuts.

One build detail is worth flagging because it constrains packaging. Building the Vulkan renderer requires libplacebo at version v7.349.0 or later and FFmpeg 6.1 or later. On distributions that ship older libplacebo, that renderer is simply not available to you.

Installing Moonlight Qt and connecting to a host

You do not need to build it. The README's Downloads section points at prebuilt releases for Windows, macOS and Steam Link, a Snap for Ubuntu-based distributions, a Flatpak for other Linux distributions, and an AppImage. There are also Debian packages for generic ARM 32-bit and 64-bit, and experimental RISC-V Debian packages. The Flatpak identifier is com.moonlight_stream.Moonlight.

On a Linux distribution that is not Ubuntu-based, the Flatpak is the documented path:

bash
flatpak install flathub com.moonlight_stream.Moonlight

On Ubuntu-based systems the README lists a Snap instead:

bash
sudo snap install moonlight

After launching, the client uses mDNS to find hosts on the same network. If your host does not appear, the README does not document a manual fallback in the text available here, so the discovery step is the first thing to check when nothing shows up. Once a host is listed, you pair it, which normally means entering a code shown on both sides, and then you pick a resolution, framerate and bitrate for the stream.

If you do need to build from source, the setup is qmake-based and the submodules are mandatory. The README's build steps start with:

bash
git submodule update --init --recursive

On Windows and macOS there is an additional dependency step, setup-deps.ps1 on Windows and setup-deps.py on macOS, and the README says to repeat both steps each time you pull new changes. On Linux you need Qt 6 (Qt 5.12 or later also works, replacing qmake6 with qmake), GCC or Clang, and FFmpeg 4.0 or later. The Debian and Ubuntu package list in the README is long, and the Qt 6 set includes qt6-base-dev, qt6-declarative-dev, qt6-wayland and several qml6 modules. The Windows requirements are stricter than most: Qt 6.11 or later, Visual Studio 2026, and MSVC specifically, since MinGW is not supported.

Where Moonlight Qt runs into a wall

The Steam Link build is the clearest example of a hard limit, and the README states it plainly. On that hardware the maximum resolution is 1080p (1920x1080), the maximum framerate is 60 FPS, the maximum video bitrate is 40 Mbps, and HDR streaming is not supported. Those are device limits, not client limits. Building Moonlight for a Steam Link does not change them.

Codec support is conditional in a way that catches people out. AV1 requires Sunshine and a supported host GPU. YUV 4:4:4 is Sunshine only. 10-point multitouch is Sunshine only. If your host is running NVIDIA GameStream rather than Sunshine, you get the subset that GameStream supports, not the full feature list in the README.

The Vulkan renderer has a version floor: libplacebo v7.349.0 or later plus FFmpeg 6.1 or later. On a distribution with older packages, that path is closed.

There is also a scope limitation that is easy to miss. Moonlight Qt is a client, so it cannot help you if your host has no GameStream or Sunshine. There is no host component in this repository. The README's answer to that is a link to Sunshine, which is a separate project with its own installation and its own host-side requirements. Choosing Moonlight means choosing to solve the host problem separately.

Moonlight Qt against Sunshine plus a browser or another client

The most common comparison is between Moonlight Qt and the mobile Moonlight clients, but those are not alternatives for a desktop user. The meaningful alternative is a different client talking to the same Sunshine host.

Sunshine ships its own web interface for administration, and the host can be driven from a browser for configuration. That is not a streaming client in the same sense: it is a management surface. The difference in approach is that Moonlight Qt is a native application with hardware decoding, HDR, 7.1 audio, gamepad force feedback and motion controls, and pointer capture. A browser-based session does not give you those, because it is not built around a native decode pipeline.

The other branch point is the host itself. NVIDIA GameStream and Sunshine are two different host implementations, and the README treats Sunshine as the one that unlocks the newer features: AV1, YUV 4:4:4 and 10-point multitouch. If you are choosing a host today, that split is the decision, not the client.

Maintenance, licensing and build cost

The repository is not archived, and the last push was on 2026-09-18. The most recent release listed is v6.1.0 from 2024-09-17, with v6.0.1 and v6.0.0 before it in 2024. So the release cadence is slower than the commit activity, and there are nightly builds at nightly.link for anyone who needs changes that have not been tagged.

The licence is GPL-3.0. That is a copyleft licence, and it applies to the client. If you are shipping Moonlight Qt inside a product, or linking it into a larger application, the GPL-3.0 obligations are the thing to read before you plan anything. This is not legal advice, and the LICENSE file in the repository is the authoritative text.

Upgrade cost depends on how you installed it. Snap, Flatpak and the release installers update through their own channels. A source build is heavier: the README says to re-run the submodule update and, on Windows and macOS, setup-deps.ps1 or setup-deps.py every time you pull changes. On Linux, a Qt major version bump can invalidate your package set, and the Vulkan renderer additionally depends on libplacebo and FFmpeg versions that your distribution may not have.

Editorial conclusion

Adopt Moonlight Qt if you already have a GameStream-capable NVIDIA host or a Sunshine host and you want a desktop client that decodes in hardware and supports HDR, 7.1 audio and 16 gamepads. Do not adopt it if you expect it to provide the host: Moonlight is the client half, and the README points at Sunshine for non-NVIDIA setups. Before committing, verify three things: that your host is reachable on the network, that your GPU and driver support the codec you intend to stream, and that your platform is covered by the download list (Windows, macOS, Steam Link, Ubuntu via Snap, other Linux via Flatpak, AppImage, Raspberry Pi 4 and 5, generic ARM, RISC-V, or NVIDIA Jetson and Switch on Ubuntu L4T). If your target is Steam Link hardware, check the 1080p, 60 FPS, 40 Mbps and no-HDR limits before you plan around it. For AV1 you additionally need Sunshine and a host GPU that supports it, and for YUV 4:4:4 and 10-point multitouch you need Sunshine as well.

Frequently asked questions

What is Moonlight Qt?

It is the open source PC client for NVIDIA GameStream and Sunshine, written in C++ with Qt and SDL2. It runs on Windows, Mac, Linux and Steam Link, and it decodes the stream in hardware on Windows, Mac and Linux.

Is Moonlight only for Nvidia?

No. The README describes Moonlight Qt as a client for NVIDIA GameStream and for Sunshine, which is a separate open source host. Some features, including AV1, YUV 4:4:4 and 10-point multitouch, require Sunshine and a supported host GPU.

Is Moonlight on Nintendo Switch?

The README lists a download for Nintendo Switch under Ubuntu L4T, alongside NVIDIA Jetson, and links to a wiki page for installing Moonlight Qt on Linux4Tegra. The mobile clients for Android and iOS are separate repositories.

Is the Moonlight app legal?

The available documentation does not address legality. What it does state is that Moonlight Qt is open source and licensed under GPL-3.0, with the LICENSE file in the repository.

What is the alternative to Moonlight Qt?

For the same Sunshine host, Sunshine's own web interface can be used for administration, but it is a management surface rather than a native streaming client with hardware decoding, HDR and gamepad support. The other choice is on the host side, between NVIDIA GameStream and Sunshine.

Official sources

  1. Issues
  2. License: GPL-3.0
  3. moonlight-stream/moonlight-qt on GitHub
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/moonlight-stream-moonlight-qt.svg)](https://hysenlabs.com/projects/moonlight-stream-moonlight-qt)