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.

YesPartly, see noteNoSuperscripts point at the sources at the end of the page.
FeaturePunktfunkunomSunshineLizardByteApolloClassicOldSongVibeshineNonarySunshine-FoundationAlkaidLab
Project
Lineageown code base, Rust27the original, C++7fork of Sunshine, C++8fork of Sunshine, C++18fork of Sunshine, C++21
LicenceMIT or Apache-2.0; the Windows host bundles FFmpeg (LGPL)27GPL-3.07GPL-3.08GPL-3.018GPL-3.021
Latest releasev0.35.0, 2026-09-0850v2026.906.222525, 2026-09-064v0.4.6, 2025-07-13; last commit 2026-05-21111.18.4-stable.4, 2026-09-1017v2026.911, 2026-09-1123
Host binaries shipped forLinux (Debian/Ubuntu, Fedora, Arch, Bazzite, NixOS, SteamOS), Windows 11 x6428Windows x64 + ARM64, Linux, macOS, FreeBSD, Docker4,3Windows only11Windows, Arch/CachyOS, SteamOS17Windows only23,24
Windows floorWindows 11 22H2, x6440Windows 113Windows 108Windows 10; virtual display defaults off there16Windows 10 22H221
Linux hostWayland only: KDE, GNOME, gamescope, Sway, Hyprland27,34X11 and Wayland2in the source, no builds8,11Arch/CachyOS repo; KDE for managed displays16,1724
macOS hostclient only, by design35no gamepad emulation there1in the source, no builds111724
Protocol and security
Protocolown QUIC protocol; Moonlight/GameStream as opt-in compatibility27,30Moonlight/GameStream1Moonlight, on a forked wire library13,8Moonlight, plus WebRTC for the browser17Moonlight, on a forked wire library21
Video encryption on the LANalways, AES-GCM or ChaCha2027,30opt-in; LAN default off2inherited from Sunshine12inherited from Sunshine16inherited from Sunshine22
Key exchangeTLS 1.3 with hybrid X25519MLKEM768 first45GameStream pairing: RSA certificates, PIN-derived AES key31inherited from Sunshine12inherited from Sunshine16inherited from Sunshine22
PairingSPAKE2 PIN, or approve in the console41PIN in the web UI3PIN, then per-client permissions9PIN16PIN or QR code20
Per-device access rightsfull control, controller only, view only, or custom toggles per device512list/view/launch, clipboard, per input type9scoped API tokens15per-client touch and gamepad profiles23
Web UI loginpassword, console on port 4799229HTTP basic auth + CSRF token5inherited from Sunshine12session tokens, remember-me, API tokens15basic auth, hardened origin checks23
Video
CodecsH.264, HEVC, AV1, PyroWave27,43H.264, HEVC, AV12H.264, HEVC, AV112H.264, HEVC, AV116H.264, HEVC, AV122
4:4:4 chromaHEVC, native protocol only346121622
10-bit / HDRHDR10: Windows; Linux on gamescope and GNOME 5033,35HDR102HDR10 on the virtual display; README advises against HDR8HDR10, RTX HDR, Vulkan HDR layer on Linux16,17HDR10 + HLG, HDR10+, HDR Vivid, Dolby Vision 8.1/8.4, per-frame metadata21,23
Encoders on WindowsNVENC, AMF, QSV, Media Foundation, PyroWave; software H.26440,43NVENC, AMF, QSV, Media Foundation, software1NVENC, AMF, QSV, software12NVENC, AMF (FFmpeg path default), QSV, software16,17NVENC SDK 13, AMF, QSV, software; Vulkan experimental20
Encoders on LinuxNVENC, VAAPI, Vulkan Video, PyroWave; software H.26427NVENC, VAAPI, Vulkan Video, software1no Linux builds11NVENC, VAAPI, Vulkan Video, software16no Linux builds24
Custom low-latency codecPyroWave, intra-only wavelet, opt-in432121622
Forward error correctionGF(2¹⁶) Reed–Solomon, up to 65535 shards per block, adaptive44,27Reed–Solomon per frame, fixed fec_percentage2inherited from Sunshine12inherited from Sunshine16inherited from Sunshine22
Capture and displays
Windows captureframes pushed from its own display driver, no screen scraping27DXGI; WGC beta, not in service mode1,2DXGI; WGC beta12WGC in service mode, auto-switch for UAC and login15,16DXGI/WGC; zero-copy from its display driver20
Linux capturePipeWire and compositor virtual outputs27KMS, X11, wlroots, XDG portal, KWin, NvFBC1,2no Linux builds11own DRM module, KWin, portal, wlroots, X11, NvFBC16no Linux builds24
Virtual display, Windowsown signed driver, works on the lock screen27display configuration only, no driver2SudoVDA, bundled8own signed driver; SudoVDA as rollback15ZakoVDD, bundled20,26
Virtual display, Linuxvia the compositor: KDE, GNOME, gamescope, Sway, Hyprland32,272planned8own kernel module, KDE only, four connectors1624
Display at the client's exact modeone per client, resolution and refresh27,32resizes an existing display; needs 'Optimize game settings'2fixed identity per client8per client by default16per client, bound by GUID20
Several clients at onceLinux: each on its own display; Windows: one at a time32multiple instances 'not advised'3one instance per client10up to four remote-monitor sessions17per-client display sessions20,23
Game survives a disconnectkeep-alive policy per host, display and game stay up32app keeps running; display config reverts2virtual display removed when the app quits8remote-monitor identity kept for resume16display created and destroyed with the stream20
Audio and input
Surround audio5.1/7.1 on request, resolved by the host; lossless plane up to 7.134,53via Steam Streaming Speakers driver2inherited from Sunshine12inherited from Sunshine16up to 7.1.4, Opus DRED20
Lossless audio96 kHz / 24-bit on the native plane34Opus, as the Moonlight protocol carries it34Opus34Opus34Opus, with DRED redundancy20
Microphone to the hostnative clients; not tvOS3421216with their client forks; multi-client mixing21,22
Gamepad emulation, Windowsown gamepad drivers in the installer27Virtual HID Driver needs a paid licence; ViGEmBus is end-of-life2ViGEmBus13ViGEmBus / libvirtualgamepad17ViGEmBus + DualSense sidecar23
Rumble, motion, adaptive triggersDualSense, DualShock 4, Switch Pro, Steam Controller46motion and touchpad as DS42rumble can be disabled11DualSense adaptive triggers17DualSense haptics and adaptive triggers23
Pen and touchthree touch modes, full-fidelity stylus52native_pen_touch21216virtual USB HID touch, per-client profiles23
Shared clipboardtext; Linux client side still a stub36,342with per-client permissions8,916text and image23
File transferwire format exists, no client offers files yet34,3521216read-only directory mapping with their client fork25
USB device forwardingVirtualHere plugin3821216USB/IP bridge, off by default23
Library, clients, network
Game librarylaunchers via plugins from the index, custom titles in the console38,49manual, apps.json via the web UI2,3manual, plus a profile manager tool11Playnite, Steam and Lutris auto-sync15,16manual, artwork search21
Native clients by the projectiOS/iPadOS/tvOS, macOS, Android + TV, Windows, Linux, Steam Deck28any Moonlight client1Artemis, Android only8,14a Moonlight PC fork with VRR17Moonlight forks for PC, Android, iOS, HarmonyOS20
Stock Moonlight clientsonce GameStream compat is on301intends to diverge over time815some features need their forks21
Browser clientown repo, not on the download page yet27,28Moonlight web clients18served from its own web UI over WebRTC1721
Wake-on-LANhost advertises the MAC and checks the NIC is armed; clients wake it37Moonlight client feature only2inherited from Sunshine12inherited from Sunshine16inherited from Sunshine22
Away from homeTailscale sharing, Porthole, or port forwarding; no relay42UPnP opt-in or port forwarding; no relay2inherited from Sunshine12same; WebRTC works behind Traefik/Cloudflare16,17inherited from Sunshine22
Accounts or cloud required27181521

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.

8Host platforms with an install path
jq '[.platforms[] | select(.installs == "host")] | length' data/platforms.json
6Client install rows
jq '[.platforms[] | select(.installs == "client")] | length' data/platforms.json
One Apple row covers iOS, iPadOS, tvOS; one Android row covers phone and TV.
5Linux compositor backends
grep -A 12 'pub enum Compositor' crates/pf-vdisplay/src/lib.rs
16Plugins in the official index
curl -sL https://git.unom.io/unom/punktfunk-plugin-index/raw/branch/main/v1/index.json | jq '.plugins | length'
95Management API operations
jq '[.paths[] | to_entries[] | select(.key | IN("get","post","put","patch","delete"))] | length' api/openapi.json
4173Rust test functions
grep -rn '#\[test\]\|#\[tokio::test\]' --include='*.rs' crates clients sdk plugin-kit tools | wc -l
65Version tags since the first release
git tag --list 'v0.*' | wc -l
v0.1.0 is dated 2026-06-12, v0.35.0 2026-09-09.

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.

cargo run -q -p loss-harness
Packets droppedLossGF(2⁸)GF(2¹⁶)
none0.0 %50/5050/50
1/323.1 %50/5050/50
1/166.2 %50/5050/50
1/812.5 %50/5050/50
1/616.7 %50/5050/50
1/425.0 %0/500/50
1/333.3 %0/500/50
1/250.0 %0/500/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:

cargo bench -p punktfunk-core --bench pipeline -- --warm-up-time 1 --measurement-time 3

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 measures

Where 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.

  1. Sunshine README
  2. Sunshine docs/configuration.md
  3. Sunshine docs/getting_started.md
  4. Sunshine releases
  5. Sunshine docs/api.md
  6. Sunshine src/video.h
  7. Sunshine repository
  8. Apollo README
  9. Apollo wiki: Permission System
  10. Apollo wiki: multiple instances
  11. Apollo releases
  12. Apollo docs/configuration.md
  13. Apollo .gitmodules
  14. Artemis (moonlight-android fork)
  15. Vibeshine README
  16. Vibeshine docs/configuration.md
  17. Vibeshine releases
  18. Vibeshine repository (GitHub parent: LizardByte/Sunshine)
  19. Vibepollo repository (GitHub parent: ClassicOldSong/Apollo)
  20. Sunshine-Foundation README (zh-CN)
  21. Sunshine-Foundation README.en.md
  22. Sunshine-Foundation docs/configuration.md
  23. Sunshine-Foundation releases
  24. Sunshine-Foundation CI (.github/workflows/main.yml)
  25. Sunshine-Foundation directory-mapping design
  26. ZakoVDD
  27. Punktfunk README
  28. Punktfunk data/platforms.json
  29. Docs: Switching from Sunshine
  30. Docs: Moonlight
  31. Docs: Security
  32. Docs: Virtual displays
  33. Docs: HDR
  34. Docs: Support matrix
  35. Docs: Roadmap
  36. Docs: Clipboard
  37. Docs: Wake-on-LAN
  38. Docs: Plugins
  39. Docs: Stats overlay
  40. Docs: Requirements
  41. Docs: Pairing
  42. Docs: Friends over the internet
  43. Docs: PyroWave
  44. Punktfunk GF(2¹⁶) FEC (crates/punktfunk-core/src/fec/gf16.rs)
  45. Punktfunk post-quantum key-exchange test (crates/punktfunk-host/src/gamestream/cert.rs)
  46. Punktfunk input injection (crates/pf-inject/src/inject)
  47. Punktfunk loss harness (tools/loss-harness)
  48. Punktfunk pipeline bench (scripts/bench)
  49. Punktfunk plugin index
  50. Punktfunk releases
  51. Docs: Access levels
  52. Docs: Mouse, touch and pen
  53. Docs: Client settings