What OpenThinRDP does, in detail

The README is the short version; this page has every feature of the thin client, the measurements of RDP over UDP, the screens that only show a web page and why it is built this way. The Windows manager has its own page: manager.md.

RDP over UDP that keeps going on a bad line

Over TCP, every lost packet stops the screen until it is sent again: a lossy Wi-Fi, a VPN or a faulty cable is enough to freeze the remote desktop. Over UDP, Windows drops what is late and lowers the quality instead, and the desktop keeps moving. Measured on a Windows 11 VDI with a full-screen load changing every pixel, frame rate counted by the server, loss applied to every packet from the virtual machine:

packets lost over TCP OpenThinRDP over UDP
0% 15-21 fps
5% 7-12 fps
10% 6 fps
20% 0.6 fps: the screen barely moves
30% 0.2 fps: frozen
50% 19-21 fps, as on a clean line
60% 14-21 fps
70% 18-19 fps
80% 4 fps, then the tunnel gives up

Empty cells were not measured: TCP was already frozen at 30%, and UDP at 50% ran as on a clean line. One environment (Dell OptiPlex 3000 Thin Client, Windows 11 VDI on Hyper-V), loss emulated with netem: the method and the scripts to get your own numbers, and every step in docs/udp.md.

The UDP transport comes from our work in FreeRDP: we found and fixed what made it fail on lossy lines, and it was merged upstream as #13608. Upstream ships it switched off; OpenThinRDP has it on, with TRANSPORT=tcp one setting away.

Every feature

Desktop start with the real steps End of session with a countdown Software update in progress

Screens that only show a web page

The same image runs the screens that never need a Windows desktop: a TV in the hall, a dashboard in the office, an info point, a board in production. With WEB_BUTTON=kiosk and KIOSK_URL:

Settings: docs/configuration.md.

Why it is built this way

Why FreeRDP is not updated automatically. Debian security updates install by themselves, but FreeRDP is excluded. First, the image ships its own FreeRDP build with UDP, which Debian's packages would replace with a version without it. Second, the remote desktop client is the part users depend on: a new FreeRDP version can change how sessions, USB devices, smart cards or the graphics behave, and on a fleet a regression stops everyone at the same moment. So FreeRDP comes with OpenThinRDP releases, after testing on real devices, and you can still keep it as it is on one device (/etc/openthinrdp/freerdp-pinned).

Why UDP on by default. Over TCP, a busy server or a lossy line makes the screen fall behind; over UDP, Windows lowers quality instead. The transport is now part of FreeRDP (#13608, merged after weeks of tests on our fleet), switched off there by default; OpenThinRDP switches it on, and TRANSPORT=tcp is one setting away.

Why a shared folder instead of a management server. Every Windows network already has a file share and someone who can manage permissions on it. The devices only read and write files there, so there is nothing to install, patch or license on the server side, and the settings are plain text files you can read, diff and back up.

Why Debian. Stable, security updates for years, every driver and firmware package, and a kiosk on top of it that you can read: the whole client side is a few shell scripts in rootfs/opt/openthinrdp.

This page is docs/features.md as published on GitHub, where the documentation, the releases and the discussions are.

Try it live. Nothing is installed.

Write the ISO to a USB stick, start a PC from it, sign in to your Windows desktop.