A lightweight (and opinionated) tiling window manager for Windows 11, inspired by Hyprland and komorebi. A mend for the DWM.
- Lightweight — single daemon binary.
- No elevation, no installer — run as a user without elevated Administration permissions.
dwmend autostart enablewrites an HKCURunentry so the daemon launches on next sign-in.dwmend autostart disableremoves it. - Dynamic tiling — Binary Space Partition (BSP) approach. Two layout modes: dwindle (aspect-ratio splits, default) and spiral (alternating axis splits). Switch globally via
[general] layout = "spiral"in config or per-workspace via thetoggle_layoutaction. - Global workspace pool — 10 named workspaces;
Alt+#(where # is the workspace number) brings a workspace to the focused monitor (swapping it from whichever monitor was showing it).Alt+Shift+Nmoves the focused window and follows focus to the target workspace. - Status bar — thin GDI bar on each monitor showing workspace pills (active / visible-elsewhere / occupied / empty), the focused window title centred on the bar and a clock / battery / network indicators on the right. Click a pill to switch that monitor's workspace. Colours, height, and per-segment toggles are configurable under
[bar]. - Active tile focus border — thick configurable-colour overlay frame around the active tile.
- Stack containers — group multiple windows into one tile.
Alt+Gis smart: with two tiles side-by-side it merges them into a stack on the first press; with a single tile it converts it to a 1-member stack so subsequent windows pile in.Alt+[/Alt+]cycle through.Alt+Shift+Gpops the focused member back out into its own tile. The bar shows a[2/3]indicator next to the focused title when applicable. - Floating window keyboard control —
Alt+Shift+H/J/K/Ltranslates the focused float by 32 px;Alt+Ctrl+H/J/K/Lresizes the matching edge by 32 px. - Window rules — match by
exe/class/titleregex; actions areignore,float,tile, orworkspace = Nto pin matching apps to a specific workspace at launch (without stealing the user's focus). - Window peek —
Alt+Eopens a sticky-mode picker overlaying live DWM thumbnails of every window on the focused workspace. Cycle with your normalAlt+H/Lfocus keys (the daemon intercepts them while peek is up);Alt+Entercommits,Alt+Eagain dismisses. Configurable under[peek]. - Notification toasts — transient pop-ups for config reloads, keybinding failures, pause toggles, and layout mode flips. Click-through, never steal focus. Configurable under
[notifications]. Scripts can fire their own viadwmend cmd "notify info 'Build complete'". - TOML config + hot reload — gaps, colours, rules, keybindings, bar theme/segments, notification colours/TTL, peek theme all update on save. Bar height changes still need a daemon restart.
- IPC — named-pipe server at
\\.\pipe\DwmendDaemon-v1. Usedwmend cmd "focus left"from PowerShell / AutoHotKey / StreamDeck to drive the daemon, ordwmend query stateto introspect. - Crash recovery —
dwmend.exe restoremakes any windows DWMend hid visible again if the daemon crashes or is force-killed.
Two distribution options. Both are user-mode — neither needs administrator rights.
MSI installer (recommended for most users):
- Download
dwmend.msifrom the latest release. - Double-click. Installs to
%LOCALAPPDATA%\Programs\dwmend\and adds a Start Menu shortcut. No UAC prompt; uninstalls cleanly via Settings → Apps. - Silent install for scripts:
msiexec /i dwmend.msi /qn.
Portable executable (no installer):
- Download
dwmend.exefrom the latest release. - Drop it anywhere on disk and run it.
Both artifacts ship with a matching .sha256 for verification:
(Get-FileHash -Algorithm SHA256 .\dwmend.msi).Hash.ToLower()
# compare against the contents of dwmend.msi.sha256Requires:
- Rust stable on
x86_64-pc-windows-msvc - Visual Studio Build Tools or VS with the C++ workload + Windows 11 SDK
- A Developer PowerShell (
Launch-VsDevShell.ps1 -Arch amd64)
cargo build --releaseThe release binary at target\release\dwmend.exe (~3 MB).
To build the MSI locally (requires the WiX Toolset 3.14 on PATH and cargo install cargo-wix):
cargo build --workspace --release
# Stage the binder inputs into target\wix\ \u2014 cargo-wix runs light.exe
# from there and doesn't add the wxs source dir as a binder path, so
# License.rtf / dwmend.ico must be alongside the linker's CWD.
New-Item -ItemType Directory -Force -Path target\wix | Out-Null
Copy-Item crates\dwmend\wix\License.rtf target\wix\License.rtf -Force
Copy-Item assets\icon.ico target\wix\dwmend.ico -Force
cargo wix -p dwmend --no-build --output target\wix\dwmend.msi# Start as a background process
Start-Process .\target\release\dwmend.exe -WindowStyle Hidden
# Diagnostic: print what would be managed without touching anything
.\target\release\dwmend.exe dryrun
# Recover after a hard crash
.\target\release\dwmend.exe restore
# Launch on sign-in (per-user; no elevation; uninstall with `autostart disable`)
.\target\release\dwmend.exe autostart enable
.\target\release\dwmend.exe autostart status
.\target\release\dwmend.exe autostart disable
# Drive the running daemon from a IPC
.\target\release\dwmend.exe cmd "focus left"
.\target\release\dwmend.exe cmd "workspace 3"
.\target\release\dwmend.exe cmd "notify info 'Build complete'"
.\target\release\dwmend.exe query state
.\target\release\dwmend.exe query focused
# Help
.\target\release\dwmend.exe helpOn first launch a default config is emitted to
%APPDATA%\dwmend\config.toml. Logs go to
%LOCALAPPDATA%\dwmend\dwmend.log.<date>.
| Combo | Action |
|---|---|
Alt+H/J/K/L |
focus left/down/up/right |
Alt+Shift+H/J/K/L |
move focused tile (or translate float by 32 px) |
Alt+Ctrl+H/J/K/L |
resize 32 px (tiled split or floating edge) |
Alt+1..Alt+0 |
switch to workspace 1..10 |
Alt+Shift+1..Alt+Shift+0 |
move focused window to workspace |
Alt+T / Alt+F / Alt+W |
toggle float / monocle / close |
Alt+G |
smart toggle stack (merge with sibling, or 1-member fallback) |
Alt+Shift+G |
pop focused stack member back out into its own tile |
Alt+] / Alt+[ |
cycle to next / previous stack member |
Alt+P |
pause/resume DWMend |
Alt+Shift+R / Alt+Shift+Q |
reload config / quit |
Alt+E |
open / dismiss the window-peek picker |
Alt+Enter |
confirm the peek selection (focus highlighted window) |
| Bar pill click | switch the clicked bar's monitor to that workspace |
The toggle_layout action (Dwindle ↔ Spiral on the focused workspace) ships unbound; add "ALT+SHIFT+L" = "toggle_layout" (or any other combo) to your [keybindings] to wire it up.
If any binding fails to register (because another app already claimed it), DWMend logs a warning at startup and that binding is silently no-op.
Existing configs: DWMend only writes the default config on first run. New options (the
[bar]section,[notifications],[peek],general.layout, the stack /toggle_layoutactions, theworkspace = Nrule action, thenotify/peek_toggle/peek_confirmactions) won't be present in your existing%APPDATA%\dwmend\config.toml— add them manually. The defaults match the previous hard-coded values, so omitting them keeps the old behaviour. Keybinding edits ARE picked up byAlt+Shift+R(the listener thread is torn down and respawned with the new table).
Personal-use software. No installer, no signing, no telemetry.
The IPC pipe is local-only (no network access).
See assets/config.toml for the full set of options.
| Crate | Purpose |
|---|---|
crates/dwmend-platform |
Thin unsafe Win32 wrappers (windows, monitors, hooks, DWM, DPI, focus border, IPC pipe transport) |
crates/dwmend-layout |
Pure-Rust BSP layout engine — no Windows deps, 18 unit tests |
crates/dwmend |
Daemon library + thin binary: state, config, hotkeys, event loop, status bar, tray icon |