Skip to main content
Version: 2.2

Compositor Setup

Dux Modular Shell

Compositor Setup

Dux Modular Shell works with any Wayland compositor, but we provide optimized configurations for niri, Hyprland, Sway, mangowm, labwc, and Miracle WM. These configs include DMS-specific keybindings, proper layer shell rules, and recommended settings.

niri Configuration​

niri uses the KDL configuration format. Dux Modular Shell integrates seamlessly with niri's scrollable tiling layout.

Key Configuration Sections​

DMS will automatically apply key binds, gaps, window radius, and colors if you include the following files in your niri config. You can customize gaps, border radius, and window radius in Settings → Compositor.

// Add to the end of ~/.config/niri/config.kdl
include optional=true "dms/colors.kdl"
include optional=true "dms/layout.kdl"
include optional=true "dms/alttab.kdl"
include optional=true "dms/binds-next.kdl"
include optional=true "dms/binds.kdl"
tip

optional=true lets niri start while a file is still missing. dms setup creates them.

Version-dependent binds​

dms/binds-next.kdl holds the DMS binds that depend on your niri version. DMS writes it at dms setup and rewrites it each time it starts, so don't edit it; put your own binds in dms/binds.kdl. Keep its include above dms/binds.kdl so your binds override it.

niriWhat binds-next.kdl binds
26.04Mod+Shift+Slash opens the Keyboard Shortcuts cheatsheet
Next release (niri main)Mod+Shift+question opens the cheatsheet, and tapping Mod on its own toggles the overview

DMS doesn't add the include to an existing config.kdl. If yours predates this file, add the binds-next.kdl line yourself; dms doctor warns while it's missing or below dms/binds.kdl.

For manual configuration recommendations, continue below.

Layout​

The niri layout should have a transparent background, in order to integrate wallpapers onto the overview.

layout {
// You can tailor the gaps to fit dms spacing.
gaps 5
background-color "transparent"
}

Layer Rules​

Tell niri to place the wallpaper on the overview.

layer-rule {
match namespace="^quickshell$"
place-within-backdrop true
}

If "Blur Layer" is enabled, you can place the blurred wallpaper on the overview.

layer-rule {
match namespace="dms:blurwallpaper"
place-within-backdrop true
}

For more about layer rules see layer rules.

Startup​

For systemd autostart setup, see the Installation guide. If you prefer not to use systemd, add DMS directly to your niri config:

spawn-at-startup "dms" "run"

Environment Variables​

environment {
XDG_CURRENT_DESKTOP "niri"
QT_QPA_PLATFORM "wayland"
ELECTRON_OZONE_PLATFORM_HINT "auto"
QT_QPA_PLATFORMTHEME "gtk3"
QT_QPA_PLATFORMTHEME_QT6 "gtk3"
}

DMS Keybindings​

For the full list of available IPC commands see IPC. These are a few of the stock binds dms setup binds writes to dms/binds.kdl; the stock file also closes windows with Alt+F4 as well as Mod+Q.

binds {
// Application Launchers
Mod+Space hotkey-overlay-title="Application Launcher" {
spawn "dms" "ipc" "call" "spotlight" "toggle";
}
Mod+V hotkey-overlay-title="Clipboard Manager" {
spawn "dms" "ipc" "call" "clipboard" "toggle";
}
Mod+M hotkey-overlay-title="Media" {
spawn "dms" "ipc" "call" "dash" "toggle" "media";
}
Mod+Comma hotkey-overlay-title="Settings" {
spawn "dms" "ipc" "call" "settings" "focusOrToggle";
}
Mod+Ctrl+N hotkey-overlay-title="Notification Center" {
spawn "dms" "ipc" "call" "notifications" "toggle";
}
Mod+Y hotkey-overlay-title="Browse Wallpapers" {
spawn "dms" "ipc" "call" "dash" "toggle" "wallpaper";
}
Ctrl+Alt+Delete hotkey-overlay-title="Task Manager" {
spawn "dms" "ipc" "call" "processlist" "focusOrToggle";
}

// Security
Mod+Alt+L hotkey-overlay-title="Lock Screen" {
spawn "dms" "ipc" "call" "lock" "lock";
}

// Audio Controls
XF86AudioRaiseVolume allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "increment" "3";
}
XF86AudioLowerVolume allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "decrement" "3";
}
XF86AudioMute allow-when-locked=true {
spawn "dms" "ipc" "call" "audio" "mute";
}

// Brightness Controls
XF86MonBrightnessUp allow-when-locked=true {
spawn "dms" "ipc" "call" "brightness" "increment" "5" "";
}
XF86MonBrightnessDown allow-when-locked=true {
spawn "dms" "ipc" "call" "brightness" "decrement" "5" "";
}

// Touchpad toggle key (OSD needs niri with TouchpadToggled events)
XF86TouchpadToggle allow-when-locked=true repeat=false {
spawn "niri" "msg" "action" "toggle-touchpad";
}
// Hardware On/Off notifications (OSD only)
XF86TouchpadOn allow-when-locked=true repeat=false {
spawn "dms" "ipc" "call" "niri" "showTouchpadOsd" "true";
}
XF86TouchpadOff allow-when-locked=true repeat=false {
spawn "dms" "ipc" "call" "niri" "showTouchpadOsd" "false";
}
}

Window Rules​

Recommended window rules, tailor to your preferences:

window-rule {
match app-id=r#"^org\.gnome\."#
draw-border-with-background false
geometry-corner-radius 12
clip-to-geometry true
}

window-rule {
match app-id=r#"^org\.wezfurlong\.wezterm$"#
match app-id="Alacritty"
match app-id="zen"
match app-id="com.mitchellh.ghostty"
match app-id="kitty"
draw-border-with-background false
}

window-rule {
match is-active=false
opacity 0.9
}

window-rule {
geometry-corner-radius 12
clip-to-geometry true
}

// Open DMS windows as floating by default (optional - DMS can manage this for you, see tip below)
window-rule {
match app-id=r#"^dev\.duxlabs\.shell$"#
open-floating true
}
DMS-managed floating rule

DMS can manage this rule itself via Settings → Interface style → Floating windows → Open floating (on by default). The rule lives in a managed fragment at ~/.config/niri/dms/windowrules.kdl; if that fragment isn't included in your config yet, a First Time Setup banner on the same page creates it and adds the include when you click Setup. DMS floating windows use app ID dev.duxlabs.shell — remove any hand-written rules targeting the old org.quickshell ID.

Rules you edit in Settings → Window rules are checked with niri validate before dms/windowrules.kdl is replaced, so a rule niri rejects leaves the old file in place.

Next niri release​

Some settings use niri syntax newer than 26.04. DMS shows them only when the installed niri accepts them:

  • Settings → Window rules: VRR Fullscreen Only, On activation (Focus, Ignore or Mark urgent) and Pinch sensitivity.
  • Settings → Input → Mouse & touchpad: touchpad Pinch sensitivity.
  • Settings → Displays → Configuration: Max bits per channel per output.
  • Settings → Input → Keyboard shortcuts: Release and Non-consuming bind options, and binds on a lone modifier such as Mod.

Hyprland Configuration​

Hyprland uses a Lua config at ~/.config/hypr/hyprland.lua. DMS needs Hyprland 0.55 or newer, the first release that loads it; dms setup refuses to write the Lua config on older versions.

Hyprland 0.57 reads only hyprland.lua; the hyprland.conf format is gone. DMS reads and writes Lua on every supported version, so on 0.55 and 0.56 the keybind, window rule and display pages in Settings stay read-only until hyprland.lua exists. See Coming from hyprland.conf.

Config layout​

Hyprland must be started with the Lua config for any of this to apply:

Hyprland -c ~/.config/hypr/hyprland.lua

If Hyprland warns that it is using an autogenerated config, the session is not on the DMS config yet; run dms setup.

dms setup writes the main config plus fragments under ~/.config/hypr/dms/:

FragmentPurposeSettings page
colors.luaTheme colorsWallpaper & colors
layout.luaLayout, gaps, borders, blur, effects, xray layer rulesSystem & integrations → Hyprland, Interface style (Blur strength)
outputs.luaMonitors and display settingsDisplays
cursor.luaCursor settingsWallpaper & colors
input.luaMouse, touchpad and keyboard settingsInput → Mouse & touchpad, Keyboard
binds.luaDMS-managed default shortcuts-
binds-user.luaYour shortcut overridesInput → Keyboard shortcuts
windowrules.luaWindow rulesApplications → Window rules

binds.lua is refreshed by dms setup, so put custom shortcuts in binds-user.lua or use the Keyboard Shortcuts page. Deleting a DMS default there saves an hl.unbind("KEY") line into binds-user.lua so the removal sticks across setup runs; Reset to default drops your override. Binds in your own hyprland.lua are read-only in Settings, DMS does not write files it does not manage.

Stock configs bind a 3-finger horizontal touchpad gesture to workspace switching (hl.gesture in binds.lua). Add your own hl.gesture(...) lines to binds-user.lua to change it, or drop a stock gesture with action = "unset" matching its fingers, direction, and modifiers.

Coming from hyprland.conf​

Nothing is converted from a hyprland.conf. dms setup writes a fresh hyprland.lua and the dms/*.lua fragments, backing up any existing hyprland.lua to ~/.config/hypr/.dms-backups/<timestamp>/ first (including the stub Hyprland 0.57 autogenerates when it starts without a config). The old hyprland.conf is left in place and ignored.

Re-add shortcuts in dms/binds-user.lua or Settings → Input → Keyboard shortcuts, window rules in Settings → Applications → Window rules, and displays in Settings → Displays.

Check the result with:

dms setup
hyprctl reload
hyprctl configerrors

Key Configuration Sections​

DMS applies colors, displays, layout, cursor, input, keybinds and window rules through the fragments above. dms setup adds these lines for you; if you maintain hyprland.lua by hand, keep them at the end in this order. You can customize gaps, borders, and effects in Settings → System & integrations → Hyprland.

-- Add to the end of ~/.config/hypr/hyprland.lua
require("dms.colors")
require("dms.outputs")
require("dms.layout")
require("dms.cursor")
require("dms.input")
require("dms.binds")
require("dms.binds-user")
require("dms.windowrules")
tip

Be sure that all files exist before including them in the Hyprland configuration.

mkdir -p ~/.config/hypr/dms
touch ~/.config/hypr/dms/{colors,outputs,layout,cursor,input,binds,binds-user,windowrules}.lua

For manual configuration recommendations, continue below.

Startup​

For systemd autostart setup (recommended if you have multiple desktop environments), see the Installation guide. If you prefer not to use systemd, add DMS directly to your Hyprland config:

hl.on("hyprland.start", function()
hl.exec_cmd("dms run")
end)

Miscellaneous​

Disables the hyprland backdrop/logo

hl.config({
misc = {
disable_hyprland_logo = true,
disable_splash_rendering = true
}
})

Environment Variables​

hl.env("QT_QPA_PLATFORM", "wayland")
hl.env("QT_QPA_PLATFORMTHEME", "gtk3")
hl.env("QT_QPA_PLATFORMTHEME_QT6", "gtk3")
hl.env("ELECTRON_OZONE_PLATFORM_HINT", "auto")

Layer Rules​

hl.layer_rule({ match = { namespace = "dms" }, no_anim = true })

For more about layer rules see layer rules.

General Layout​

hl.config({
general = {
gaps_in = 5,
gaps_out = 5,
border_size = 0,

col = {
active_border = "rgba(707070ff)",
inactive_border = "rgba(d0d0d0ff)"
},

layout = "dwindle"
}
})

Decoration​

Window opacity on the Compositor page sets active_opacity and inactive_opacity for you. At 100 DMS leaves them to your config.

hl.config({
decoration = {
rounding = 12,

active_opacity = 1.0,
inactive_opacity = 0.9,

shadow = {
enabled = true,
range = 30,
render_power = 4,
offset = "0 5",
color = "rgba(00000070)"
}
}
})

DMS Keybindings​

For the full list of available IPC commands see IPC

local mod = "SUPER"

-- Application Launchers
hl.bind(mod .. " + space", hl.dsp.exec_cmd("dms ipc call spotlight toggle"))
hl.bind(mod .. " + V", hl.dsp.exec_cmd("dms ipc call clipboard toggle"))
hl.bind(mod .. " + M", hl.dsp.exec_cmd("dms ipc call processlist focusOrToggle"))
hl.bind(mod .. " + comma", hl.dsp.exec_cmd("dms ipc call settings focusOrToggle"))
hl.bind(mod .. " + N", hl.dsp.exec_cmd("dms ipc call notifications toggle"))
hl.bind(mod .. " + Y", hl.dsp.exec_cmd("dms ipc call dash toggle wallpaper"))
hl.bind(mod .. " + TAB", hl.dsp.exec_cmd("dms ipc call hypr toggleOverview"))

-- Security
hl.bind(mod .. " + ALT + L", hl.dsp.exec_cmd("dms ipc call lock lock"))

-- Audio Controls
hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("dms ipc call audio increment 3"), { locked = true, repeating = true })
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("dms ipc call audio decrement 3"), { locked = true, repeating = true })
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("dms ipc call audio mute"), { locked = true })

-- Brightness Controls
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd([[dms ipc call brightness increment 5 ""]]), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd([[dms ipc call brightness decrement 5 ""]]), { locked = true, repeating = true })

Window Rules​

-- Opacity for inactive windows
hl.window_rule({ match = { float = false, focus = false }, opacity = "0.9 0.9" })

-- GNOME apps
hl.window_rule({ match = { class = "^(org\\.gnome\\.)" }, border_size = 0, rounding = 12 })

-- Terminal apps - no borders
hl.window_rule({ match = { class = "^(org\\.wezfurlong\\.wezterm)$" }, border_size = 0 })
hl.window_rule({ match = { class = "^(Alacritty)$" }, border_size = 0 })
hl.window_rule({ match = { class = "^(zen)$" }, border_size = 0 })
hl.window_rule({ match = { class = "^(com\\.mitchellh\\.ghostty)$" }, border_size = 0 })
hl.window_rule({ match = { class = "^(kitty)$" }, border_size = 0 })

-- Floating windows
hl.window_rule({ match = { class = "^(gnome-calculator)$" }, float = true })

hl.window_rule({ match = { class = "^(blueman-manager)$" }, float = true })

hl.window_rule({ match = { class = "^(org\\.gnome\\.Nautilus)$" }, float = true })

-- Open DMS windows as floating by default (optional — DMS can manage this for you)
hl.window_rule({ match = { class = "^(dev\\.duxlabs\\.shell)$" }, float = true })

As on niri, Settings → Interface style → Floating windows → Open floating can manage this rule in ~/.config/hypr/dms/windowrules.lua (click Setup on the banner if the fragment isn't included yet). DMS floating windows use app ID dev.duxlabs.shell.

Window rule editor​

Settings → Applications → Window rules writes your rules to ~/.config/hypr/dms/windowrules.lua. On Hyprland the editor adds:

  • Match: Group and Modal toggles, plus an Advanced Matching card with Initial class, Initial title, Tag, XDG tag, Workspace, Content (none, photo, video, game), Fullscreen state, and Client fullscreen state. Prefix a tag with negative: to match windows without it.
  • Advanced effects: No initial focus, Stay focused, Focus on activate, Confine pointer, No XDG drags, No glow (0.57+), No wobble (0.57+), No auto HDR, Tone mapping, scrolling Column Width, Border color, and Suppress events.

Corner radius goes up to 100 on Hyprland 0.57 and is capped at 20 on 0.55 and 0.56, which reject higher rounding values and drop the rule. Editing a rule keeps any fields the editor doesn't show.

Compositor Settings (Hyprland)​

Settings → System & integrations → Hyprland writes ~/.config/hypr/dms/layout.lua and reloads Hyprland. DMS reads the running Hyprland's options once (hyprctl -j descriptions) and hides or skips anything your version doesn't have.

Tiling layout

LayoutOptions
OffLeaves general:layout to your own config
DwindlePreserve split, Smart split, Force split (Follow mouse, Left, Right)
MasterMaster position, New windows (Stack, Master, Inherit), New windows on top of the stack, Master size
ScrollingDirection, Column Width, Fullscreen single column, Follow focus (Off, On, Not on click)

Not on click (0.57+, scrolling:follow_focus = 2) lets focus changes move the tape but not clicks.

Layout overrides

  • Gaps: Auto follows the bar spacing, Custom shows Inner gaps and Outer gaps sliders, Off leaves gaps to your config.
  • Window radius follows Interface style → Corners.
  • Override border size.
  • Resize on border, with a Border grab area slider (general:extend_border_grab_area) for the extra space around borders that still starts a resize.
  • Window opacity for app windows.
  • Center dragged windows (0.57+, binds:drag_center_window): a tiled or fullscreen window dragged into floating centers on the cursor.
  • Xray blur and Bar xray / Frame xray. See Layer Namespaces.

Visual effects

SettingHyprlandNotes
Blur style0.57+Default, Frost, Ripple, Drops, Water, Fluid jar, Prism, Heat shimmer, Acrylic, Aurora, Haze. See Compositor Blur
Blur follows opacity0.57+More transparent areas get less blur (decoration:blur:proportional)
Glow0.55+Inner glow along window edges in the theme color, with range and Glow falloff sliders
Wobbly windows0.57+Intensity and Wobble stiffness sliders
Motion blur0.56+Sample count; more samples look smoother and cost more GPU

Effects apply to every window, including DMS floating windows such as Settings and Notepad, which also wobble. Blur reach is the Blur strength slider under Interface style, not part of this card.

Window groups

Background blur for the group bar, Title padding, Middle click closes, and Hide with one window (0.56+). Options your Hyprland doesn't have are not written.

Behavior

SettingHyprlandNotes
Workspace back and forth0.55+Switching to the current workspace returns to the previous one (binds:workspace_back_and_forth). Off, All displays, or Per display (0.57+); Off or On on older releases
Keep fullscreen on close0.55+Closing a fullscreen window makes the next focused one fullscreen (misc:exit_window_retains_fullscreen). Off or On; Only in groups and Only outside groups on 0.57+
System bell0.57+misc:bell_sound. Hyprland 0.57 plays a bell by default; Off writes an empty sound

Input and cursor

These Hyprland rows live on other Settings pages and are hidden unless the running Hyprland has the option:

SettingPageHyprlandNotes
Swallow focus clickInput → Mouse & touchpad → Mouse0.57+The click that focuses a window does not reach the app (input:swallow_focus_click), written to dms/input.lua
Tablet inputInput → Mouse & touchpad → Tablet0.57+Turns drawing tablet input on or off (input:tablet:enabled), written to dms/input.lua
Warp on display changeWallpaper & colors → Cursor0.57+Same as workspace change, Off, On, or Force (cursor:warp_on_monitor_change), written to dms/cursor.lua

mangowm Configuration​

mangowm is a dynamic tiling Wayland compositor based on dwl (wlroots). Configuration lives at ~/.config/mango/config.conf or ~/.config/mango/config.toml. mangowm loads config.conf when it exists, otherwise config.toml, and DMS works with either.

mangowm 0.18 or newer

mangowm 0.18 renamed its config keys to snake_case and dropped the old names (exec-once is now exec_once, windowrule is window_rule, monitorrule is monitor_rule, borderpx is border_px, and so on). Lines with the old names are rejected as unknown keywords. DMS supports mangowm 0.18 and newer, and everything dms setup and the shell write uses the snake_case names.

To convert an older config, run the migrate-config-keys.sh attached to mangowm's 0.18.0 release over ~/.config/mango; it rewrites config.conf and the DMS fragments alike. If you had that script running from a systemd --user path unit or a cron job to keep up with DMS, remove it: DMS writes snake_case itself now. dms doctor lists any keys mangowm still rejects.

Key Configuration Sections​

dms setup writes the main config plus fragments under ~/.config/mango/dms/:

FragmentPurposeSettings page
colors.confTheme colorsWallpaper & colors
layout.confGaps, borders, window radius, DMS layer rulesSystem & integrations → Compositor
cursor.confCursor theme, size and hide timeoutWallpaper & colors
input.confMouse, touchpad and keyboard settingsInput → Mouse & touchpad, Keyboard
outputs.confMonitors and display settingsDisplays
windowrules.confWindow rulesApplications → Window rules
binds.confKeybindsInput → Keyboard shortcuts

The fragments are .conf files whichever main config you use; mangowm reads each file in its own format. If you maintain your main config by hand, source every fragment and make sure the files exist. A First Time Setup banner on the matching Settings page adds a missing source line for you.

# Add to the end of ~/.config/mango/config.conf
source=./dms/colors.conf
source=./dms/layout.conf
source=./dms/cursor.conf
source=./dms/input.conf
source=./dms/outputs.conf
source=./dms/windowrules.conf
source=./dms/binds.conf
mkdir -p ~/.config/mango/dms
touch ~/.config/mango/dms/{colors,layout,cursor,input,outputs,windowrules,binds}.conf

With config.toml, source them from a [global] table:

# Add to the end of ~/.config/mango/config.toml
[global]
source = [
"./dms/colors.conf",
"./dms/layout.conf",
"./dms/cursor.conf",
"./dms/input.conf",
"./dms/outputs.conf",
"./dms/windowrules.conf",
"./dms/binds.conf",
]

Don't keep a config.conf next to config.toml: mangowm loads config.conf and ignores the TOML file.

Mouse and touchpad rows map onto mangowm's mouse_* and trackpad_* keys. Keyboard keys (xkb_rules_*, repeat_*, numlock) are written only once you set one of them, so an untouched Keyboard page keeps the keyboard lines in your own main config. The Keymap file row is hidden on mangowm because it has no such option. Numlock is written as numlock_on.

For manual configuration recommendations, continue below.

Startup​

For systemd autostart setup (recommended if you have multiple desktop environments), see the Installation guide. If you prefer not to use systemd, add DMS directly to your mangowm config:

exec_once=dms run

Environment Variables​

env=QT_QPA_PLATFORM,wayland
env=ELECTRON_OZONE_PLATFORM_HINT,auto
env=QT_QPA_PLATFORMTHEME,gtk3

Appearance​

Recommended appearance settings for DMS integration:

# Window appearance
border_radius=12
border_px=0
focused_opacity=1.0
unfocused_opacity=0.9

# Gaps
gap_inner_horizontal=5
gap_inner_vertical=5
gap_outer_horizontal=5
gap_outer_vertical=5

# Shadows (optional)
shadows=1
shadow_only_floating=1
shadows_size=10
shadows_blur=15

Layer Rules​

DMS writes these rules into dms/layout.conf, so mangowm skips its layer animation on the shell's own surfaces:

layer_rule=no_animation:1,layer_name:^(quickshell)$
layer_rule=no_animation:1,layer_name:^dms:.*

With layer_animations=1, mangowm restarts a move animation every time a layer changes size or position, so the dot and island lag behind. If you do not source dms/layout.conf, copy these lines into config.conf. A layer_rule=no_animation:1,layer_name:^dms line you added by hand earlier can go.

Each matching layer_rule resets the on/off options it does not set, so the last match wins. Put your own rules for DMS layers after source=./dms/layout.conf and include no_animation:1. To let DMS layers animate instead, add the same two lines there with no_animation:0. mangowm applies layer rules when a layer opens, so restart the shell once after updating (dms restart).

For more about layer rules see layer rules.

DMS Keybindings​

For the full list of available IPC commands see IPC.

# Application Launchers
bind=SUPER,space,spawn,dms ipc call spotlight toggle
bind=SUPER,v,spawn,dms ipc call clipboard toggle
bind=SUPER,m,spawn,dms ipc call processlist focusOrToggle
bind=SUPER,comma,spawn,dms ipc call settings focusOrToggle
bind=SUPER,n,spawn,dms ipc call notifications toggle
bind=SUPER,y,spawn,dms ipc call dankdash wallpaper

# Security
bind=SUPER+ALT,l,spawn,dms ipc call lock lock

# Audio Controls
bind=NONE,XF86AudioRaiseVolume,spawn,dms ipc call audio increment 3
bind=NONE,XF86AudioLowerVolume,spawn,dms ipc call audio decrement 3
bind=NONE,XF86AudioMute,spawn,dms ipc call audio mute

# Brightness Controls
bind=NONE,XF86MonBrightnessUp,spawn,dms ipc call brightness increment 5
bind=NONE,XF86MonBrightnessDown,spawn,dms ipc call brightness decrement 5

Window Rules​

# GNOME apps
window_rule=no_border:1,app_id:^org\.gnome\.

# Terminal apps - no borders
window_rule=no_border:1,app_id:^org\.wezfurlong\.wezterm$
window_rule=no_border:1,app_id:^Alacritty$
window_rule=no_border:1,app_id:^com\.mitchellh\.ghostty$
window_rule=no_border:1,app_id:^kitty$

# Float DMS windows
window_rule=is_floating:1,app_id:^dev\.duxlabs\.shell$

Sway Configuration​

Sway is an i3-compatible Wayland compositor. Dux Modular Shell integrates with Sway's tiling layout.

Key Configuration Sections​

Coming Soon

Detailed Sway configuration sections are coming soon. Sway configuration will include:

  • Startup commands
  • Environment variables
  • DMS keybindings
  • Layer rules
  • Window rules

For now, refer to the Example for Sway in the "Other Compositors" section below for basic setup.

Startup​

For systemd autostart setup (recommended if you have multiple desktop environments), see the Installation guide. Otherwise, add DMS directly to your Sway config:

exec dms run

DMS Keybindings​

For the full list of available IPC commands see IPC. Basic Sway keybinding examples are available in the Example for Sway section below.

labwc Configuration​

labwc is a wlroots-based window-stacking compositor for Wayland, inspired by Openbox.

Key Configuration Sections​

Coming Soon

Detailed labwc configuration sections are coming soon. labwc configuration will include:

  • Startup commands
  • Environment variables
  • DMS keybindings
  • Layer rules
  • Window rules

For now, refer to the labwc documentation for basic setup.

DMS Keybindings​

For the full list of available IPC commands see IPC. labwc keybinding configuration coming soon.

Miracle WM Configuration​

Miracle WM is a tiling Wayland compositor built on Mir.

Key Configuration Sections​

Coming Soon

Detailed Miracle WM configuration sections are coming soon. Miracle WM configuration will include:

  • Startup commands
  • Environment variables
  • DMS keybindings
  • Window rules

Startup​

For systemd autostart setup (recommended if you have multiple desktop environments), see the Installation guide. Otherwise, add DMS directly to your Miracle WM config.

DMS Keybindings​

For the full list of available IPC commands see IPC. Miracle WM keybinding configuration coming soon.

Other Compositors​

Dux Modular Shell works with any Wayland compositor that supports:

  • Layer shell protocol (for panels and overlays)
  • Session lock protocol (for lock screen)
  • ext-workspace-v1 protocol (for workspace management)
  • wlr-output-management-unstable-v1 protocol (for interface scaling + output management)

Note: Some compositor-specific features will be unavailable, such as workspace switching.

Basic Integration​

For other compositors, you need to:

  1. Auto-start DMS:

    dms run
  2. Configure keybindings using the IPC commands from the Keybinds & IPC guide

  3. Set environment variables in ~/.config/environment.d/90-dms.conf (for systemd users) or your compositor config:

    QT_QPA_PLATFORM=wayland

    You can also use systemctl --user edit dms and add Environment=QT_QPA_PLATFORM=wayland under [Service]. This only affects DMS and apps it launches, whereas 90-dms.conf applies to all user sessions.

Example for Sway​

Add to ~/.config/sway/config:

# DMS Keybindings
bindsym $mod+space exec dms ipc call spotlight toggle
bindsym $mod+v exec dms ipc call clipboard toggle
bindsym $mod+m exec dms ipc call processlist focusOrToggle
bindsym $mod+comma exec dms ipc call settings focusOrToggle

# Audio controls
bindsym XF86AudioRaiseVolume exec dms ipc call audio increment 3
bindsym XF86AudioLowerVolume exec dms ipc call audio decrement 3
bindsym XF86AudioMute exec dms ipc call audio mute

# Brightness controls
bindsym XF86MonBrightnessUp exec dms ipc call brightness increment 5
bindsym XF86MonBrightnessDown exec dms ipc call brightness decrement 5

Troubleshooting​

DMS doesn't start automatically​

Check your compositor's logs to ensure the spawn-at-startup or equivalent startup command is running. You can also manually start DMS with dms run to see any error messages.

Keybindings don't work​

Verify that:

  • DMS is running (pgrep -f "dms run")
  • Your keybinding syntax matches your compositor's format

Next Steps​