I'm building Triad, a hybrid tiling Wayland window manager. It targets the new river-window-management-v1 protocol, which separates window management from the Wayland compositor... a split the desktop Wayland stack has needed for years.
Background on the protocol: https://isaacfreund.com/blog/river-window-management/
Why Nim? Native performance, clean FFI to the Wayland and libinput C libraries, and the joy of programming. Compile-time features without the headaches of C or Rust.
I'm using a data-oriented design (DOD): tags, windows, outputs, and their relationships live in flat tables rather than object graphs. Layouts draw from Niri and Mango.
Triad has its own JSON IPC and also speaks the Niri IPC, so Quickshell-based shells (Noctalia, Dank Material Shell) and bars like Waybar work without forks or mods.
Status: very early but usable. I daily-drive and actively develop with Noctalia shell. Still chasing and working out bugs.
Testers and contributors welcome.
Added a demo video showing Triad moving windows around:
https://github.com/greenm01/triad/tree/master
Janet lang is now embedded for scripting window behavior. The first pass is app manifests: a little Janet file can look at the current Triad state and tell Triad where a new window should go. This is mostly for apps with annoying popup behavior, like GIMP.
I picked Janet over Lua because it fits the shape of the project better, and because I dig it.
There’s also a Nix dev flake now, so it should be easier to hack on Triad or just give it a spin.
Multi-monitor support implemented. I'm daily driving now.
I created a wiki page: https://triadwm.org/
Hi!
Could a brave person(s) who's into wayland window managers (hyprland, niri, sway, etc...), do me a solid and see if these install instructions work for you?
https://triadwm.org/getting-started/installation/
Of course it works for me, being the sole developer. It all makes complete sense :-)
I've got it working on my multi-monitor desktop and Thankpad X13 laptop.
Humbly asking for some help from the Nim crowd.
Cheers!
OK, I'm brave and I use hyprland, so let's go. :o)
Installation goes smooth using nim 2.2.10, but "Nested Wayland Smoke Test" and "TTY Smoke Test" show the same result: a black window/screen with a functional mouse cursor and nothing else. None of Triad's key bindings work. Looks like a functioning River instance with no Triad. I tried the tty smoke test on a freshly booted machine with no other graphics shell running, same result.
The session log file shows that triad immediately terminates (and is started over and over again) because of an error:
triad-supervise: starting triad, log=/home/gm/.local/state/triad/triad-20260524-182440-1178.log
error(wlroots): [types/output/swapchain.c:109] Swapchain for output 'HDMI-A-1' failed test
error(output): output commit failed for HDMI-A-1
info(wlroots): [wayland] error in client communication (pid 1223)
*** Some xkbcomp warnings here ***
triad-supervise: triad exited cleanly after 0s; restarting
triad-supervise: starting triad, log=/home/gm/.local/state/triad/triad-20260524-182440-1178.log
info(wlroots): [wayland] error in client communication (pid 1222)
triad-supervise: triad exited cleanly after 0s; restarting The displays all work, so I am not sure about the HDMI-A-1 related errors. But the communication error looks important and triad's own log shows what it is:
wl_display#1: error 1: invalid method 3, object river_xkb_bindings_seat_v1#27
Triad's config validates ok. I am running river 0.4.3 on Artix Linux (Arch based) with elogind 257.14 and seatd 0.9.3. The session log says that seatd is used and the libseat session is successfully loaded.
Ah, thanks for testing. This was a real Triad bug.
Triad was sending a River v3 request. Your River 0.4.3 exposes an older version, so River rejected and Triad got restarted in a loop.
I’ve fixed by checking the advertised protocol version. On older River builds, Triad will skip that modifier-watch feature but should still start and handle normal key bindings.
I also tested the fix in my live session.
Thanks!