A scrollable-tiling window manager for X11, forked from cwm — the calm window manager from the OpenBSD base system.
Русская версия: README.ru.md.
Windows live on an endless horizontal ribbon of columns. The screen is a viewport onto that ribbon: opening a window pushes the ribbon, it never squeezes the neighbours into unreadable slivers. Focus moves the viewport; the ribbon keeps its shape.
If that sounds like niri, it is the same idea. niri is a Wayland compositor. digitwm brings the layout model to X11, where it can run on Linux, FreeBSD and NetBSD alike.
It is not a compositor, so it does not animate. Animation needs a process that owns the frame, and an X11 window manager does not. Windows move in one step. If you want fades and slides, run a compositor beside it.
It is not a fork of sdorfehs or of papersway. Those are GPL; digitwm is ISC, and it stays that way so patches can flow back to cwm and so the code can be used without conditions. See NOTICE.
cwm is small (7 883 lines of C), depends on three libraries (x11, xft,
xrandr), has been maintained in OpenBSD base for two decades, and — the part
that matters here — has no tiling model to tear out. It is a floating window
manager, so the ribbon is added onto clean ground rather than grafted over
someone else's frame tree.
The numbers that drive the layout — how far the ribbon shifts after a focus
change, how wide a column is, where a new window is inserted, what gets focus
when a window closes — are not buried in C. They are written as
FTS models under fts/, in Russian
and in English, with worked examples on the boundaries.
The loop over columns stays in C, because a loop is mechanical. The numbers the loop substitutes are policy, and policy belongs somewhere it can be read and tested.
FTS never runs inside the window manager. It runs in CI: the same vectors go through the generated code and through the live window manager, and a mismatch fails the build. No runtime dependency on Node, which is what keeps NetBSD reachable.
The two promises no single number can hold — opening a window alters no window already on the ribbon, and the focused column always lies wholly inside the viewport horizontally — are checked against the running binary by a harness of their own. doc/ribbon.md is the whole model in one page.
session/ turns the window manager into a working desktop: editor, terminal,
shell, multiplexer and the Digit agent, all in one palette, installed with one
command.
sh bootstrap.sh --plan # from a bare system: see what would happen
sh bootstrap.sh # build dependencies, the window manager, then this
session/verify.sh # check the resultbootstrap.sh installs what digitwm is built with and hands over to
session/install.sh, which can also be run on its own if the toolchain is
already there.
Nothing third-party is vendored here. vim, tmux, alacritty, zsh and the rest ship under their own licences and are installed by the target system's package manager; this repository carries configuration only. Colour schemes are not duplicated either — they are generated by Digitable Workbench from one palette file and referenced, not copied.
What you get and, just as importantly, what you do not — no animation, no panel, and an incomplete tool set on some package managers — is spelled out in session/README.md.
Every document is here twice, in English and in Russian, and they say the same things — a difference in facts is worse than a missing translation.
| doc/ribbon.md | the layout model, its commands and its settings |
| doc/commands.md | every command, and what the ribbon did to it |
| doc/monitors.md | more than one monitor, and what happens on hotplug |
| doc/offscreen.md | windows outside the viewport, and the numbers behind the default |
| doc/baseline.md | flicker, insertion latency, hidden windows — measured, and what is still missing |
| doc/build.md | building, installing, running, checking a change |
| fts/README.md | the models, the harnesses, and where they stop |
| pkgsrc/README.md | the package, and what is missing until the first release |
| CONTRIBUTING.md | the order a layout change is made in |
Early. The fork is in place with upstream history preserved. The ribbon is
there and checked — columns, stacks, the scrolling viewport, insertion, focus,
width presets, per-output ribbons — but it has not been lived in for a week by
anyone, there is no panel, and the delivery paths (bootstrap.sh, the pkgsrc
port) have been exercised on Debian and by reading rather than on every system
they claim. Each document says which of its statements were measured and which
were not.
ISC, inherited from cwm and applied to new code as well. Full text in LICENSE; provenance and the one BSD-3 exception in NOTICE.
Part of Digitable. A write-up with the numbers from the harnesses and the measurements is on the product page, courses.digitable.life/digitwm; it also says why digitwm stays out of the paid Workbench archive even though ISC does not forbid it.