默认用自签名证书,浏览器需手动接受后才能访问;默认账号 ubuntu、密码 mypasswd,需用 -e PASSWD= 改密码才能让别人访问;pip 安装后需执行 selkies session,且宿主机要自备桌面环境。
selkies
selkies-projectMPL-2.0活跃维护自托管的低延迟 Web 远程桌面串流平台,把带 GPU 加速的 Linux 桌面或游戏画面通过浏览器实时推流,可跑在容器、Kubernetes 或云/HPC 上。
Low-Latency Accelerated Web Remote Desktop Streaming Platform for Self-Hosting, Containers, Kubernetes, or Cloud/HPC
docker run --name selkies -it -d --rm --shm-size=2g -p 8080:8080 ghcr.io/selkies-project/selkies/desktop:latest-ubuntu26.04README 未给出具体显存要求;无 GPU 时桌面容器可直接运行(CPU 加速),文档另提供 Intel、AMD、NVIDIA GPU 的命令。
把 Linux X11/Wayland 桌面变成可嵌入的 HTML5 低延迟远程桌面流
自托管的低延迟 Web 远程桌面串流平台,把带 GPU 加速的 Linux 桌面或游戏画面通过浏览器实时推流,可跑在容器、Kubernetes 或云/HPC 上。
核心能力
- 默认走 WebSocket 传输,可选开启 WebRTC
- HTML5 客户端支持双向剪贴板(文本与图片)
- 零拷贝视频渲染并自动选择 GPU
- 转发麦克风、摄像头与键盘鼠标游戏手柄输入
- 提供桌面容器、基础容器与 pip 包多种部署形态
容易踩的坑
- 9a0fd9cpre-release2026-11-09 · 2026-11-09 16:12 UTC
查看更新说明
test(display): Give the live tests after the Openbox one their DISPLAY back
live_openbox_is_read_and_restarted points DISPLAY at a private Xvfb it stops at the end, and left it there, so x11::tests' live_output_layout and live_resize_round_trip, run after it in the same process, opened a dead display and failed. It restores the DISPLAY the process had. All seven live tests pass in one run on a slot's Xvfb.
- e8e47a9pre-release2026-11-09 · 2026-11-09 13:49 UTC
查看更新说明
fix(pixelflux): Decline the GPU paths where libEGL is missing, not panic
smithay opens libEGL.so.1 the first time any of its EGL calls runs and panics where it cannot (ffi.rs: "Failed to load LibEGL"). On a host without libEGL that took down
selkies gpu-probe(Ubuntu 24.04 without libegl1 and Alpine without mesa-egl, Tesla K80), the Wayland compositor's GPU bring-up, and the X11 DRI3 capture's NVENC import: the whole server, where every other library the server opens at run time only turns its path down.EGL displays are made through egl_display, which opens libEGL.so.1 first (once, and keeps it open for smithay's own open) and returns an error where it is missing; gpu_render_init and the DRI3 capture decline on it as on any other EGL failure. crates/pixelflux/clippy.toml disallows smithay's EGL entry points elsewhere: EGLDisplay::new, EGLDevice::enumerate, make_sure_egl_is_loaded and get_proc_address (the one call left is made under a current context, so libEGL is open).
Every other library opened with dlopen already fails without a panic: pixelflux's and the server's own opens of CUDA, NVENC, NvFBC, VA-API, Vulkan, PipeWire, X11 and XCB, and the GPU probe's GL and EGL, return errors; nvml-wrapper's Nvml::init returns one; wayland-backend checks for libwayland-server before its Display::new and returns NoWaylandLib.
tests/tools/hide_libs.so makes dlopen fail for the libraries HIDE_LIBS names, and test_missing_libraries runs gpu-probe and an X11 and a Wayland WebSockets session with each of them hidden, with all of them at once and with none: the probe exits 0, the sessions send frames and the server stays up without a panic (without libwayland-server the Wayland server says it has no compositor). On an NVIDIA L4 with Xvfb, main fails exactly four of its 65 checks (gpu-probe with EGL hidden and with everything hidden, and the Wayland session's server panicking with EGL hidden) and this passes all 65. On a private NVIDIA Xorg (DRI3, NV-GLX), main's X11 session with libEGL hidden panics in two capture threads and sends nothing; with this the DRI3 capture declines ("no EGL display ... for the NVENC import"), NvFBC takes the capture and the frames flow, and with everything hidden it streams on x264. Without a render node, as on CI, the sessions run with nothing and with everything hidden.
- de188fapre-release2026-11-09 · 2026-11-09 11:00 UTC
查看更新说明
test(packaging): Have the stand-in server report every crate's version
server.sh fails a build whose server does not name the release version for Selkies, pixelflux, and pcmflux alike (c0ea5fc9e), and the packaging simulation's stand-in Cargo left a server that named Selkies' alone, so every simulated package build stopped at that check. The stand-in reports the versions the workspace manifest and the pixelflux and pcmflux manifests beside it were stamped with, in the form
selkies --versionprints; the simulation stages all four packages again. - 1b2babapre-release2026-11-08 · 2026-11-08 19:36 UTC
查看更新说明
build(packages): Build the codecs once per architecture and C library
pixelflux's codecs are its pinned releases with its patches, the same archive whichever distribution links them. A codecs job builds all six (libx264, x265, libvpx, SVT-AV1, dav1d, and libde265) once for each of x86_64 and aarch64 and glibc and musl, in the wheels' manylinux and musllinux images, whose C library is the oldest any package targets (scripts/ci/build-codecs.sh), and every native package and the AppImage link those static archives through SELKIES_CODECS. A package build takes only the libraries that are its distribution's from its distribution, so the package scripts install no codec package and none of the tools only the codecs build with, and codecs.sh builds every codec rather than consulting the distribution. The wheel, built in those same images, builds its own with codecs.sh.
codecs.sh undefines FINITE_MATH_ONLY, which -ffast-math predefines, so an archive built against glibc before 2.31 calls the math functions by their own names and links against any newer glibc.
Verified on x86_64: the glibc and musl codec sets built by build-codecs.sh; the el9 rpm, bookworm deb, and Alpine apk built against them and each passed verify-package.sh in a pristine container; the AppImage built from the same prefix and passed verify-appimage.sh locally and on CentOS 7; tests/packaging passes. The aarch64 builds run first in CI.
- 2.2.1最新正式版2026-11-04 · 2026-11-04 08:05 UTC
What Selkies 2.2.1 brings
Selkies 2.2.1 ships with
pixelflux2.2.3 andpcmflux2.2.1.- A stalled connection comes back at its rate. A path that holds the stream for seconds and then delivers it at once, a Wi-Fi radio retrying or a lossy hop, used to cut a still desktop to a blur until the screen moved. The rate now returns to what it was within two seconds of the stall clearing.
- A still desktop climbs back after a slow spell. Once a slower path or another flow's download has cut the rate, the stream is padded up to its target while the screen sits still, so the path is tested and the rate climbs back, 1.3x a second, where it used to stay cut until something moved.
- Safari's engine streams behind the login. WebKit browsers send no login with the stream's socket, which the server refused, so behind the default Basic login they showed nothing; the page load now gives the socket a cookie in its place.
- A link that logs in with
user:pass@works. The page drops the credentials from its address before anything runs, so the mode probe, the WebSockets/WebRTC switch and the file manager no longer fail on them;?token=and#token=are kept. - WebRTC keeps moving through a sharp bandwidth drop. After a 5 to 0.5 Mbit/s step, a 720p30 stream stalled for 20 s and more, its round trip at 2.3 s (#503). It now keeps a few frames a second through the step, its longest pause 2-4 s, at a round trip of 0.1-0.4 s, with audio playing or not.
- A press after switching tabs works. A mouse button or a touch whose release went to another tab or app stayed held: every motion dragged, and on a touch screen every tap after it counted as a second finger and scrolled instead of clicking. Hiding the page, leaving its window or touching it again now releases what the page no longer holds.
- A SealSkin room's viewers stay viewers. In secure mode the token, not the Basic login a proxy adds, decides what an API request may do.
- Sound survives a reconnect in a background tab. A short network drop while the tab was hidden, or the video switched off, left the session silent until a reload; the sound now plays on, and the picture comes back when the tab is shown (#509).
- KDE Plasma on Wayland runs on a GPU the compositor cannot render on. On a virtual GPU the compositor fell back to software while still offering GPU buffers, and a nested KWin crashed on them (#504).
- No frozen screen at a login. When the browser stopped sending its saved login, the page's background requests waited behind a login prompt a fullscreen session hid, and the screen froze. The page now reloads into the browser's login.
pixelflux2.2.3 captures an NVIDIA X server through DRI3 first, holds NvFBC at 240 frames a second, keeps the paced capture paths at their rate under load, and hands a still host's frame back to the portal stream.
Running this build
Container: the desktop, a browser, and an audio stack, with nothing to install:
docker run --name selkies -it -d --rm --shm-size=2g -p 8080:8080 \ ghcr.io/selkies-project/selkies/desktop:2.2.1-ubuntu26.04Open https://localhost:8080, accept the container's self-signed certificate, and log in as
ubuntuwith the passwordmypasswd. Set another with-e PASSWD=before anyone else can reach the session.debiantrixieis the other flavor, andlatestnow points at this release. The flags for NVIDIA, Intel, and AMD GPUs are in Getting Started.PyPI: the wheel and the sdist, with
pixelflux2.2.3 andpcmflux2.2.1 resolved from PyPI as well, on Python 3.9 through 3.15:pip install selkiesAppImage: runs from wherever you put it, on any distribution with glibc 2.28 or newer. Given
session
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Moonlight, Google Stadia, or GeForce NOW in noVNC form factor for Linux X11 and Wayland, in any HTML5 web interface you wish to embed inside, with at least 60 frames per second on Full HD resolution.
We are in need of maintainers and community contributors. Please consider stepping up, as we can never have too much help!

Selkies is an open-source low-latency high-performance Linux-native GPU/CPU-accelerated HTML5 remote desktop streaming platform, for self-hosting, containers, Kubernetes, or Cloud/HPC platforms, started out first by Google engineers, then open-sourced and developed by academic researchers, LinuxServer.io, and community contributors. It streams over plain WebSockets by default, with WebRTC available as an opt-in transport.
Selkies is designed for researchers studying Agentic AI, Graphical AI, Robotics, Autonomous Driving, Drug Discovery technologies, SLURM supercomputer or HPC system administrators, Jupyter, Kubernetes, Docker®, Coder infrastructure administrators, and Linux cloud gaming enthusiasts.
While designed for clustered or unprivileged containerized environments, Selkies can also be deployed in desktop computers, and any performance issue that would be problematic in cloud gaming platforms is also considered a bug.
The HTML5 client runs on Chromium, Firefox, and Safari, with two-way clipboard (text and images), low-latency zero-copy video rendering, automatic GPU selection, resilient keyboard, mouse, and gamepad input, and microphone and webcam forwarding into the session.
Quick Start
The desktop container carries a desktop, a browser, and an audio stack, so without a GPU this is the whole command:
docker run --name selkies -it -d --rm --shm-size=2g -p 8080:8080 \
ghcr.io/selkies-project/selkies/desktop:latest-ubuntu26.04
Open https://localhost:8080, accept the container's self-signed certificate, and log in as ubuntu with the password mypasswd; -e PASSWD= sets another, which it needs before anyone else can reach the session. Getting Started has the commands for Intel, AMD, and NVIDIA GPUs and what each flag is for. The tag names the distribution inside the image, ubuntu26.04 or debiantrixie, after latest for the newest release or main for the newest commit.
Other ways to run it:
pip install selkies(any Python 3) brings the server, with pixelflux and pcmflux linked in, and its web client, andselkies sessionthen runs the desktop the host has installed, bringing up what it lacks for a session (a display and a sound server), which is how Jupyter, Coder, and Open OnDemand start it.- Native Install has the
.deb,.rpm,.apk, and Arch packages, which attach Selkies to a display and sound server you run, and the AppImage, which installs nothing and starts a display and a sound server where none is running. - The Base Container is the whole session without a desktop, the image to build your own
FROM, anddocker-selkies-egl-desktopanddocker-selkies-glx-desktopare KDE Plasma desktops built on it.
Read the Documentation for the rest. The Settings Reference lists every current setting. Licensing inventories the third-party components of an installation, with their licenses and where the GPL pieces come from.
Security scanning is provided by Snyk. This project is fuzz-tested by Google's OSS-Fuzz. This project is tested with BrowserStack. Automated reviews are provided by Pullfrog. Internal resources Powered by DartNode.