Skip to content

Releases

v0.1.0-pre1-1

v0.1.0-pre1-1 Pre-release
Pre-release

Choose a tag to compare

@nomi-san nomi-san released this 24 Sep 13:47

lowlat v0.1.0-pre1

First pre-release. A Linux host that stock Parsec clients and browsers connect to
unmodified, and the client half of the same library, on Linux.
The host is measured on one
desktop and described on every other, and the client is measured against established hosts;
read the limitations before installing.

What is attached

  • lowlat_0.1.0~pre1-1_amd64.deb -- the host: the service, the login tool, and the units
    that start the session helper and the tray with each login.
  • lowlatd-linux-x86_64-* -- the same service as a bare binary.
  • lowlat-sdk-linux-x86_64-*.tar.gz -- the C library (liblowlat.so, both halves) and its
    header (lowlat.h); FEATURES in the tarball says which halves the library carries.
  • lowlat-sdk-linux-x86_64-client-*.tar.gz -- the client half alone, with the demo client
    built against it.

The C interface is ABI 0.17. Nothing is promised about it before 1.0: minors append and
nothing moves, but a name that turns out wrong is corrected rather than kept.

The host

  • Streams a Linux desktop to any Parsec client: H.264 and HEVC, eight-bit and ten-bit,
    4:2:0 and 4:4:4 where every encoder on the machine codes it. Encoders: NVENC, VA-API
    (AMD, Intel), Vulkan Video. No software encoder; a machine without a hardware path is
    refused with the stage that failed named.
  • Captures below the compositor, so the login screen and an unattended machine stream too
    (with the SDDM-on-Wayland configuration shipped as an example).
  • Sound to the guests; a guest's microphone taken by the host.
  • Keyboard, pointer and pads through the kernel: an emulated Xbox 360 controller, and a
    guest's DualShock 4 or DualSense presented as itself, touchpad, motion, lights and
    rumble included.
  • The session side: layout and orientation followed live, a guest's request for a display
    size or a turn, the screen kept awake while somebody watches, the clipboard either way
    behind a setting, a tray with a kick per guest and the rate ceiling, a desktop
    notification when a guest arrives or leaves.
  • Browsers as guests on the same signaling, including the page in examples/web-client.

The client

The other half of the library connects to a host, established or this one, and hands the
application what it needs to show and play it:

  • Pictures decoded in hardware through VA-API (AMD, Intel) or NVIDIA's decoder, or in
    software through the machine's own libavcodec when it is an LGPL build; handed out as
    planes, or on NVIDIA as a device handle with no copy through the CPU. H.264 and HEVC,
    ten-bit and 4:4:4 where the decoder takes them, each preference masked by what the
    decoder was verified to decode. Every picture says its range and when it arrived.
  • Sound decoded to PCM for the application's own device; keyboard, mouse (absolute and
    relative), gamepads, and a DualShock 4 or DualSense sent as its own reports; the host's
    pointer as a picture; the guest list, rumble and the connection's figures as events.
  • A relay attempt for a host no direct path reaches, through a relay on the host's own
    machine behind the one port its router forwards.
  • The demo in the client tarball streams, plays and sends input in one window:
    LOWLAT_PEER=<host peer id> LOWLAT_SESSION=<session token> bin/client. A session comes
    from lowlat-login run without --install, which prints one; the demo's other knobs are
    listed at the top of examples/client/main.c.

Install

On Debian and its family:

sudo dpkg -i lowlat_0.1.0~pre1-1_amd64.deb
sudo lowlat-login --install      # interactive: a Parsec account, 2FA or mail confirmation

Elsewhere, from a checkout, packaging/install.sh puts the package's files in the same
places and enables the same units:

cargo build --release -p lowlatd
sudo packaging/install.sh        # --uninstall removes it again, the configuration kept
sudo lowlat-login --install

The login is the whole of the setup. The service starts at boot and, until it has been
logged in, says so and exits; the configuration is /etc/lowlat/lowlatd.env, where the
session lives, and a signaling server only when it is not the public one. To stream the
login screen, install /usr/share/doc/lowlat/sddm-10-wayland.conf.example as
/etc/sddm.conf.d/10-wayland.conf.

What the machine needs at run time is loaded, not linked: python3 for the login tool, a
sound server speaking the PulseAudio protocol (PipeWire's pulse server is one) and its client
library, and the user-space driver of the GPU that encodes -- NVIDIA's for NVENC; for VA-API,
Mesa's on AMD or Intel's media driver; the Vulkan loader for Vulkan Video. A Mesa built
without the H.264 and HEVC codecs, as some distributions ship it, offers VA-API no encoder at
all. The package itself requires libc6 >= 2.34, python3 and systemd.

Known limitations

The host is measured on one desktop: Debian 13, KDE Plasma on Wayland. A user has also
run it on an Arch-based distribution with KDE Plasma on Wayland and an AMD APU, serving a
stock client over VA-API. Everything else below is described, not run.

  • GNOME and X11 sessions: capture and encode do not depend on the desktop, but the
    session side does. GNOME lacks a clipboard mechanism and has a different mode-request
    interface, not built; an X11 session answers no layout query, so absolute input is
    correct on one output and wrong on two; X11 on the NVIDIA driver presents through no
    plane this can capture at all. See docs/09-compatibility.md §6.
  • NVIDIA: the oldest driver that offers the format-modifier extension capture needs is
    not established; 615.x is what is measured. See docs/09-compatibility.md §5.
  • The service runs as root, with a reduced capability set. Reading what the display
    scans out needs CAP_SYS_ADMIN, and the session's sockets admit their owner and root
    only. docs/07-platforms.md §6.1 is the reasoning.
  • No relative pointer mode on the host. An application that takes the pointer
    (mouselook) is not put into it; the session-side signal for it is deferred. Games that
    capture the mouse will not play well on this host yet.
  • One guest is the tested case for quality. Up to four are admitted; the per-guest
    pressure handling that protects the others from a starved one is open work, and a slow
    guest lowers the rate for the room.
  • Any local user may act on the host through the tray (kick, rate). Credentials are
    recorded on every action; authorising on them is deferred.
  • A guest's microphone is not a device other applications on the host can open.
  • The host codes the video range whatever a guest asks; the full range is a guest's
    preference, which a host may leave unmet.
  • The client is Linux only. Software decoding takes an LGPL libavcodec and refuses the
    GPL builds distributions usually ship, so the hardware decoders are the expected path;
    4:4:4 decodes on NVIDIA and on Intel's media driver, not on AMD.
  • Windows, host and client: planned, not in this release.
  • The login tool is interactive by design and stores a session token in
    /etc/lowlat/lowlatd.env (mode 0640).

Reporting

For the host, run lowlatd --verbose (through LOWLATD_ARGS= in the env file) and attach
journalctl -u lowlatd from the moment a guest connects. Say which distribution, desktop,
compositor, GPU and driver; lowlatd --outputs lists what the host sees. For the client,
attach the demo's own output and say which decoder it chose (its first lines list them).