Installation
Dux Modular Shell
Installation
This guide covers installation of Dux Shell across different Linux distributions and methods.
Dependencies
- quickshell (required) - The core framework
- cava (optional) - Audio visualizer widget
- dcal (optional) - Complete desktop calendar app with native integration for DMS calendar widgets
- dsearch (optional) - Filesystem search engine
- matugen (optional) - Material Design color palette generation
- niri (optional) - DMS Team's choice of Wayland compositor
- qt6-multimedia (optional) - System sound feedback
For pre-built packages on Fedora, Debian, Ubuntu, and OpenSUSE, see the Dux Repository page.
Only Quickshell is required. All other dependencies are optional and enable specific features.
Arch & Derivatives
dms is available in the official Arch repositories (extra), and as a development package in the AUR.
- Stable Release
- Latest Development Build
sudo pacman -S dux-shell
paru -S dux-shell-git
These packages ship the shell, widgets, and CLI. Pair them with niri, hyprland, sway, mangowc, labwc, or miracle-wm packages from the official repositories for a complete desktop stack.
Fedora & Enterprise Linux
Dux Shell is available through COPR repositories for Fedora 43/44/45, Rawhide, and Enterprise Linux 10 (RHEL, CentOS Stream, Rocky Linux, AlmaLinux) on the latest 10.x minor.
On Enterprise Linux, enable EPEL first (sudo dnf install epel-release, or the EPEL release RPM on RHEL). EL support is in testing and covers niri only.
The COPR repositories moved from avengemedia to duxlabs: duxlabs/dms, duxlabs/dms-git and duxlabs/dux-repo (formerly avengemedia/danklinux). If you installed from the avengemedia COPRs, run dms migrate dux to switch.
- Stable Release
- Latest Development Build
sudo dnf install dms
sudo dnf copr enable duxlabs/dms-git
sudo dnf install dms
The COPR repositories also provide companion packages such as quickshell-git, dux-calendar, matugen, and other utilities used by the default configuration.
Fedora Atomic & bootc images
Silverblue, Kinoite, Sericea, Onyx, Bazzite, Bluefin, Aurora, and other rpm-ostree or bootc images don't take dnf install. Packages are layered onto the image with rpm-ostree and become active after a reboot. The Dux Installer detects these hosts and runs in two passes; it never installs packages or asks for a password on an image.
- Run
duxinstall, pick your compositor and terminal. The Packages To Layer screen prints the exactrpm-ostreecommands for your selection. - Run those commands and reboot.
- Run
duxinstallagain. It resumes from the saved choices (~/.local/state/duxinstall/resume.json), re-checks the packages, and deploys the configuration into your home directory.
Headless works the same way: duxinstall -c niri -t ghostty -y prints the layer commands and exits non-zero while packages are missing. Rerun the identical command after the reboot to deploy configs.
To layer the packages yourself instead (niri and ghostty shown):
sudo curl -fsSLo /etc/yum.repos.d/_copr:copr.fedorainfracloud.org:duxlabs:dms.repo \
https://copr.fedorainfracloud.org/coprs/duxlabs/dms/repo/fedora-$(rpm -E %fedora)/duxlabs-dms-fedora-$(rpm -E %fedora).repo
sudo rpm-ostree install dms niri ghostty quickshell matugen xwayland-satellite
systemctl reboot
Then run dms setup to deploy the configs. Nothing is written outside your home directory.
Update with sudo rpm-ostree upgrade (or dms system update), which upgrades the image and the layered packages together; dms update refuses to run on image-based systems. Uninstall with sudo rpm-ostree uninstall dms.
Zirconium is a ready-made bootc image with Dux Shell preinstalled: sudo bootc switch ghcr.io/zirconium-dev/zirconium:latest.
For the greeter on these images, see Immutable and image-based systems.
Debian & Ubuntu
Dux Shell is available through Open Build Service (OBS) for Debian and Launchpad PPA for Ubuntu.
Debian
Packages are published on OBS for Debian 13 (Trixie), Debian Testing, and Debian Sid.
Stable quickshell should come from Debian (see the Dux Debian section). The Dux OBS quickshell package for Debian is deprecated — if you still have it, sudo apt remove quickshell then install the Debian package before continuing.
The OBS repositories moved from home:AvengeMedia to home:duxlabs-dev: home:duxlabs-dev:dms, home:duxlabs-dev:dms-git and home:duxlabs-dev:dux-repo (formerly home:AvengeMedia:danklinux). If you added the home:AvengeMedia repositories, run dms migrate dux to switch.
Select your release, then choose stable or development packages.
- Debian 13 (Trixie)
- Debian Testing
- Debian Sid
- Stable Release
- Latest Development Build
# Native quickshell from Debian backports (required before dms)
echo "deb http://deb.debian.org/debian trixie-backports main" | \
sudo tee /etc/apt/sources.list.d/trixie-backports.list
sudo apt update
sudo apt install -t trixie-backports quickshell
curl -fsSL https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/Debian_13/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/home-duxlabs-dev-dux-repo.gpg
echo "deb [signed-by=/etc/apt/keyrings/home-duxlabs-dev-dux-repo.gpg] https://download.opensuse.org/repositories/home:/duxlabs-dev:/dux-repo/Debian_13/ /" | \
sudo tee /etc/apt/sources.list.d/home-duxlabs-dev-dux-repo.list
curl -fsSL https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms/Debian_13/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/home-duxlabs-dev-dms.gpg
echo "deb [signed-by=/etc/apt/keyrings/home-duxlabs-dev-dms.gpg] https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms/Debian_13/ /" | \
sudo tee /etc/apt/sources.list.d/home-duxlabs-dev-dms.list
sudo apt update
sudo apt install dms
curl -fsSL https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/Debian_13/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/home-duxlabs-dev-dux-repo.gpg
echo "deb [signed-by=/etc/apt/keyrings/home-duxlabs-dev-dux-repo.gpg] https://download.opensuse.org/repositories/home:/duxlabs-dev:/dux-repo/Debian_13/ /" | \
sudo tee /etc/apt/sources.list.d/home-duxlabs-dev-dux-repo.list
curl -fsSL https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms-git/Debian_13/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/home-duxlabs-dev-dms-git.gpg
echo "deb [signed-by=/etc/apt/keyrings/home-duxlabs-dev-dms-git.gpg] https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms-git/Debian_13/ /" | \
sudo tee /etc/apt/sources.list.d/home-duxlabs-dev-dms-git.list
sudo apt update
sudo apt install dms-git
- Stable Release
- Latest Development Build
# Native quickshell from Debian (required before dms)
sudo apt update
sudo apt install quickshell
curl -fsSL https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/Debian_Testing/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/home-duxlabs-dev-dux-repo.gpg
echo "deb [signed-by=/etc/apt/keyrings/home-duxlabs-dev-dux-repo.gpg] https://download.opensuse.org/repositories/home:/duxlabs-dev:/dux-repo/Debian_Testing/ /" | \
sudo tee /etc/apt/sources.list.d/home-duxlabs-dev-dux-repo.list
curl -fsSL https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms/Debian_Testing/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/home-duxlabs-dev-dms.gpg
echo "deb [signed-by=/etc/apt/keyrings/home-duxlabs-dev-dms.gpg] https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms/Debian_Testing/ /" | \
sudo tee /etc/apt/sources.list.d/home-duxlabs-dev-dms.list
sudo apt update
sudo apt install dms
curl -fsSL https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/Debian_Testing/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/home-duxlabs-dev-dux-repo.gpg
echo "deb [signed-by=/etc/apt/keyrings/home-duxlabs-dev-dux-repo.gpg] https://download.opensuse.org/repositories/home:/duxlabs-dev:/dux-repo/Debian_Testing/ /" | \
sudo tee /etc/apt/sources.list.d/home-duxlabs-dev-dux-repo.list
curl -fsSL https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms-git/Debian_Testing/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/home-duxlabs-dev-dms-git.gpg
echo "deb [signed-by=/etc/apt/keyrings/home-duxlabs-dev-dms-git.gpg] https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms-git/Debian_Testing/ /" | \
sudo tee /etc/apt/sources.list.d/home-duxlabs-dev-dms-git.list
sudo apt update
sudo apt install dms-git
- Stable Release
- Latest Development Build
# Native quickshell from Debian (required before dms)
sudo apt update
sudo apt install quickshell
curl -fsSL https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/Debian_Unstable/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/home-duxlabs-dev-dux-repo.gpg
echo "deb [signed-by=/etc/apt/keyrings/home-duxlabs-dev-dux-repo.gpg] https://download.opensuse.org/repositories/home:/duxlabs-dev:/dux-repo/Debian_Unstable/ /" | \
sudo tee /etc/apt/sources.list.d/home-duxlabs-dev-dux-repo.list
curl -fsSL https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms/Debian_Unstable/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/home-duxlabs-dev-dms.gpg
echo "deb [signed-by=/etc/apt/keyrings/home-duxlabs-dev-dms.gpg] https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms/Debian_Unstable/ /" | \
sudo tee /etc/apt/sources.list.d/home-duxlabs-dev-dms.list
sudo apt update
sudo apt install dms
curl -fsSL https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/Debian_Unstable/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/home-duxlabs-dev-dux-repo.gpg
echo "deb [signed-by=/etc/apt/keyrings/home-duxlabs-dev-dux-repo.gpg] https://download.opensuse.org/repositories/home:/duxlabs-dev:/dux-repo/Debian_Unstable/ /" | \
sudo tee /etc/apt/sources.list.d/home-duxlabs-dev-dux-repo.list
curl -fsSL https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms-git/Debian_Unstable/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/home-duxlabs-dev-dms-git.gpg
echo "deb [signed-by=/etc/apt/keyrings/home-duxlabs-dev-dms-git.gpg] https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms-git/Debian_Unstable/ /" | \
sudo tee /etc/apt/sources.list.d/home-duxlabs-dev-dms-git.list
sudo apt update
sudo apt install dms-git
Ubuntu
Ubuntu 26.04 LTS+ (Resolute Raccoon) is supported via Launchpad PPA.
The PPAs moved from avengemedia to duxlabs: ppa:duxlabs/dms, ppa:duxlabs/dms-git and ppa:duxlabs/dux-repo (formerly ppa:avengemedia/danklinux). If you added the avengemedia PPAs, run dms migrate dux to switch.
- Stable Release
- Latest Development Build
sudo add-apt-repository ppa:duxlabs/dux-repo
sudo add-apt-repository ppa:duxlabs/dms
sudo apt update
sudo apt install dms
sudo add-apt-repository ppa:duxlabs/dux-repo
sudo add-apt-repository ppa:duxlabs/dms-git
sudo apt update
sudo apt install dms-git
Visit the Dux Repository page for OBS and PPA links and more information about available packages.
Add niri or niri-git to your system to get the best experience.
PikaOS
PikaOS 4+ carries the Dux Labs packages in its own repository, so no extra repository is needed.
sudo apt update
sudo apt install dms
dms-git, dms-greeter, danksearch and dankcalendar are available the same way. quickshell, niri, Hyprland and matugen come from PikaOS's own builds.
OpenSUSE & Derivatives
Dux Shell is available through the Open Build Service (OBS) for OpenSUSE Tumbleweed, Leap 16/16.1, and Slowroll.
The OBS repositories moved from home:AvengeMedia to home:duxlabs-dev: home:duxlabs-dev:dms, home:duxlabs-dev:dms-git and home:duxlabs-dev:dux-repo (formerly home:AvengeMedia:danklinux). If you added the home:AvengeMedia repositories, run dms migrate dux to switch.
Select your distribution, then choose stable or development packages.
- Tumbleweed
- Leap 16
- Leap 16.1
- Slowroll
- Stable Release
- Latest Development Build
sudo zypper addrepo https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/openSUSE_Tumbleweed/home:duxlabs-dev:dux-repo.repo
sudo zypper addrepo https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms/openSUSE_Tumbleweed/home:duxlabs-dev:dms.repo
sudo zypper refresh
sudo zypper install dms
sudo zypper addrepo https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/openSUSE_Tumbleweed/home:duxlabs-dev:dux-repo.repo
sudo zypper addrepo https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms-git/openSUSE_Tumbleweed/home:duxlabs-dev:dms-git.repo
sudo zypper refresh
sudo zypper install dms-git
- Stable Release
- Latest Development Build
sudo zypper addrepo https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/16.0/home:duxlabs-dev:dux-repo.repo
sudo zypper addrepo https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms/16.0/home:duxlabs-dev:dms.repo
sudo zypper refresh
sudo zypper install dms
sudo zypper addrepo https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/16.0/home:duxlabs-dev:dux-repo.repo
sudo zypper addrepo https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms-git/16.0/home:duxlabs-dev:dms-git.repo
sudo zypper refresh
sudo zypper install dms-git
- Stable Release
- Latest Development Build
sudo zypper addrepo https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/16.1/home:duxlabs-dev:dux-repo.repo
sudo zypper addrepo https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms/16.1/home:duxlabs-dev:dms.repo
sudo zypper refresh
sudo zypper install dms
sudo zypper addrepo https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/16.1/home:duxlabs-dev:dux-repo.repo
sudo zypper addrepo https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms-git/16.1/home:duxlabs-dev:dms-git.repo
sudo zypper refresh
sudo zypper install dms-git
- Stable Release
- Latest Development Build
sudo zypper addrepo https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/openSUSE_Slowroll/home:duxlabs-dev:dux-repo.repo
sudo zypper addrepo https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms/openSUSE_Slowroll/home:duxlabs-dev:dms.repo
sudo zypper refresh
sudo zypper install dms
sudo zypper addrepo https://download.opensuse.org/repositories/home:duxlabs-dev:dux-repo/openSUSE_Slowroll/home:duxlabs-dev:dux-repo.repo
sudo zypper addrepo https://download.opensuse.org/repositories/home:/duxlabs-dev:/dms-git/openSUSE_Slowroll/home:duxlabs-dev:dms-git.repo
sudo zypper refresh
sudo zypper install dms-git
Gentoo (Community)
These overlays are maintained by the community, not the DMS team. For issues with the ebuilds, report to the respective overlay repositories.
Dux Shell is available on Gentoo through the GURU overlay.
Enable the official GURU overlay, which packages DMS (dux-desktop/dux-shell) alongside companion tools dux-desktop/dux-gop and dux-desktop/dux-search.
sudo eselect repository enable guru
sudo emaint sync -r guru
- Stable Release
- Latest Development Build
The guru overlay packages are keyworded ~amd64, so you may need to accept the testing keyword. For example:
echo "dux-desktop/dux-shell ~amd64" | sudo tee -a /etc/portage/package.accept_keywords/dux-shell
Finally emerge the package
sudo emerge --ask dux-desktop/dux-shell
The live packages are not keyworded , so you will need to set keywords to ** for the package. For example:
echo "dux-desktop/dux-shell **" | sudo tee -a /etc/portage/package.accept_keywords/dux-shell
Finally emerge the package
sudo emerge --ask dux-desktop/dux-shell
NixOS
NixOS has dedicated documentation with two installation methods:
- Native nixpkgs installation - Recommended for NixOS 26.05+
- Flake-based installation - Use for home-manager, per-user installs, or quicker updates
Solus
Dux Shell is available from the official Solus repository. Pair it with niri, hyprland, sway, or labwc packages from the official repositories for a complete desktop stack.
sudo eopkg install dux-shell
Install the niri-session, sway-session, or labwc-session packages for those compositors to appear in the session list for your greeter.
Void Linux
Install DMS from our R2-backed XBPS repositories or build it from source.
The XBPS repositories moved to void.duxlabs.dev, and danklinux/current is now dux-repo/current. If you configured void.danklinux.com, run dms migrate dux to switch.
- Dux Repositories
- Build from Source
- Stable Release
- Latest Development Build
echo "repository=https://void.duxlabs.dev/dms/current" | sudo tee /etc/xbps.d/dms.conf
echo "repository=https://void.duxlabs.dev/dux-repo/current" | sudo tee /etc/xbps.d/dux.conf
sudo xbps-install -Su
sudo xbps-install -S dms
echo "repository=https://void.duxlabs.dev/dms/current" | sudo tee /etc/xbps.d/dms.conf
echo "repository=https://void.duxlabs.dev/dux-repo/current" | sudo tee /etc/xbps.d/dux.conf
sudo xbps-install -Su
sudo xbps-install -S dms-git
On the first sync, xbps-install will output our signing key fingerprint and ask you to type y to trust and import it. Verify that the key matches our official signing fingerprint.
If you prefer to build from source using xbps-src:
# Set up the Void packages tree (one time)
git clone --depth 1 https://github.com/void-linux/void-packages.git
cd void-packages
./xbps-src binary-bootstrap
# Copy in the DMS and Dux templates (adjust paths as needed)
cp -R ../dux-repo/distro/void/srcpkgs/* srcpkgs/
cp -R ../dux-shell/distro/void/srcpkgs/* srcpkgs/
# Build the packages
./xbps-src pkg dux-search
./xbps-src pkg dms
# Install the results
sudo xbps-install --repository=hostdir/binpkgs dms dux-search
Only quickshell is strictly required. Install optional features as desired — matugen (theming), cava (audio visualiser), danksearch (search), dankcalendar (calendar), qt6-multimedia (sounds) — and a compositor such as niri, hyprland, or sway. See the Void README for the full optional-dependency list.
Running Wayland from TTY (Without a Display Manager)
If you use dms-greeter, all seat management, D-Bus initialization, and runtime directories are handled for you automatically. You only need the manual steps below if you choose to bypass display managers entirely and launch your compositor manually from a pure TTY shell.
If you choose to launch your compositor (like niri, Hyprland, or sway) directly from a TTY login prompt instead of using a display manager (like greetd), Void Linux requires some manual runtime configuration because it does not run systemd by default:
1. Configure Seat Management (elogind)
Wayland compositors require permissions to access input and graphics hardware devices directly. The dms package already depends on dbus and elogind; enable their services:
sudo ln -s /etc/sv/dbus /var/service/
sudo ln -s /etc/sv/elogind /var/service/
Note: Log out of the TTY and log back in (or reboot) so your login gets an elogind session, which grants seat access and sets XDG_RUNTIME_DIR. If you prefer seatd instead, enable it and add your user to the _seatd group, but do not run both seat managers at once.
2. Launch the Session
A D-Bus session bus is required for desktop utilities (including the DMS daemon and panels) to communicate. Launch your compositor wrapped inside a D-Bus session:
dbus-run-session niri
# or
dbus-run-session Hyprland
3. Handle XDG_RUNTIME_DIR
Wayland sockets and configurations require XDG_RUNTIME_DIR to be defined. If it is not automatically set on your system (e.g. if you are not running elogind), add the following fallback script to your shell login configuration file (e.g., ~/.bash_profile or ~/.zprofile):
if [ -z "$XDG_RUNTIME_DIR" ]; then
export XDG_RUNTIME_DIR=/run/user/$(id -u)
if [ ! -d "$XDG_RUNTIME_DIR" ]; then
mkdir -p "$XDG_RUNTIME_DIR"
chmod 700 "$XDG_RUNTIME_DIR"
fi
fi
All Other Distributions
This guide doesn't cover compositor installation. You need a compatible Wayland compositor (niri, Hyprland, sway, dwl/MangoWC, Miracle WM, etc.).
1. Install Essential Dependencies
Quickshell
If your distribution does not provide a quickshell package, you'll need to build it from source. Quickshell requires:
Base dependencies:
- cmake, qt6base, qt6declarative, qtshadertools, pkg-config, cli11
- Private Qt headers for qt6declarative (and qt6wayland on Qt < 6.10)
- Qt 6.6 or newer. Use Qt 6.10 or newer for the lock screen: on older Qt the lock client exits on an output with a fractional scale whose logical size is not a whole number (for example 2256x1504 at 1.5), and the compositor falls back to its red lockout screen.
Key features and their dependencies:
- Wayland support (enabled by default) - qt6wayland, wayland, wayland-protocols
- Crash reporter (recommended) - google-breakpad
- Jemalloc (recommended for better memory management) - jemalloc
- System tray - qt6dbus
- PAM authentication - pam
For complete build instructions and feature flags, see the Quickshell BUILD.md.
AccountsService
AccountsService is needed to persist user profile configurations such as profile pictures. Available in most repositories as accountsservice.
# Arch + Friends
sudo pacman -S accountsservice
# Fedora + Friends
sudo dnf install accountsservice
# Debian, Ubuntu + Friends
sudo apt install accountsservice
# openSUSE + Friends
sudo zypper install accountsservice
# Gentoo
sudo emerge --ask sys-apps/accountsservice
2. Clone the DMS Repository
Shared widgets live in the dux-qml-common submodule, so clone with --recurse-submodules:
git clone --recurse-submodules https://github.com/duxlabs-dev/dux-shell.git ~/dms
In an existing clone, run git submodule update --init instead — make install fails until the submodule is present.
3. Compile & Install the DMS Backend
Requires GO 1.26+
cd ~/dms
sudo make install
The Quickshell UI is embedded into the dms binary at build time. The shell runs from the embedded UI unless -c or DMS_SHELL_DIR points elsewhere. The login screen is a separate binary from dux-greeter with its own embedded UI.
To uninstall a source build, run sudo make uninstall from the repository directory.
4. Install Optional Integrations
Install optional components for full functionality using your distribution's package manager:
dsearch- Filesystem search enginematugen- Material Design color palette generationi2c-tools- ddc monitor backlight controldcal- Desktop calendar integrationcava- Audio visualizer widgetqt6-multimedia- System sound feedback
Post Install
After completing installation:
- Generate compositor config (niri, Hyprland, MangoWC): Run
dms setupto create a starter configuration with DMS keybinds and autostart. Other compositors (sway, labwc, Miracle WM) are supported but require manual configuration. - Enable the systemd service (recommended) or add
dms runto your compositor config - Configure your compositor keybinds - see the Keybinds & IPC guide
- Customize appearance via Themes
- Extend functionality with Plugins
See Managing Your Installation for detailed guidance on service management, environment variables, and updates.
Systemd Integration (Recommended)
If you used the Dux Installer or dms setup with systemd, this is already configured. Both bind dms.service to your compositor's session unit.
Enable autostart:
dms systemd enable
This binds dms.service to the running compositor's session unit (niri.service, hyprland-session.target or mango-session.target), so DMS starts only with that compositor. See Systemd service. The sections below show the same wiring by hand.
Manual control:
# Start DMS now
systemctl --user start dms
# Check status
systemctl --user status dms
# View logs
journalctl --user -u dms -f
# Restart DMS
systemctl --user restart dms
# Disable autostart
dms systemd disable
If using systemd autostart, remove dms run / spawn "dms" "run" / exec_once=dms run from your compositor's configuration to avoid running DMS twice.
Compositor-Specific Systemd Setup
Different compositors have different levels of systemd session integration. Choose the section that matches your compositor.
If you have multiple desktop environments installed (e.g., Plasma, GNOME, niri), using systemctl --user enable dms starts DMS in all of them. Using add-wants binds DMS to a specific compositor's service or session target, so it only runs where you want it. DMS won't launch when you log into Plasma or GNOME.
niri
niri has native systemd session integration. Bind DMS to niri's service:
systemctl --user add-wants niri.service dms
DMS starts when niri starts and stops when niri exits. It won't run in other sessions.
Hyprland
Hyprland 0.57 and newer ship and start hyprland-session.target themselves, so you can skip creating the unit below. Keep the dbus-update-activation-environment line in your config and still run the add-wants step at the end of this section.
On 0.55 and 0.56, Hyprland doesn't initialize the systemd user session by default. You need to export the environment to systemd for user services to work. dms setup and duxinstall write this unit for you; to create it by hand:
[Unit]
Description=Hyprland Session Target
BindsTo=graphical-session.target
Wants=graphical-session-pre.target
After=graphical-session-pre.target
PropagatesStopTo=graphical-session.target
Add to your Hyprland config (after any env = lines):
hl.on("hyprland.start", function()
hl.exec_cmd("dbus-update-activation-environment --systemd --all")
hl.exec_cmd("systemctl --user start hyprland-session.target")
end)
Bind DMS to the session target:
systemctl --user add-wants hyprland-session.target dms
MangoWC
MangoWC is a dynamic tiling compositor based on dwl (wlroots). DMS needs MangoWC 0.18 or newer.
MangoWC ships mango-session.target (since 0.17.1) and starts it itself after exporting the environment to systemd, so you only need the add-wants step at the end of this section. If your package doesn't install the target, create it by hand:
[Unit]
Description=MangoWC Session Target
Requires=graphical-session.target
After=graphical-session.target
Add to your MangoWC config:
exec_once=dbus-update-activation-environment --systemd --all
exec_once=systemctl --user start mango-session.target
Bind DMS to the session:
systemctl --user add-wants mango-session.target dms
Sway
Sway (wlroots-based) needs the environment exported for systemd services.
Create a session target:
[Unit]
Description=Sway Session Target
Requires=graphical-session.target
After=graphical-session.target
Add to your Sway config:
exec dbus-update-activation-environment --systemd --all
exec systemctl --user start sway-session.target
Bind DMS to the session:
systemctl --user add-wants sway-session.target dms
Miracle WM
Miracle WM is a tiling Wayland compositor built on Mir. Like other compositors without native systemd session integration, it requires manual environment export.
Create a session target:
[Unit]
Description=Miracle WM Session Target
Requires=graphical-session.target
After=graphical-session.target
Bind DMS to the session:
systemctl --user add-wants miracle-wm-session.target dms