Compared, with sources
Punktfunk next to Sunshine and its three best-known forks. Every cell points at the project's own README, docs or release notes. Every number on this page comes with the command that reproduces it.
How to read this page
All five projects were read on 2026-09-11. The forks ship a copy of Sunshine's docs that describes platforms they do not build, so a fork's row cites its README and release notes, never the inherited docs. Nothing here is a latency figure from a private test rig: those are not reproducible by you, so they are not on this page.
| Feature | Punktfunkunom | SunshineLizardByte | ApolloClassicOldSong | VibeshineNonary | Sunshine-FoundationAlkaidLab |
|---|---|---|---|---|---|
| Project | |||||
| Lineage | own code base, Rust27 | the original, C++7 | fork of Sunshine, C++8 | fork of Sunshine, C++18 | fork of Sunshine, C++21 |
| Licence | MIT or Apache-2.0; the Windows host bundles FFmpeg (LGPL)27 | GPL-3.07 | GPL-3.08 | GPL-3.018 | GPL-3.021 |
| Latest release | v0.35.0, 2026-09-0850 | v2026.906.222525, 2026-09-064 | v0.4.6, 2025-07-13; last commit 2026-05-2111 | 1.18.4-stable.4, 2026-09-1017 | v2026.911, 2026-09-1123 |
| Host binaries shipped for | Linux (Debian/Ubuntu, Fedora, Arch, Bazzite, NixOS, SteamOS), Windows 11 x6428 | Windows x64 + ARM64, Linux, macOS, FreeBSD, Docker4,3 | Windows only11 | Windows, Arch/CachyOS, SteamOS17 | Windows only23,24 |
| Windows floor | Windows 11 22H2, x6440 | Windows 113 | Windows 108 | Windows 10; virtual display defaults off there16 | Windows 10 22H221 |
| Linux host | Wayland only: KDE, GNOME, gamescope, Sway, Hyprland27,34 | X11 and Wayland2 | in the source, no builds8,11 | Arch/CachyOS repo; KDE for managed displays16,17 | 24 |
| macOS host | client only, by design35 | no gamepad emulation there1 | in the source, no builds11 | 17 | 24 |
| Protocol and security | |||||
| Protocol | own QUIC protocol; Moonlight/GameStream as opt-in compatibility27,30 | Moonlight/GameStream1 | Moonlight, on a forked wire library13,8 | Moonlight, plus WebRTC for the browser17 | Moonlight, on a forked wire library21 |
| Video encryption on the LAN | always, AES-GCM or ChaCha2027,30 | opt-in; LAN default off2 | inherited from Sunshine12 | inherited from Sunshine16 | inherited from Sunshine22 |
| Key exchange | TLS 1.3 with hybrid X25519MLKEM768 first45 | GameStream pairing: RSA certificates, PIN-derived AES key31 | inherited from Sunshine12 | inherited from Sunshine16 | inherited from Sunshine22 |
| Pairing | SPAKE2 PIN, or approve in the console41 | PIN in the web UI3 | PIN, then per-client permissions9 | PIN16 | PIN or QR code20 |
| Per-device access rights | full control, controller only, view only, or custom toggles per device51 | 2 | list/view/launch, clipboard, per input type9 | scoped API tokens15 | per-client touch and gamepad profiles23 |
| Web UI login | password, console on port 4799229 | HTTP basic auth + CSRF token5 | inherited from Sunshine12 | session tokens, remember-me, API tokens15 | basic auth, hardened origin checks23 |
| Video | |||||
| Codecs | H.264, HEVC, AV1, PyroWave27,43 | H.264, HEVC, AV12 | H.264, HEVC, AV112 | H.264, HEVC, AV116 | H.264, HEVC, AV122 |
| 4:4:4 chroma | HEVC, native protocol only34 | 6 | 12 | 16 | 22 |
| 10-bit / HDR | HDR10: Windows; Linux on gamescope and GNOME 5033,35 | HDR102 | HDR10 on the virtual display; README advises against HDR8 | HDR10, RTX HDR, Vulkan HDR layer on Linux16,17 | HDR10 + HLG, HDR10+, HDR Vivid, Dolby Vision 8.1/8.4, per-frame metadata21,23 |
| Encoders on Windows | NVENC, AMF, QSV, Media Foundation, PyroWave; software H.26440,43 | NVENC, AMF, QSV, Media Foundation, software1 | NVENC, AMF, QSV, software12 | NVENC, AMF (FFmpeg path default), QSV, software16,17 | NVENC SDK 13, AMF, QSV, software; Vulkan experimental20 |
| Encoders on Linux | NVENC, VAAPI, Vulkan Video, PyroWave; software H.26427 | NVENC, VAAPI, Vulkan Video, software1 | no Linux builds11 | NVENC, VAAPI, Vulkan Video, software16 | no Linux builds24 |
| Custom low-latency codec | PyroWave, intra-only wavelet, opt-in43 | 2 | 12 | 16 | 22 |
| Forward error correction | GF(2¹⁶) Reed–Solomon, up to 65535 shards per block, adaptive44,27 | Reed–Solomon per frame, fixed fec_percentage2 | inherited from Sunshine12 | inherited from Sunshine16 | inherited from Sunshine22 |
| Capture and displays | |||||
| Windows capture | frames pushed from its own display driver, no screen scraping27 | DXGI; WGC beta, not in service mode1,2 | DXGI; WGC beta12 | WGC in service mode, auto-switch for UAC and login15,16 | DXGI/WGC; zero-copy from its display driver20 |
| Linux capture | PipeWire and compositor virtual outputs27 | KMS, X11, wlroots, XDG portal, KWin, NvFBC1,2 | no Linux builds11 | own DRM module, KWin, portal, wlroots, X11, NvFBC16 | no Linux builds24 |
| Virtual display, Windows | own signed driver, works on the lock screen27 | display configuration only, no driver2 | SudoVDA, bundled8 | own signed driver; SudoVDA as rollback15 | ZakoVDD, bundled20,26 |
| Virtual display, Linux | via the compositor: KDE, GNOME, gamescope, Sway, Hyprland32,27 | 2 | planned8 | own kernel module, KDE only, four connectors16 | 24 |
| Display at the client's exact mode | one per client, resolution and refresh27,32 | resizes an existing display; needs 'Optimize game settings'2 | fixed identity per client8 | per client by default16 | per client, bound by GUID20 |
| Several clients at once | Linux: each on its own display; Windows: one at a time32 | multiple instances 'not advised'3 | one instance per client10 | up to four remote-monitor sessions17 | per-client display sessions20,23 |
| Game survives a disconnect | keep-alive policy per host, display and game stay up32 | app keeps running; display config reverts2 | virtual display removed when the app quits8 | remote-monitor identity kept for resume16 | display created and destroyed with the stream20 |
| Audio and input | |||||
| Surround audio | 5.1/7.1 on request, resolved by the host; lossless plane up to 7.134,53 | via Steam Streaming Speakers driver2 | inherited from Sunshine12 | inherited from Sunshine16 | up to 7.1.4, Opus DRED20 |
| Lossless audio | 96 kHz / 24-bit on the native plane34 | Opus, as the Moonlight protocol carries it34 | Opus34 | Opus34 | Opus, with DRED redundancy20 |
| Microphone to the host | native clients; not tvOS34 | 2 | 12 | 16 | with their client forks; multi-client mixing21,22 |
| Gamepad emulation, Windows | own gamepad drivers in the installer27 | Virtual HID Driver needs a paid licence; ViGEmBus is end-of-life2 | ViGEmBus13 | ViGEmBus / libvirtualgamepad17 | ViGEmBus + DualSense sidecar23 |
| Rumble, motion, adaptive triggers | DualSense, DualShock 4, Switch Pro, Steam Controller46 | motion and touchpad as DS42 | rumble can be disabled11 | DualSense adaptive triggers17 | DualSense haptics and adaptive triggers23 |
| Pen and touch | three touch modes, full-fidelity stylus52 | native_pen_touch2 | 12 | 16 | virtual USB HID touch, per-client profiles23 |
| Shared clipboard | text; Linux client side still a stub36,34 | 2 | with per-client permissions8,9 | 16 | text and image23 |
| File transfer | wire format exists, no client offers files yet34,35 | 2 | 12 | 16 | read-only directory mapping with their client fork25 |
| USB device forwarding | VirtualHere plugin38 | 2 | 12 | 16 | USB/IP bridge, off by default23 |
| Library, clients, network | |||||
| Game library | launchers via plugins from the index, custom titles in the console38,49 | manual, apps.json via the web UI2,3 | manual, plus a profile manager tool11 | Playnite, Steam and Lutris auto-sync15,16 | manual, artwork search21 |
| Native clients by the project | iOS/iPadOS/tvOS, macOS, Android + TV, Windows, Linux, Steam Deck28 | any Moonlight client1 | Artemis, Android only8,14 | a Moonlight PC fork with VRR17 | Moonlight forks for PC, Android, iOS, HarmonyOS20 |
| Stock Moonlight clients | once GameStream compat is on30 | 1 | intends to diverge over time8 | 15 | some features need their forks21 |
| Browser client | own repo, not on the download page yet27,28 | Moonlight web clients1 | 8 | served from its own web UI over WebRTC17 | 21 |
| Wake-on-LAN | host advertises the MAC and checks the NIC is armed; clients wake it37 | Moonlight client feature only2 | inherited from Sunshine12 | inherited from Sunshine16 | inherited from Sunshine22 |
| Away from home | Tailscale sharing, Porthole, or port forwarding; no relay42 | UPnP opt-in or port forwarding; no relay2 | inherited from Sunshine12 | same; WebRTC works behind Traefik/Cloudflare16,17 | inherited from Sunshine22 |
| Accounts or cloud required | 27 | 1 | 8 | 15 | 21 |
Numbers you can reproduce
Run each command in a clean checkout of the Punktfunk monorepo at commit 0bbf1e5c. The value is what it printed on the day the page was written; the command is what counts.
Packet loss, recovered frames
Punktfunk ships a loss harness: it pushes 50 frames of 100 kB through the real error-correction path with 25 % parity while dropping every N-th packet. No network, no GPU, no randomness, so the table is identical on every machine.
| Packets dropped | Loss | GF(2⁸) | GF(2¹⁶) |
|---|---|---|---|
| none | 0.0 % | 50/50 | 50/50 |
| 1/32 | 3.1 % | 50/50 | 50/50 |
| 1/16 | 6.2 % | 50/50 | 50/50 |
| 1/8 | 12.5 % | 50/50 | 50/50 |
| 1/6 | 16.7 % | 50/50 | 50/50 |
| 1/4 | 25.0 % | 0/50 | 0/50 |
| 1/3 | 33.3 % | 0/50 | 0/50 |
| 1/2 | 50.0 % | 0/50 | 0/50 |
Both fields recover every frame while the loss stays under the parity budget and none once it exceeds it. The difference between them is block size, not recovery rate: GF(2⁸) codes are limited to 255 shards per block, GF(2¹⁶) to 65535, which is what lets a 5120×1440 frame at 240 Hz stay in one block. The harness prints a second table on partial delivery under random loss.
The protocol pipeline also has a Criterion benchmark that runs a whole frame through error correction, encryption, packetising and back. Its output depends on your CPU, so no result is printed here. Run it and compare your own numbers:
Why there is no latency number on this page
Punktfunk has no photon-to-photon latency measurement anyone can repeat: the probe in the repository is a stub, and the figures in the design notes were taken on named private machines, mostly over loopback. A number without its rig, codec, resolution and instrument is a guess with a decimal point, so none is printed here.
Neither do the other four. Sunshine's performance page is two sentences with no figures; Apollo publishes none; Vibeshine's only number is a fixed bug that capped Windows streams near 64 fps; Sunshine-Foundation's only figure is a cache that cuts encoder probing from 26 s to under 100 ms.
What you can do is measure your own link. Every Punktfunk client has a stats overlay with the same four points, capture, received, decoded, displayed, and the host records those samples for export. One caveat from the docs applies to any comparison you make: Moonlight's overlay has no end-to-end line, so never set Punktfunk's end-to-end number against a single Moonlight figure.
How the stats overlay measuresWhere the others are ahead
The matrix is fair only if this list is too.
- Sunshine hosts on macOS, FreeBSD, X11 desktops and Windows 10. Punktfunk needs Wayland on Linux and Windows 11 22H2 on Windows, and has no macOS host by design.
- Sunshine has years of field use, a community of tens of thousands, and packages for far more distributions.
- Sunshine-Foundation's HDR pipeline goes further: HLG alongside HDR10, HDR10+, HDR Vivid, Dolby Vision profiles 8.1 and 8.4, and per-frame light-level metadata. Punktfunk does HDR10 on Windows and on gamescope and GNOME 50 on Linux.
- Sunshine-Foundation forwards USB devices and shares folders with its client forks. Punktfunk has a VirtualHere plugin and a file-transfer wire format no client offers yet.
- Vibeshine streams to a browser from its own web UI over WebRTC, syncs Playnite, Steam and Lutris without extra plugins, and drives RTSS, MangoHud and Lossless Scaling for frame pacing.
- Punktfunk's software encoder is H.264 only, so a host with no usable GPU streams fewer codecs than Sunshine's software path.
Punktfunk runs next to any of these hosts while you try it. One port to move.
Sources
All read on 2026-09-11. Where a claim is about a fork, it cites that fork's own README or release notes.
- Sunshine README
- Sunshine docs/configuration.md
- Sunshine docs/getting_started.md
- Sunshine releases
- Sunshine docs/api.md
- Sunshine src/video.h
- Sunshine repository
- Apollo README
- Apollo wiki: Permission System
- Apollo wiki: multiple instances
- Apollo releases
- Apollo docs/configuration.md
- Apollo .gitmodules
- Artemis (moonlight-android fork)
- Vibeshine README
- Vibeshine docs/configuration.md
- Vibeshine releases
- Vibeshine repository (GitHub parent: LizardByte/Sunshine)
- Vibepollo repository (GitHub parent: ClassicOldSong/Apollo)
- Sunshine-Foundation README (zh-CN)
- Sunshine-Foundation README.en.md
- Sunshine-Foundation docs/configuration.md
- Sunshine-Foundation releases
- Sunshine-Foundation CI (.github/workflows/main.yml)
- Sunshine-Foundation directory-mapping design
- ZakoVDD
- Punktfunk README
- Punktfunk data/platforms.json
- Docs: Switching from Sunshine
- Docs: Moonlight
- Docs: Security
- Docs: Virtual displays
- Docs: HDR
- Docs: Support matrix
- Docs: Roadmap
- Docs: Clipboard
- Docs: Wake-on-LAN
- Docs: Plugins
- Docs: Stats overlay
- Docs: Requirements
- Docs: Pairing
- Docs: Friends over the internet
- Docs: PyroWave
- Punktfunk GF(2¹⁶) FEC (crates/punktfunk-core/src/fec/gf16.rs)
- Punktfunk post-quantum key-exchange test (crates/punktfunk-host/src/gamestream/cert.rs)
- Punktfunk input injection (crates/pf-inject/src/inject)
- Punktfunk loss harness (tools/loss-harness)
- Punktfunk pipeline bench (scripts/bench)
- Punktfunk plugin index
- Punktfunk releases
- Docs: Access levels
- Docs: Mouse, touch and pen
- Docs: Client settings