niri is quite nice, it was the first time I seriously considered linux.
hyprland wasn’t even that interesting, but niri

    it just clicked

I’ve been on CachyOS + niri for some time now, installed it on

$ stat / | rg Birth
Birth: 2025-12-25 14:07:53.728768736 +0800

woah Christmas day, maybe Linux was a present to me

Anyways, the reason for two versions of niri is because, there are things that just aren’t in main niri just yet.
It’s similar to why I run helix, but in the case of helix, I don’t run two versions, I have helix, and I have vim as backup (msedit if on Windows)

But in the case of a full window manager, making changes, and accidentally causing a problem, I find it slightly harder to fix it in the tty than to spin a stable version of niri up

Yes I know some of you love the tty, I sometimes use it to spawn niri sessions while testing, but I find it not the best y’know (and no kmscon does not count, I can’t spawn niri sessions in that)

So, how I handle two niri sessions:

sddm

sddm is the most important piece, because that’s how I switch between the two sessions.

I have niri, and I have niri (patched).

/usr/share/wayland-sessions/niri-patched.desktop

[Desktop Entry]
Name=Niri (patched)
Comment=A scrollable-tiling Wayland compositor
Exec=niri-patched-session
Type=Application
DesktopNames=niri-patched

Then I open /usr/bin/niri-session and add this line after the check for niri.service

    if systemctl --user -q is-active niri-patched.service; then
      echo 'A niri (patched) session is already running.'
      exit 1
    fi

Then I copy over the content to /usr/bin/niri-patched-session, paste the full content and replace references of niri to niri-patched

systemctl

/usr/lib/systemd/user/niri-patched.service

[Unit]
Description=A scrollable-tiling Wayland compositor
BindsTo=graphical-session.target
Before=graphical-session.target
Wants=graphical-session-pre.target
After=graphical-session-pre.target

Wants=xdg-desktop-autostart.target
Before=xdg-desktop-autostart.target

[Service]
Slice=session.slice
Type=notify
ExecStart=niri-patched --session --config /home/nspc911/.config/niri/fork.kdl

niri binary itself

go back to the niri repo

mold -run cargo build --release
sudo mv target/release/niri /bin/niri-patched

separate config files

I have three different config files for niri

  • base.kdl - the base config, which is shared between both versions
  • config.kdl - the config for the main niri version
  • fork.kdl - the config for the patched niri version

and yeah that’s it, if it goes well, you now have two versions of niri that you can switch between at any time

Honestly, I’m not sure why I wrote this post