Docker / Podman

On this page

The Lumen container image bundles a complete desktop environment — labwc or KDE Plasma, XWayland, and Firefox — on top of Ubuntu. It’s the fastest way to try Lumen without installing anything on your host system.

The instructions below use podman. docker works as a drop-in replacement for every command.


Pull the Image

Pre-built images are available on the GitHub Container Registry. Choose the desktop environment you want:

# labwc (lightweight Wayland compositor) — default
podman pull ghcr.io/swedishborgie/lumen:latest-labwc

# KDE Plasma 6
podman pull ghcr.io/swedishborgie/lumen:latest-kde
Image tag Desktop Terminal
latest-labwc (recommended) labwc — lightweight wlroots compositor foot
latest-kde KDE Plasma 6 (kwin_wayland + plasmashell) Konsole

Run the Container

Podman’s default NAT networking can interfere with WebRTC UDP flows even when ports are mapped. Using --network host bypasses NAT entirely and is the recommended approach:

podman run --rm -it --device /dev/dri --network host ghcr.io/swedishborgie/lumen:latest-labwc

Open http://localhost:8080 in a browser and click Connect.

No GPU (CPU / Pixman renderer)

Works on any Linux machine without a GPU:

podman run --rm -it --network host ghcr.io/swedishborgie/lumen:latest-labwc

AMD or Intel GPU passthrough

Pass the DRI device group to enable VA-API hardware encoding:

podman run --rm -it \
    --device /dev/dri \
    --security-opt label=disable \
    --network host \
    ghcr.io/swedishborgie/lumen:latest-labwc

NVIDIA GPU passthrough (CDI)

Requires the NVIDIA Container Toolkit (CDI) on the host:

podman run --rm -it \
    --device nvidia.com/gpu=all \
    --security-opt label=disable \
    --network host \
    ghcr.io/swedishborgie/lumen:latest-labwc

Gamepad / joystick passthrough

Lumen can forward browser gamepad input to virtual Linux input devices via uinput. Pass /dev/uinput and add the input group to enable this:

podman run --rm -it \
    --device /dev/uinput \
    --group-add input \
    --network host \
    ghcr.io/swedishborgie/lumen:latest-labwc

The uinput kernel module must be loaded on the host (lsmod | grep uinput). Load it with sudo modprobe uinput if not. The input group is granted write access to /dev/uinput by the udev rule installed with the package (pkgs/70-lumen-uinput.rules). If /dev/uinput is not passed, Lumen starts normally and gamepad support is simply disabled.

You can combine --device /dev/uinput --group-add input with GPU passthrough flags as needed.

Port mapping (alternative to host networking)

If you prefer explicit port mapping instead of --network host:

podman run --rm -it \
    --device /dev/dri \
    --security-opt label=disable \
    -p 8080:8080 \
    -p 3478:3478/udp \
    -p 50000-50010:50000-50010/udp \
    ghcr.io/swedishborgie/lumen:latest-labwc

Port Reference

Port Protocol Purpose
8080 TCP HTTP server + WebSocket signaling
3478 UDP TURN server (NAT traversal control)
50000–50010 UDP TURN relay data channels

The embedded TURN server handles NAT traversal automatically. The browser receives TURN credentials via /api/config — no manual configuration is required.

To disable the TURN server:

podman run ... -e LUMEN_TURN_PORT=0 ghcr.io/swedishborgie/lumen:latest-labwc

Remote Access

To allow WebRTC connections from other machines on your network, set LUMEN_TURN_EXTERNAL_IP to the host’s reachable IP address:

podman run --rm -it \
    --device /dev/dri \
    --security-opt label=disable \
    --network host \
    -e LUMEN_TURN_EXTERNAL_IP=192.168.1.100 \
    ghcr.io/swedishborgie/lumen:latest-labwc

Environment Variables

Variable Default Description
LUMEN_BIND 0.0.0.0:8080 HTTP server bind address
LUMEN_DRI_NODE (auto-detected) Override the DRI render node (e.g. /dev/dri/renderD128)
LUMEN_TURN_PORT 3478 TURN server UDP port. Set to 0 to disable.
LUMEN_TURN_EXTERNAL_IP 127.0.0.1 IP advertised as the TURN relay address
LUMEN_TURN_USERNAME (auto-generated) TURN credential username
LUMEN_TURN_PASSWORD (auto-generated) TURN credential password
LUMEN_TURN_MIN_PORT 50000 Start of TURN relay UDP port range
LUMEN_TURN_MAX_PORT 50010 End of TURN relay UDP port range
LUMEN_WIDTH 1920 Output width in pixels
LUMEN_HEIGHT 1080 Output height in pixels
LUMEN_FPS 30.0 Target frames per second
LUMEN_VIDEO_BITRATE_KBPS 4000 Video encoder target bitrate (kbps)

SELinux / AppArmor Note

On hosts with SELinux or AppArmor enforcement, GPU device passthrough may require additional flags:

--security-opt label=disable        # SELinux
--security-opt apparmor=unconfined  # AppArmor

What’s Inside the Image

labwc image (DESKTOP=labwc, default)

Component Purpose
lumen The compositor/streamer binary
labwc Inner Wayland compositor (the desktop you stream)
xwayland XWayland bridge for X11 apps
firefox Browser — auto-started by labwc on launch
foot Terminal emulator (available in the labwc right-click menu)
pipewire Audio server for audio capture

KDE image (DESKTOP=kde)

Component Purpose
lumen The compositor/streamer binary
kwin_wayland KDE window manager / inner Wayland compositor
plasmashell KDE Plasma desktop shell
xwayland XWayland bridge for X11 apps
firefox Browser — auto-started on launch
konsole KDE terminal emulator
pipewire Audio server for audio capture

Lumen is open source software.

This site uses Just the Docs, a documentation theme for Jekyll.