We've just launched. The site and the service are still being polished — we apologize in advance for any inaccuracies or rough edges. Spotted a mistake or something that doesn't work as expected? Tell us and we'll fix it quickly.

← All projects
EN
Beyond TAKT

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 libx264 on 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-manager 9.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.