Example Systemd Setup
When starting niri from a display manager like GDM, or otherwise through the niri-session binary, it runs as a systemd service. This provides the necessary systemd integration to run programs like mako and services like xdg-desktop-portal bound to the graphical session.
Here's an example on how you might set up mako, waybar, swaybg and swayidle to run as systemd services with niri. In contrast to spawn-at-startup, this lets you easily monitor their status and output, and restart or reload them.
Install them, i.e.
sudo dnf install mako waybar swaybg swayidleCreate a
niri.service.wantsfolder:mkdir -p ~/.config/systemd/user/niri.service.wantsThis is a special systemd folder. Any services linked there will be started together with
niri.service(which is a systemd unit used by niri when running as a session).makoandwaybarprovide systemd units out of the box, so you can simply symlink them into theniri.service.wantsfolder:shln -s /usr/lib/systemd/user/mako.service ~/.config/systemd/user/niri.service.wants/ ln -s /usr/lib/systemd/user/waybar.service ~/.config/systemd/user/niri.service.wants/swaybgdoes not provide a systemd unit, since you need to pass the background image as a command-line argument. So we will make our own. Put the following into~/.config/systemd/user/swaybg.service:[Unit] PartOf=graphical-session.target After=graphical-session.target Requisite=graphical-session.target [Service] ExecStart=/usr/bin/swaybg -m fill -i "%h/Pictures/LakeSide.png" Restart=on-failureReplace the image path with the one you want.
%his expanded to your home directory.After editing
swaybg.service, runsystemctl --user daemon-reloadso systemd picks up the changes in the file.Now, also symlink this to
niri.service.wants:shln -s ~/.config/systemd/user/swaybg.service ~/.config/systemd/user/niri.service.wants/swayidlesimilarly does not provide a service so we will also make our own. Put the following into~/.config/systemd/user/swayidle.service:[Unit] PartOf=graphical-session.target After=graphical-session.target Requisite=graphical-session.target [Service] ExecStart=/usr/bin/swayidle -w timeout 601 'niri msg action power-off-monitors' timeout 600 'swaylock -f' before-sleep 'swaylock -f' Restart=on-failureThen, run
systemctl --user daemon-reloadand symlink this file toniri.service.wants:shln -s ~/.config/systemd/user/swayidle.service ~/.config/systemd/user/niri.service.wants/
That's it! Now these three utilities will be started together with the niri session and stopped when it exits. You can also restart them with a command like systemctl --user restart waybar.service, for example after editing their config files.
Running Programs Across Logout
When running niri as a session, exiting it (logging out) will kill all programs that you've started within. However, sometimes you want a program, like tmux, dtach or similar, to persist in this case. To do this, run it in a transient systemd scope:
systemd-run --user --scope tmux new-session