Selkies 2.0.0rc0 is the first release candidate of Selkies 2.0. It carries the same build in every medium below and is here to be tested before 2.0.0 is cut: please run it on your own deployments and report what breaks.
What Selkies 2.0 is
Selkies is a single Python application serving one port, with the HTML5 client bundled into it. GStreamer is gone from the runtime: screen capture and video encoding are done by pixelflux, audio capture and encoding by pcmflux, two Rust extensions that install with the wheel.
- WebSockets is the default transport. One TCP port (
8080by default) carries video, audio, input, clipboard and file transfers, decoded in the browser through WebCodecs, with a striped JPEG path for browsers that have none. Nothing about it needs STUN or TURN. - WebRTC is opt-in (
--mode=webrtc) on a vendoredaiortcfork, and can be confined to a port range, to one shared UDP and/or TCP port, or run ICE-lite for a restrictive firewall.--enable-dual-mode=truelets the page switch transports while the session runs. - X11 and Wayland. The X11 backend is the default;
--wayland=trueruns the same session on a headless Wayland backend, with input injected throughpixelfluxrather than through any subprocess. - Hardware video encoding on NVIDIA NVENC and Intel/AMD VA-API, falling back to software H.264 (
x264, or BSD-licensed OpenH264 in a GPL-freepixelfluxbuild) or Motion JPEG. Audio is Opus, with RFC 2198 redundancy available. - Input built for games as well as desktops: pointer lock, a gaming mode that fullscreens and holds the pointer and keyboard, raw pointer motion where the browser offers it, an on-screen touch gamepad, and gamepads delivered to applications through the joystick interposer or
uinput. - Two-way clipboard, text and images, chunked for large payloads; file transfers in both directions, paced against the video stream so a large one does not stall the session; an apps panel that launches desktop entries in the session.
- Session sharing and multi-user access. Viewer and player-2-to-4 links share a running session, and input authority is enforced on the server, not in the page: a viewer's keyboard and mouse are refused whatever its client sends, and a gamepad message is refused unless it drives the slot that link carries. Secure mode replaces the links with provisioned session tokens that carry a role and a slot.
- Microphone and webcam uplinks publish the browser's devices into the session as an ordinary PulseAudio source and a V4L2 capture device.
- A second display extends the desktop onto another browser page, each at its own resolution and density.
- A UI the deployment decides. The sidebar's title, logo and every section are server settings, and each capability has its own setting behind them, so hiding a control and disabling a feature are separate choices.
- Every medium built from one source: the wheel,
.deb(Ubuntu 24.04/26.04, Debian bookworm/trixie),.rpm(Fedora, Enterprise Linux 9), Alpine.apk, Arch.pkg.tar.zst, a self-contained AppImage, and multi-architecture container images, all forx86_64andaarch64(the Arch package forx86_64alone).
Running this build
Container — the desktop, a browser and an audio stack, nothing to install:
docker run --name selkies -it -d --rm --shm-size=2g -p 8080:8080 \
ghcr.io/selkies-project/selkies/desktop:v2.0.0rc0-ubuntu26.04Open https://localhost:8080 and log in with ubuntu / mypasswd, changing it with -e PASSWD= before the session is reachable by anyone else. debiantrixie is the other flavor, and the GPU flags for NVIDIA, Intel and AMD are in Getting Started.
AppImage — runs from wherever you put it, on any distribution:
APP="selkies-2.0.0rc0-$(uname -m).AppImage"
curl -O -fsSL "https://github.com/selkies-project/selkies/releases/download/v2.0.0rc0/${APP}"
chmod +x "./${APP}"
"./${APP}" --addr=0.0.0.0,:: --port=8080 --basic-auth-user=user --basic-auth-password=mypasswdNative packages — install a private environment at /opt/selkies and put selkies, selkies-resize and selkies-gpu-probe on PATH:
. /etc/os-release
DISTRO="$([ "${ID}" = "ubuntu" ] && echo "ubuntu${VERSION_ID}" || echo "${VERSION_CODENAME}")"
PKG="selkies_2.0.0.rc0-1.${DISTRO}_$(dpkg --print-architecture).deb"
curl -O -fsSL "https://github.com/selkies-project/selkies/releases/download/v2.0.0rc0/${PKG}"
sudo apt-get install -y "./${PKG}"Native Install has the .rpm, .apk and .pkg.tar.zst lines, how to attach Selkies to a display and audio server you already run, and a full session script.
Notes for this release candidate
- This pre-release is not published to a Python index. The wheel on this page is the artifact, and it pins
pixelflux~=2.1.0rc0andpcmflux~=2.1.0rc0, which are published on those projects' own releases. The packages, the AppImage and the container images already carry both, so only a bare wheel install needs to fetch them. - The container images are tagged
v2.0.0rc0-ubuntu26.04andv2.0.0rc0-debiantrixie(baseanddesktop), with the coTURN and TURN-REST addons asv2.0.0rc0. - Coming from 1.6.x: the runtime no longer uses GStreamer, and the default WebSocket transport needs no TURN server at all — a single exposed port is the whole deployment. Every setting is listed in the Settings Reference.
Known limitations
- H.265/HEVC and AV1 are planned in
pixelflux; this release encodes H.264 and Motion JPEG. - Gaming mode holds the keyboard only where the browser offers the Keyboard Lock API — Chromium-based browsers do, Firefox and Safari do not, and Brave's Shields block it by default. The client says so when it enters gaming mode without one.
- WebRTC behind NAT may still need a STUN/TURN server; see WebRTC and Firewall Issues. The default WebSocket transport does not.
- Hosts are Linux only; macOS and Windows support is not implemented.
Reporting
Issues go to https://github.com/selkies-project/selkies/issues, and the Discord is where most of the testing conversation happens. A report that names the transport (websockets or webrtc), the backend (X11 or Wayland), the browser, and the GPU is one we can act on immediately.
We are in need of maintainers and community contributors. Please consider stepping up, as we can never have too much help!
Contributors
1039 commits (1005 plus 34 merges) between v1.6.2 (2024-08-15) and f5eb10c8b (2026-09-12), the commit the
release run built the v2.0.0rc0 draft from. Commits counted by the GitHub account each was authored by.
| Handle | Name | Commits |
|---|---|---|
| @ehfd | Seungmin Kim | 582 |
| @thelamer | Ryan Kuba | 404 |
| @PMohanJ | Mohan J | 17 |
| @junkerderprovinz | Junker der Provinz | 7 |
| @vishalkadam47 | Vishal Kadam | 7 |
| @T2theV | 3 | |
| @rmounce | Ryan Mounce | 3 |
| @Rid | Grant Millar | 2 |
| @dionorgua | Dmytro Nezhevenko | 2 |
| @victorpahuus | Victor Pahuus Petersen | 1 |
| @sujeito-operator | Sujeito Operator | 1 |
| @JohannVR | Johann | 1 |
| @felipecrs | Felipe Santos | 1 |
| @danisla | Dan Isla | 1 |
| @athene20 | athene20 | 1 |
| @aliefe04 | 1 | |
| @Pooyahmti | Pooya Hemmati | 1 |
| @h012193213 | Martin Ng | 1 |