dwm-win32: a dynamic tiling window manager for Windows
dwm port of tiling manager to Window
At a glance
- What is it?
- dwm-win32 ports the X11 window manager dwm to Windows, giving tiled, monocle and floating layouts, tag based grouping and a keyboard driven workflow, built in C and compiled with zig cc. It suits someone who wants the dwm model on Windows, and the readme is candid that several parts of the port are still unfinished.
- Who is it for?
- dwm-win32 fits a Windows user who wants the dwm way of working, with tags, a master and stacking area and a keyboard workflow, and who is willing to accept that some behaviour differs from the X11 original because the platform hooks underneath are different.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly C, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Three layouts, and a modifier key that defaults to ALT
dwm-win32 is a port of the well known X11 window manager dwm to Microsoft Windows, and it is a dynamic window manager in the same sense dwm is. It manages windows in tiled, monocle and floating layouts, and either layout can be applied dynamically to suit the application in use and the task being performed. In tiled layouts windows are managed in a master and stacking area, where the master holds the window that currently needs the most attention and the stacking area holds all the others. In monocle layout all windows are maximised to the screen size, and in floating layout windows can be resized and moved freely. Dialog windows are always managed floating regardless of the layout applied, which is the one automatic rule the port keeps. The default modifier key is ALT, and the layout keys are the dwm ones you would already know, with MOD + t for tiled, MOD + f for floating and MOD + m for monocle, plus MOD + Control + space to toggle between the current and previous layout.
Tags, the status bar, and how the focus state is drawn
Windows are grouped by tags, and each window can carry one or several tags, with selecting certain tags displaying all the windows that have them. The status bar is small and shows all available tags, the current layout and the title of the focused window. The indicator scheme is worth understanding because it is the dwm convention ported literally. A floating window is indicated with an empty square and a maximised floating window with a filled square before the window title. The tags of the focused window are indicated with a filled square in the top left corner, while the tags applied to one or more windows are indicated with an empty square in the same position. Selected tags are shown in a different colour. dwm also draws a small border around windows to show the focus state, and the todo list notes that this window border is not yet perfect. Tag keys follow the dwm scheme too, with MOD + Shift + number applying the nth tag to the focused window, MOD + number viewing all windows with that tag, and MOD + Control + number adding or removing all windows with that tag to or from the view.
The window discovery problem, and why child windows get missed
The How it works section is the most honest part of the readme and it explains most of the port's rough edges. A ShellHook is registered which is notified upon window creation and destruction, but that only works for unowned top level windows, so the port is not notified when child windows are created or destroyed. The workaround is to scan the currently active top level window upon activation to collect its associated child windows, and that information is used to tag all the windows rather than just the top level one when tags change. The author is blunt about the result, saying this is all kind of messy and that some child windows will be missed in certain situations. The better approach would be a CBTProc function registered with SetWindowsHookEx with the WH_CBT hook, which would give notification of every window including toolbars, but those would then have to be filtered out. The obstacle is that the SetWindowsHookEx approach seems to require a separate DLL, because it is loaded into each process address space.
Building it needs Visual Studio build tools and zig
Compiling dwm-win32 requires the Visual Studio C/C++ Build Tools and the Windows SDK, and the readme notes you can use the Visual Studio Installer to download only the headless C and C++ build tools and the Windows SDK without the full IDE. It also requires zig, and the reason is that the source is written in C and uses zig cc to compile it to native code, which is an unusual toolchain choice and explains why the Windows SDK is needed at all when a C compiler is otherwise present. You can install zig with scoop using the install zig command, and the build itself is a single script.
build.cmdThe readme adds two notes about that script. Removing the NDEBUG define and the optimisation and strip flags from build.cmd gives you a debug build, and the version in build.cmd has to be updated before a release. The repository layout matches a small C project with a src directory, an extern directory, a config.h.in template, a build.cmd, a docs directory, a renovate configuration for dependency updates and a screenshot.
Running as Administrator, and the bar and taskbar toggles
There is one operational instruction in the readme that is easy to skim past and important in practice. It is recommended to run dwm-win32 as Administrator so it will catch all windows, including those you ran as Administrator. That is a direct consequence of the window discovery mechanism, because a process that is not elevated cannot see or manipulate the windows of an elevated process, so a shell hook running unelevated would silently skip the administrator windows you opened. The other two toggles in the key list are the ones that make the port feel like Windows rather than like X11. MOD + Control + b toggles the bar on and off, and MOD + e toggles Windows Explorer and the taskbar on and off, which is the port's answer to the fact that the Windows taskbar is a permanent overlapping window that a tiling manager would otherwise have to treat as another tile.
The todo list is the honest roadmap
The readme ends with a todo list that is more informative than a feature list would be, because it tells you where the port stops. Support for luajit is on the list. Showing and hiding child windows upon a tag switch is not yet right, in theory it should already work but in practice the ismanageable function needs tweaking so it recognises child windows without generating false positives. Fullscreen windows are unfinished, with mstsc named as an example that does not resize properly when maximised. Screensaver support, system dialogs from the desktop window, an urgent flag, perfect window borders, status text via stdin or a separate tool, a crash handler that makes all windows visible and restores borders, use of BeginDeferWindowPos with DeferWindowPos and EndDeferWindowPos, speed optimisation, code cleanups all over the place, and multi head support are all listed as open. The fullscreen and multi head entries are the two that decide whether the port suits a particular desk setup.
Editorial conclusion
dwm-win32 fits a Windows user who wants the dwm way of working, with tags, a master and stacking area and a keyboard workflow, and who is willing to accept that some behaviour differs from the X11 original because the platform hooks underneath are different. It does not fit someone who needs the feature set finished, since the todo list in the readme includes fullscreen window handling, multi head support and a crash handler, and the shell hook mechanism means some child windows are missed. Before you switch to it, read the How it works section, because the window discovery mechanism explains most of the rough edges you will hit, and run it as Administrator as the readme recommends so it can catch windows you launched as Administrator.
Frequently asked questions
What is dwm-win32?
It is a port of the well known X11 window manager dwm to Microsoft Windows, a dynamic window manager written in C. It manages windows in tiled, monocle and floating layouts, groups them by tags, and shows a small status bar with the tags, the layout and the title of the focused window.
Which layouts does dwm-win32 support?
Tiled, monocle and floating, switchable at any time with MOD + t, MOD + m and MOD + f, and MOD + Control + space toggles between the current and previous layout. Dialog windows are always managed floating regardless of the layout applied.
How do I compile dwm-win32 on Windows?
You need the Visual Studio C/C++ Build Tools with the Windows SDK and the zig compiler, installed for example with scoop install zig. The source is C compiled with zig cc, and the build itself is the build.cmd script, where removing the NDEBUG and optimisation flags gives a debug build.
Why should dwm-win32 be run as Administrator?
So that it catches all windows, including those you ran as Administrator. A process that is not elevated cannot manage the windows of an elevated one, so an unelevated shell hook would silently skip them.
What are the known limitations of dwm-win32?
The readme lists support for luajit, showing and hiding child windows on a tag switch, fullscreen windows such as mstsc, the screensaver, system dialogs from the desktop window, an urgent flag, perfect window borders, status text via stdin, a crash handler, use of the deferred window position API, speed optimisation and multi head support as still open items.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/prabirshrestha-dwm-win32)Was this useful?