Releases Webtop

Webtop 5.0 and Selkies 2.0 bring five codecs, WebRTC, and self-configuring GPUs

Selkies 2.0.0 rebuilt every LinuxServer.io desktop container on a new streaming stack: five codecs behind one fallback ladder, WebRTC as a first-class transport, zero-copy capture on X11, and an x86_64 GPU the container configures on its own. Here is the short list of things to change.

Selkies 2.0.0 shipped on 24 September, and every LinuxServer.io container built on it was rebuilt in the same push. The best known is Webtop, now at 5.0: a Linux desktop in a browser tab, streamed from your own machine. 94 of LinuxServer’s 223 active image repositories sit on the Selkies base image, and the last KasmVNC branches retired in July.

Five codecs, one ladder

The stack streams H.264, H.265/HEVC, VP8, VP9 and AV1 over both WebSockets and WebRTC. JPEG and striped H.264 stay as legacy fallbacks.

The server probes what the host can encode at startup, the browser what it can decode; anything the browser cannot take is greyed out with the reason, so a missing codec looks like a limit, not a bug. When a codec cannot be served, the session steps down one fixed ladder, hardware first, and every step logs why. One quality knob, SELKIES_VIDEO_CRF, maps across all of them, measured against x264 so the same CRF means roughly the same picture on any codec.

The GPU story is now “mount the card in”

On x86_64 you pass --device /dev/dri or the NVIDIA runtime and set nothing else. The container finds the render node, uses the first card for rendering and encoding, and picks an encoder the card supports. Intel 10th gen and older get the i965 driver automatically. Multi-GPU hosts, mixed vendors, no GPU at all: same path, no config file.

aarch64 is different on purpose: the spread of ARM boards and vendor stacks is too wide, and a GPU that initialises halfway takes the desktop down with it. Opt in with AUTO_GPU=true or point DRI_NODE; if it does not work, you keep a software desktop instead of a container that will not start.

Zero-copy capture is no longer Wayland-only. Pixelflux 2.1 added a DRI3 blit path for X11: frames move from the framebuffer to the encoder without a copy, 3.8 ms against 8.8 ms on an RTX 5000 Ada at 1080p60, and containers can share one card.

What else is in the containers

Dual monitors, a webcam, a printer and Steam in every container with no extra Docker privileges, plus a stats panel for when a stream is slow. The app store went from 92 to 109 apps, and there is a test suite now: about 2,200 checks across unit, integration and end-to-end suites, a skipped suite counting as a failure in CI.

If you run one of these

The upgrade notes that matter: encoder names changed, so x264enc still works as an alias for h264enc but x264enc-striped does not; the new default is h264enc,h265enc,vp8enc,vp9enc,av1enc,jpeg. Every SELKIES_H264_* variable is now SELKIES_VIDEO_*; init scripts translate the old names, but update your compose. NVIDIA needs host driver 580+ and Container Toolkit 1.20.1+, plus --device /dev/nvidia-modeset; older than driver 595.80 may still need nvidia-drm.modeset=1 and a dummy plug. DISABLE_ZINK and MAX_RES are gone.

Release artwork: a seal-like creature holding a graphics card, with two desktop screens floating over snow and ice.
Release artwork for Webtop 5.0 and Selkies 2.0. Image: LinuxServer.io.

My read

Serving a desktop with GPU encoding used to be paid for in compose lines: device paths, driver names, an encoder pick. This release deletes most of that, and the upgrade checklist for existing installs fits on a screen. The stack grew so the config could shrink.

Source: LinuxServer.io’s release post and the Selkies docs.