qsm-rd
QSM Direct replaces the noVNC picture in the Proxmox VE web console with a WebRTC video stream, in the same browser tab, with the same PVE login and the same VM.Console permission. Nothing is installed on the client, and pveproxy and pvedaemon run unmodified.
- Proxmox VE
- WebRTC
- LXC
- Status
- Version 0.4.0. HEVC is experimental, and live migration of a VM with QSM Display1 has not been qualified. A feature request is filed with Proxmox (bug #8106); an RFC and patch series for qemu-server and pve-manager are prepared in the repository.
- License
- GPL-3.0-or-later; the PVE console script, the signalling service, the LXC console and the viewer page are AGPL-3.0-or-later.
- Platforms
- Proxmox VE 9 nodes; on the client, a browser with H.264 and Opus in WebRTC.
What it solves
The stock noVNC console sends changed screen rectangles. For work inside a running desktop, such as video, scrolling or animated interfaces, that means few distinct pictures per second at a high bandwidth, and no guest 3D. QSM Direct encodes the guest display as video on the node and streams it to the browser. The README publishes a measured comparison with stock noVNC, including the cases where noVNC remains the better tool: the first picture, a single isolated pointer event and anything before an OS is running.
Key features
- H.264 by default through NVENC, QSV, VA-API or
libx264on the CPU; HEVC as an explicit, experimental per-VM choice. - VirGL guests with OpenGL and 3D, or Standard VGA, VirtIO and VMware adapters without a GPU.
- Sound (Opus), the browser’s microphone in the guest and two-way text clipboard; in a VM the clipboard needs an optional guest agent.
- Pointer motion travels on its own unordered latest-state lane, so it cannot queue up behind a busy frame.
- LXC containers with a KDE Plasma desktop: one console per tty, each with its own login screen.
How it works
The browser sends its WebRTC offer to a node-local signalling service on TLS port 8007. The service checks the browser’s PVE ticket and the VM.Console permission through PVE’s own /access/ticket and hands the offer to a terminal service, which starts one media worker per VM. The worker reads QEMU’s D-Bus display, encodes picture and sound, and sends them directly to the browser; input goes back the same way. All viewers of one VM share one encoder stream.
apt install ./qsm-pve-direct_*.deb systemctl enable --now qsm-pve-direct-terminal.service qsm-pve-direct-signal.service
Requirements
- Proxmox VE 9 (
pve-manager9.x); the package is built on Debian 13 and installed on every node that may run the VM. - Browser: Chrome, Edge, Chromium with proprietary codecs, Safari, or Firefox with the OpenH264 plugin.
- Network: TCP 8006 and 8007 and inbound UDP from operator networks; a host name the node certificate is valid for.
- Encoder: NVENC, QSV, VA-API or the CPU (about half a core per open console with
libx264); the VirGL profile needs a DRM render device. Up to 16 console sessions per node.
This page summarises the repository’s README and documentation as of October 2026. The repository itself is the authoritative source.