Low-latency remote desktop and game streaming for Linux – self-hosted, written in Rust.
The latency of Sunshine/Moonlight or Parsec, the comfort of TeamViewer: pair once with a PIN, then click and play.
AMD, Intel and NVIDIA · Wayland and X11 · AV1, HEVC and H.264 in hardware · end-to-end encrypted.
Install • Features • Screenshots • Performance • Compared • FAQ • Documentation • Development
- Fast like a game streamer. About 10 ms glass-to-glass in the LAN at 1080p60 (without the monitor), the screen goes from the GPU to the encoder and from the decoder to the window without a single copy through the CPU.
- Easy like a remote desktop tool. One app on both computers: it finds the other one in the network, you pair once with a 6-digit PIN, then a click starts the session. Or open the host's address in any browser, phones included.
- Made for Linux. The host captures the screen over KMS, so it works on KDE, GNOME, Hyprland, gamescope (Steam's gaming mode) and even the login screen, without a portal dialog.
- Self-hosted and private. No account, no cloud service: devices pair directly, every session is end-to-end encrypted (Noise IK, as in WireGuard).
Note
Fernsicht is young. The core works and is tested on real hardware every night, but some parts have not been used by many people yet. See the status for what is done and what was not tried live.
Download the AppImage from the latest release and start it on both computers:
chmod +x Fernsicht-*-x86_64.AppImage
./Fernsicht-*-x86_64.AppImageOn the computer you want to control, open “Dieser Rechner” (this computer) and click “Diesen Rechner freigeben” (share this computer): the host runs as a system service from then on. On the other computer the host shows up in the list; pair with the PIN and click Desktop or Gaming. The app's interface is in German for now.
On a server you reach over SSH, install the host alone (any distribution with systemd; a .deb and
an .rpm are in the release too), then pair with sudo fernsicht-host-agent pair and open
http://<server>:47800 in a browser:
curl -fsSL https://github.com/firsttris/fernsicht/releases/latest/download/install.sh | sudo shBuilding from source, the browser and everything else: the installation guide.
| Notes | ||
|---|---|---|
| ✅ | AMD (RADV, VAAPI) | host and client, AV1/HEVC/H.264 with an RX 6000/7000 and newer |
| ✅ | NVIDIA (proprietary driver) | host (NVENC, screen via Vulkan → CUDA) and client (NVDEC); GTX 10xx and newer |
| ✅ | Intel (iHD, VAAPI) | the same path as AMD; not tested on real hardware yet |
| ✅ | Bazzite, Fedora, other distributions with systemd | developed and tested on Bazzite 44 (KDE Wayland) |
| 🌐 | Any browser | the web viewer: Chrome, Edge, Firefox, Safari, phones and tablets |
| ⏳ | Windows and macOS | not planned for now: the host is Linux, clients are the app on Linux or a browser |
| 🖥️ Remote desktop | Mouse and keyboard reliably over UDP, every event exactly once; the pointer drawn by the client so it never lags; several monitors with switching in the session; system keys (Meta, Alt+Tab, Ctrl+Alt+Del) in fullscreen or from a menu; a shared clipboard (text, on KDE, Sway, Hyprland, COSMIC) |
| 🎮 Game streaming | Gaming mode with a captured pointer (relative mouse), up to four controllers that appear on the host as Xbox 360 pads Steam knows (any layout through SDL3, rumble back to the controller), PlayStation pads as DualSense pads with gyro and touchpad, 60 to 144 fps |
| ⚡ Low latency | KMS capture at vblank, zero-copy into VAAPI, NVENC or Vulkan Video, low-latency encoder settings, Reed-Solomon FEC (retransmits only in the LAN, for what FEC cannot repair), UDP paced at the rate the path delivers, decoded pictures drawn where the GPU decoded them (Vulkan Video), a per-stage latency overlay |
| 🎞️ AV1, HEVC, H.264 | Each session takes the best codec both sides do in hardware; switchable in the settings; 10-bit desktops stream in 10 bit (HEVC Main 10, AV1) without banding; HDR desktops are recognised and tone-mapped for the client's display |
| 🔊 Sound | What the host plays, Opus with 5 ms frames, a 15 ms jitter buffer that hides loss |
| 🔐 Pairing and encryption | Pair once with a PIN (SPAKE2, no offline guessing), Noise IK per session, ChaCha20-Poly1305 for every packet, only paired devices get in |
| 🌐 Web viewer | The host serves it itself: any browser in the LAN, PIN once, WebRTC with AV1 or H.264; on phones with gestures, touchpad mode, pinch zoom and the on-screen keyboard |
| 📶 Bad networks | Forward error correction sized from the measured loss, bitrate adaptation before packets are lost (queue delay, ECN marks); 1 % loss costs no frame |
| 🧰 Host as a service | systemd unit, encoder picked for the GPU, GPU clocks raised during sessions, pairing and status from the app or the command line |
![]() Devices – found in the LAN, paired with a PIN · docs → |
![]() Settings – resolution, fps, bitrate, codec · docs → |
![]() Connect – by name, address or ID · docs → |
![]() Web viewer – no install, PIN once · docs → |
![]() On a phone – gestures, zoom, on-screen keyboard · docs → |
![]() Portrait – the toolbar wraps, the picture fits · docs → |
Measured end to end on the two test machines, without the monitor's own delay (details and what can still get faster: performance):
| Path | Glass-to-glass |
|---|---|
| Loopback, AMD RX 7800 XT, H.264 1080p60 | ≈ 9.4 ms |
| GTX 1080, NVENC → NVDEC, HEVC 1080p60 | ≈ 4.1 ms |
| AMD host → NVIDIA client over Wi-Fi, 1080p | 11.5 ms |
| AMD host → NVIDIA client over Wi-Fi, 1440p | 16.3 ms |
At the same bitrate HEVC gives a clearly sharper picture than H.264 (GTX 1080, 4 Mbit/s 1080p: 32.4 dB instead of 29.1 dB PSNR with a third of the bytes). Every step of the path is shown live in the overlay: capture, encode, network, decode, display.
| Fernsicht | Sunshine + Moonlight | Parsec | RustDesk | |
|---|---|---|---|---|
| Linux host | ✅ KMS, also login screen and gamescope | ✅ | ❌ | ✅ |
| Latency focus | ✅ zero-copy, FEC, per-stage overlay | ✅ | ✅ | ➖ |
| Remote desktop comfort (find, pair, click) | ✅ | ➖ pairing per client, made for games | ✅ | ✅ |
| Browser client | ✅ built into the host | ❌ | ❌ | ➖ web client |
| Account or cloud | none | none | required | optional relay server |
| Over the internet | via VPN for now (how) | port forwarding | ✅ | ✅ |
| Windows/macOS | ❌ | ✅ | ✅ | ✅ |
A latency comparison with Sunshine/Moonlight on the same machines is planned (method).
Does it work on Wayland?
Yes. The host does not depend on the compositor: it reads the screen over KMS (kernel mode setting),
the same way on KDE Plasma, GNOME, Hyprland, Sway, gamescope and X11. That needs root
(CAP_SYS_ADMIN), which the system service has. The client window runs on Wayland and X11.
Does it work with NVIDIA?
Yes, with the proprietary driver: NVENC on the host (the screen goes from KMS through Vulkan into CUDA, without a CPU copy) and NVDEC in the client (its pictures go from CUDA to Vulkan on the GPU). Tested on a GTX 1080.
Can I use it over the internet?
Today through a VPN such as Tailscale or WireGuard (or Cloudflare WARP): then it works as in the LAN. Built-in NAT traversal is on the roadmap. See remote access.
Is it a Sunshine or Moonlight replacement for gaming?
For Linux to Linux and browsers, yes in intent: gaming mode, controllers, 120 Hz and more, AV1/HEVC. It does not speak the Moonlight protocol, so Moonlight clients cannot connect.
Is it secure?
Only paired devices can connect. Pairing uses a 6-digit PIN with SPAKE2 (a recorded pairing cannot be used to guess the PIN), each session starts with a Noise IK handshake, and every packet is encrypted and authenticated. The web viewer is meant for the LAN: its page and PIN travel over plain HTTP. See security.
Which codec does it use?
The best both sides support in hardware: AV1, then HEVC, then H.264. A GTX 1080 decodes no AV1, so it gets HEVC; a browser offering AV1 gets AV1 from an AMD RX 6000/7000. You can also pick one in the settings.
Everything else – installation, the app, the web viewer, the host, how it works inside, the protocol, security, performance and the roadmap – is in the documentation.
cargo build --release # host and client (test pattern, synthetic codec)
cargo test --workspace # unit, property, integration, end-to-end
pnpm install && pnpm test && pnpm test:e2e # app UI and web viewerOn Bazzite, dev/setup.sh builds the development container with FFmpeg, Vulkan and the GPU drivers.
Build features, the test layers, the GPU runners and the release flow are in the
development guide.
⭐ Like Fernsicht? A star on GitHub helps others find it.
🐛 Report a bug · 💡 Request a feature
License: AGPL-3.0 · © Tristan Teufel and contributors
Changed versions you pass on or run for others must offer their source code under the AGPL; a commercial license without these obligations is available via teufel-it.de.
Fernsicht is not affiliated with Valve, NVIDIA, AMD, Intel, Parsec, Moonlight, Sunshine, RustDesk or TeamViewer.





