Skip to content

v2.0.0rc0

Latest

Choose a tag to compare

@github-actions github-actions released this 12 Sep 10:14
· 19 commits to main since this release
f5eb10c

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 (8080 by 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 vendored aiortc fork, 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=true lets the page switch transports while the session runs.
  • X11 and Wayland. The X11 backend is the default; --wayland=true runs the same session on a headless Wayland backend, with input injected through pixelflux rather 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-free pixelflux build) 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 for x86_64 and aarch64 (the Arch package for x86_64 alone).

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.04

Open 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=mypasswd

Native 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.0rc0 and pcmflux~=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.04 and v2.0.0rc0-debiantrixie (base and desktop), with the coTURN and TURN-REST addons as v2.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