Running as a Service
Start the host at boot, for a desktop you log into, or a fully headless always-on machine.
Running serve in a terminal is fine for trying Slipstream out. To make a machine an
always-available host, run it as a service. That is the usual setup when you leave a workstation at
home and connect from the office (Desktop at work). First, what that service
starts, then the two cases, a desktop you log into and a fully headless box.
What the unit starts
The bundled unit runs serve --gamestream, so it serves both the native slipstream/1 plane and
stock Moonlight clients. Every Linux package installs that unit as it ships and
only rewrites the binary path, so a host you installed from apt, dnf, pacman or the Bazzite sysext
has GameStream on. See what yours starts:
systemctl --user cat slipstream-hostFor a native-only host (no GameStream, its pairing runs over plain HTTP and its legacy
encryption is weaker; see Security & Safe Use), drop the flag. The packaged unit is
a package file that an upgrade replaces, so override ExecStart with a drop-in rather than editing
it:
systemctl --user edit slipstream-host[Service]
ExecStart=
ExecStart=/usr/bin/slipstream-host serveThe empty ExecStart= is required, without it systemd adds a second command instead of replacing
the first, and the path must match the one systemctl --user cat printed (the distro packages use
/usr/bin). Save, then systemctl --user restart slipstream-host.
A. A desktop you log into
If you sit at the machine (or it auto-logs-in to a desktop), run the host as a systemd user service that starts with your session.
Put your host.env in place first. The unit reads ~/.config/slipstream/host.env and won't start
until that file exists, no package creates it for you, they only ship a template to copy. The
defaults in it are right for an ordinary desktop; your distro and desktop guides say if yours wants
a different template (on Bazzite it's host.env.bazzite):
mkdir -p ~/.config/slipstream
# /usr/share/slipstream/ on Fedora/Arch/Bazzite, /usr/share/slipstream-host/ on Ubuntu
cp /usr/share/slipstream/host.env.example ~/.config/slipstream/host.envInstalled from a package (apt, dnf, pacman, or the Bazzite sysext), the unit is already at
/usr/lib/systemd/user/slipstream-host.service, with its ExecStart pointing at the installed
binary. There's nothing to copy:
systemctl --user daemon-reload # the sysext route needs this; harmless elsewhere
systemctl --user enable --now slipstream-hostBuilt from source, install the unit from your checkout, and take host.env from there too
(cp scripts/host.env.example ~/.config/slipstream/host.env). The unit's ExecStart points at
%h/slipstream/target/release/slipstream-host (%h is your home directory), so edit the copy if your
checkout lives somewhere else:
mkdir -p ~/.config/systemd/user
cp scripts/slipstream-host.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now slipstream-hostDon't do the copy on a packaged install: a unit in ~/.config/systemd/user/ shadows the packaged
one, and the source unit points at a build tree you don't have, the service then fails with
status=203/EXEC.
The host now starts whenever you log in. Check it with systemctl --user status slipstream-host.
You don't need to export anything for it. The host finds the live compositor session itself on
every connect and works out where to reach it (WAYLAND_DISPLAY, XDG_RUNTIME_DIR, the session bus,
sway's SWAYSOCK, Hyprland's instance signature) from the running compositor, so host.env is for
policy, not session plumbing, and systemctl --user import-environment is not a prerequisite.
Restart the host with your desktop
Add one drop-in so the host follows your session's lifetime:
mkdir -p ~/.config/systemd/user/slipstream-host.service.d
# /usr/share/slipstream/ on Fedora/Arch/Bazzite, /usr/share/slipstream-host/ on Ubuntu,
# scripts/ in a source checkout
cp /usr/share/slipstream/slipstream-host-desktop-session.conf \
~/.config/systemd/user/slipstream-host.service.d/desktop-session.conf
systemctl --user daemon-reload
systemctl --user reenable slipstream-host
systemctl --user restart slipstream-hostWithout it, restarting Plasma or GNOME, a crash, a log out and back in, "restart the shell", leaves the host running against a compositor that no longer exists. It keeps listening and answering, and every session after that fails at capture, which is a confusing way to find out. The drop-in makes a compositor restart a host restart.
Skip it on the headless/appliance route below (which has its own session unit), and on Sway or
Hyprland, which don't hand their session to systemd: they never reach graphical-session.target, so
the drop-in is harmless there but does nothing. To make the host come and go with the session on
those, start it from the compositor's own config instead of enabling the unit, add
exec systemctl --user start slipstream-host to your sway config, or
exec-once = systemctl --user start slipstream-host to Hyprland's, and leave the unit itself
disabled (systemctl --user disable slipstream-host), so it isn't also started at login.
B. A headless, always-on host
To run with no monitor and no login, a machine in a closet that's always ready, you need two things: a desktop session that comes up at boot, and the host service started without a login.
Start by making the host service start at boot even when nobody logs in:
sudo loginctl enable-linger "$USER"Then bring up a session automatically. How you do that is desktop-specific, auto-login, lock disable, and the session unit differ per compositor, so each is documented on its own page:
- GNOME: GNOME -> Headless session.
- KDE Plasma: KDE -> Headless session.
- Steam / gamescope: gamescope, the host launches its own session per client, so there's no separate session unit.
Once a session comes up at boot, enable the host user service (section A) and reboot. The host comes up on that session.
Headless Bazzite
On Bazzite, the host launches its own gamescope/Steam session per client, so you don't need a separate session unit, see Bazzite and gamescope.
Verifying
After a reboot, from another machine on the network:
slipstream reachable 192.168.1.50 # exit 0 = the host answered, 2 = it didn't
slipstream hosts list --probe # every saved host, online or offlineslipstream is the headless client CLI that ships with client tooling where packaged. From a source
checkout, slipstream-probe --discover browses the LAN instead; it's a dev tool and isn't packaged.
Or just open a native client / Moonlight and look for the host.
If the host answers, it's up. If not, check journalctl --user -u slipstream-host on the host.
Stopping and removing
After a package update the user service keeps running the old binary until it's restarted, and
a package can't restart another user's --user units for you, Updating has the
update command for every install method and the restart that finishes the job.
To stop the host for now:
systemctl --user stop slipstream-hostTo stop it for good, so it doesn't come back at login or boot:
# add slipstream-web (the console) and slipstream-kde-session (the headless KDE route) if you enabled them
systemctl --user disable --now slipstream-host
rm -rf ~/.config/systemd/user/slipstream-host.service.d # any drop-ins you added
sudo loginctl disable-linger "$USER" # only if you enabled lingeringNeither removes ~/.config/slipstream, your certificate, pairings and console password stay, so a
reinstall picks up where you left off. See Uninstall to clear them out.
