Punktfunk – Low-latency game streaming

Punktfunk

4 min read Original article ↗

Game streaming that outgrew GameStream

Its own protocol, its own display driver, one shared Rust core — Linux-first, and Moonlight-compatible from day one.

240fps

stable at 5120×1440 — client-native, measured

~1.3 ms

capture to received, across two machines on a LAN

> 1 Gbps

past GameStream's ceiling — on a wired LAN

0

accounts, clouds, or dummy plugs required

What makes it different

Engineered end to end

From the display the host conjures to the frame on your screen, every layer is ours — and it shows.

Our own protocol

Past GameStream's ceiling, by design

Every other self-hosted streaming stack still speaks GameStream — NVIDIA's abandoned protocol, whose error correction caps usable video around 1 Gbps. Punktfunk speaks it too, so Moonlight and Artemis clients work on day one. But its native clients ride punktfunk/1: a QUIC control plane and an encrypted data plane with GF(2¹⁶) forward error correction that clears the 1 Gbps wall, changes resolution and refresh mid-stream without a reconnect, and probes your link so the bitrate matches reality, not a guess.

QUICGF(2¹⁶) FECGameStream's FEC wall

Linux-first

The streaming host Linux never had

On KDE, GNOME, gamescope, and Sway, the host asks your compositor for a real virtual display at your device's exact resolution and refresh — a handheld's 1280×800, a 4K TV, a 5120×1440 ultrawide — no dummy plugs, no EDID hacks, fully headless if you like. Several devices can stream at once, each on its own display. And on atomic distros like Bazzite, the host installs as a systemd extension: no layering, no reboot. Linux isn't a port of Punktfunk — it's where Punktfunk was built.

Keep-alive

Your game survives the disconnect

What happens after a drop is a policy you set, not luck. The host can keep the virtual display — and on a gamescope host, the game itself — alive through a disconnect, for a grace window or forever, so reconnecting drops you straight back in: no renegotiation, no desktop reshuffle. One-click presets cover real setups — gaming rig, shared desktop, hot-desk, workstation — several devices can become monitors of one desktop, and each client's display scaling sticks across reconnects.

Drops you back inStarts from scratch

Every layer ours

One Rust core, from our driver to your screen

On Windows, Punktfunk ships its own signed, all-Rust display driver and pushes finished frames straight into it — no screen scraping in between, working even on the lock screen — plus a small Vulkan layer for HDR where GPU drivers fall short. A single Rust core carries the protocol, error correction, and crypto in the host and every client alike, so a fix lands on eight platforms at once. Nothing is inherited from someone else's stack.

Rust driverScreen scraping

Measured, not marketed

Numbers you can check — on hardware you own

Every client ships a tiered stats overlay speaking the same vocabulary, and the web console graphs host performance live. Cross-machine latency is corrected for clock skew, so ~1.3 ms capture-to-received on a LAN is a measurement, not a promise. And the whole thing stays yours: SPAKE2 PIN pairing, pinned device identities, encrypted streams — no accounts, no cloud, and the legacy GameStream plane stays off until you switch it on.

No accounts, no cloudStats overlay

Switching

Coming from Sunshine or Moonlight?

Punktfunk speaks NVIDIA's GameStream, so your Moonlight and Artemis clients work on day one — but underneath it's a new Rust protocol with displays that survive disconnects, its own Windows display driver, and native clients on eight platforms. Switch at your own pace.

Read the honest comparisonMigration guide

And everything you'd expect

From the blog

PIN pairing that can't be brute-forced: SPAKE2 for game streaming

A 4-digit PIN sounds weak — only 10,000 combinations. Here's how punktfunk pairs a new device with a PIN you can type from the couch while giving an attacker just one online guess and no offline dictionary attack, using a PAKE that binds both devices' certificates.

Low-latency game streaming when the game is maxing out your GPU

The hardest case for any streaming host is the one that matters most: a demanding game already pinning the GPU. Here's why the encoder ends up waiting — and the two levers that took our encode time from ~30 ms to ~4 ms.

All posts