Nestri runner containers bundle everything needed to stream a game: theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/nestrilabs/nestri/llms.txt
Use this file to discover all available pages before exploring further.
nestri-server streaming binary, a full GStreamer pipeline with hardware encoding plugins, Gamescope compositor, PipeWire audio, and a game launcher. Each container starts nestri-server, which creates a Wayland display, captures it via GStreamer, and streams it to a connected browser over WebRTC.
Container image hierarchy
Runner images are built in layers. Each layer adds only what its stage needs:runner-base
Built from CachyOS (
docker.io/cachyos/cachyos:latest). Installs the minimal runtime dependencies shared by all stages: gstreamer, gst-plugins-base, curl, libevdev, and a few system libraries.runner-common
Adds the full GPU and streaming stack on top of
runner-base: Vulkan drivers for NVIDIA, AMD, and Intel; Mesa; VA-API plugins (gst-plugin-va, gst-plugin-qsv); WebRTC plugins (gst-plugin-rswebrtc, gst-plugin-webrtchttp); Gamescope compositor; PipeWire and WirePlumber; MangoHUD; and the nestri-server binary plus the vimputti-manager input shim. It also creates the nestri user (UID/GID 1000) that runs the game process.Available flavors
| Image | Launcher | NESTRI_LAUNCH_CMD |
|---|---|---|
ghcr.io/nestrilabs/nestri/runner:nightly-steam-v3 | Steam | steam -tenfoot -cef-force-gpu |
ghcr.io/nestrilabs/nestri/runner:nightly-heroic-v3 | Heroic Games Launcher | heroic |
ghcr.io/nestrilabs/nestri/runner:nightly-minecraft-v3 | Minecraft Launcher | minecraft-launcher |
Environment variables
Thenestri-server binary (written in Rust, defined in packages/server/src/args.rs) reads all configuration from environment variables.
Required
WebSocket URL of the relay server this runner connects to. Example:
ws://relay.example.com:8088 or wss://relay.example.com when behind a TLS proxy.Room identifier for this streaming session. The browser client uses the same value to locate the stream. Must be unique per active session on a given relay.
Display and encoding
Stream resolution in
WIDTHxHEIGHT format. The compositor (Gamescope) and nestri-server both read this value. Example: 1920x1080, 2560x1440.Stream framerate in frames per second. Accepted range is 5–240. The default Gamescope launch command passes this as
-r ${FRAMERATE}.Preferred video codec. Accepted values:
h264, h265, av1. The server picks the best available hardware encoder for the selected codec.Target video bitrate in kbps. Used in CBR (constant bitrate) mode by default.
Maximum video bitrate in kbps. Applied as a ceiling in CBR and VBR modes.
Encoding backend.
hardware uses VA-API, NVENC, or QSV depending on the detected GPU. software falls back to CPU encoding (not suitable for real-time gaming).Rate control method:
cbr (constant bitrate) or vbr (variable bitrate).Encoder latency preset.
lowest-latency minimizes buffering at the cost of some quality.Video bit depth.
8 or 10. 10-bit is only effective with DMA-BUF capture and a non-H264 codec.Distance between keyframes in seconds. Lower values allow faster seeking and recovery from packet loss but increase bandwidth usage.
Audio
Audio codec.
opus is the default and best choice for WebRTC.Target audio bitrate in kbps.
Maximum audio bitrate in kbps.
Audio capture backend.
pipewire is the default. The container runs WirePlumber and PipeWire services via supervisord.GPU selection
Select the GPU by vendor name (e.g.,
nvidia, amd, intel). Leave unset to use the first detected GPU.Select the GPU by name substring match.
Select the GPU by index when multiple GPUs are present.
Force a specific GPU by
/dev/dri/card* or /dev/dri/renderD* path. Cannot be used together with GPU_VENDOR, GPU_NAME, or GPU_INDEX.Launcher
The command run inside Gamescope to launch the game or launcher. Set by the flavor image. Override this to launch a different application. See custom launcher below.
GPU passthrough
Runner containers need access to the host GPU for hardware encoding. The method differs by vendor:- NVIDIA
- AMD / Intel
Use The container’s entrypoint script (
--gpus all (requires the NVIDIA Container Toolkit).packages/scripts/entrypoint.sh) detects the host NVIDIA driver version from /proc/driver/nvidia/version or nvidia-smi, downloads the matching installer, and installs the userspace driver components inside the container at startup.Launcher examples
- Steam
- Heroic (Epic/GOG)
- Minecraft
- Custom launcher
The Steam runner installs Steam from the Arch Linux package repositories and sets Mount a volume at
NESTRI_LAUNCH_CMD="steam -tenfoot -cef-force-gpu". This opens Steam in Big Picture mode with GPU-accelerated CEF rendering./home/nestri to persist your Steam library and login credentials across restarts.Persistent storage
Mount a named volume at/home/nestri to preserve game library files, saves, and launcher configuration across container restarts:
SSH access
The runner supports optional SSH access for debugging. SetSSH_ENABLE_PORT to a port number and SSH_ALLOWED_KEY to a public key to enable it:
sshd with public-key authentication only (no passwords) and starts the SSH daemon before launching the game session.