That being said I'm glad that Hyprland exists and shows people that there is power in minimalism. Fluxbox was my first love..
Not everything has always been smooth, but at some point when I was needing to do screen sharing via Zoom I had to switch back to i3, and the comparison was more stark than I remembered.
On i3:
Tearing (graphical glitches) is terrible, especially if you’re doing screen sharing. I can’t use my XF86AudioMicMute key because its keycode is 256 and X only supports 8-bit codes. The touchpad doesn’t work well. Scaling stuff is a total mess, a mess that you can mostly get to work, but you’ll need to set four different environment variables and run a gsettings daemon and set these three properties and add this file to this location and that one to that and modify your Chromium flags and I probably even forgot a couple of steps.
On Wayland:
Tearing is solved. I had to modify the keymap to get XF86AudioMicMute¹, which I suspect was because of X compatibility, but then it works. The touchpad works very well, gestures, scroll rates and all. Scaling is robust and automatic, if you have an integer scaling factor or are willing to settle for render-at-next-integer-and-downsample, which is a bad technique but good enough for Apple; and compositors now support proper fractional scaling, and apps are more commonly implementing it (though I’m distressed it took so long). Firefox Nightly has just this week finally fixed the last problem that I’ve noticed, and I hope they’ll default-enable Wayland fractional scaling and Wayland soon.
The only thing I feel Sway’s behind in now is its lack of per-window screen sharing. Other than that, it’s very solidly better than i3 in every way: in convenience (things work better out of the box), in robustness (features that exist don’t have issues) and in features.
—⁂—
¹ Ran `xkbcomp $DISPLAY keymap.xkb`, then modified that file by changing `maximum = 255;` to `maximum = 256;`, and adding in appropriate places `<I256> = 256;` and `key <I256> { [ XF86AudioMicMute ] };`. Then, in ~/.config/sway/config, `input * xkb_file "~/.config/sway/keymap.xkb"` or similar.
Download and run "picom" (its default configuration is good), or any other compositor. This is the way to get graphical acceleration for regular windows on X11, and fix tearing.
> Scaling stuff is a total mess, a mess that you can mostly get to work, but you’ll need to set four different environment variables and run a gsettings daemon and set these three properties and add this file to this location and that one to that and modify your Chromium flags and I probably even forgot a couple of steps.
I just modify ~/.Xresources with the "Xft.dpi: 120" for 1.25x scaling. All apps I care about pick this value to scale the UI with (chrome, firefox, telegram, Qt as a whole, etc). Notable exceptions being java apps.
See: https://wiki.archlinux.org/title/HiDPI#X_Resources https://wiki.archlinux.org/title/Xorg#Setting_DPI_manually
That's available in sway/wlroots master with xdg-desktop-portal-wlr master. Will be in next release.
So far, it has been a moderately positive change.
Wayland’s architecture makes tearing inherently less likely not the least reason being that the compositor synchronizes all drawing with the display rate. X11 is much more of a free for all.
There were annoyances when I realised I could no longer use certain workhorses (e.g. feh), but usually a bit of digging turned up a drop-in replacement (e.g. imv).
I switched to it beginning of this year and haven't looked back. Initially I ran JaKoolIt's dotfiles which had a bit too many anime waifus, then some custom dotfiles I made myself, and finally Omarchy which really checks all the boxes for me.
My single gripe I have with it is multi-monitor behavior is pretty bizarre, as workspaces are a per-monitor deal.
My other complaint was with how it dealt with ultrawide monitors, but I managed to get a PR in that fixed that and let you configure an aspect ratio for windows that are the only window on screen so that they aren't always stretched a kilometer wide.
If someone wants to steal my homework, this is what I did
# use `hyprctl monitors` to get your monitors' names, replace DP-3 and HDMI-A-1 as appropriate
workspace = 1, monitor:DP-3, default:true
workspace = 2, monitor:HDMI-A-1, default:true
workspace = 3, monitor:DP-3
workspace = 4, monitor:HDMI-A-1
workspace = 5, monitor:DP-3
workspace = 6, monitor:HDMI-A-1
workspace = 7, monitor:DP-3
workspace = 8, monitor:HDMI-A-1
unbind = SUPER, code:10
unbind = SUPER, code:11
unbind = SUPER, code:12
unbind = SUPER, code:13
unbind = SUPER, code:14
unbind = SUPER, code:15
unbind = SUPER, code:16
unbind = SUPER, code:17
bindd = SUPER, code:10, Switch to workspace 1, workspace, 2
bindd = SUPER, code:10, Switch to workspace 1, workspace, 1
bindd = SUPER, code:11, Switch to workspace 2, workspace, 1
bindd = SUPER, code:11, Switch to workspace 2, workspace, 2
bindd = SUPER, code:12, Switch to workspace 3, workspace, 4
bindd = SUPER, code:12, Switch to workspace 3, workspace, 3
bindd = SUPER, code:13, Switch to workspace 4, workspace, 3
bindd = SUPER, code:13, Switch to workspace 4, workspace, 4
bindd = SUPER, code:14, Switch to workspace 5, workspace, 6
bindd = SUPER, code:14, Switch to workspace 5, workspace, 5
bindd = SUPER, code:15, Switch to workspace 6, workspace, 5
bindd = SUPER, code:15, Switch to workspace 6, workspace, 6
bindd = SUPER, code:16, Switch to workspace 7, workspace, 8
bindd = SUPER, code:16, Switch to workspace 7, workspace, 7
bindd = SUPER, code:17, Switch to workspace 8, workspace, 7
bindd = SUPER, code:17, Switch to workspace 8, workspace, 8
#!/bin/env bb
(ns switch
(:require [clojure.java.shell :as sh]
[babashka.process :refer [pipeline pb shell process]]
[clojure.string :as str]))
(def workspace-ids
(-> (pipeline (pb "hyprctl workspaces")
(pb "grep 'workspace ID'")
(pb "awk '{print $3}'"))
last
:out
slurp
(str/split #"\n")
(->> (reduce (fn[acc e]
(try (let [ee (Integer/parseInt e)]
(conj acc ee))
(catch Exception e acc))) [])
(filter #(and (pos? %)
(not= 10 %))))))
(doseq [w workspace-ids]
(-> (process (str "hyprctl dispatch moveworkspacetomonitor " w " 1"))
deref
:exit
println))
(process "hyprctl dispatch workspace 8")
It basically just moves all workspaces with positive IDs (so not the special workspace) to the external monitor, which seems to have a consistent ID of 1.i used to have a setup like this on i3, using i3-msg to query the state
Is this possible on Niri, where the virtual desktop expands infinitely?
Important long lived ones would be on workspaces where I could jump to them by number. I would have sound mixer and music on 1, mail and instant messaging on 2, browser on 3, then dev stuff or admin tasks etc on 4+. These would stretch horizontally, of course.
What I found was the “+” in “4+” could often be quite a lot of windows. I might have to reference some PDF in order to fill out a form in another PDF, and open a new browser window to manage some other reference document, and screenshots for the final draft, and terminals for taking temporary notes, maybe an image editor to trim screenshots, etc.*
With niri, I still have the “1234” layout but these are now rows with keyboard shortcuts. The ad hoc windows that get pushed onto and popped off my mental context stack grow rightwards… as a stack!
For me, niri’s brilliance is giving me those two axes. Known topics with keyboard navigation on the vertical axis. Ad-hoc tasks within each topic on a push/pop context stack on the horizontal axis.
*Ironically, these multi-window tasks were always the most mundane! Form filling for a mortgage application, say, or managing a report review for multiple authors. Software engineering — one of the more complicated things one can do on a computer, is all very neatly contained inside an IDE / tmux+vim+sh.
niri msg action focus-window --id $(niri msg --json windows | jq '.[] | select(.app_id=="foot") | .id')
1: notes
2: browser
3: code
4: mail
5 onward: dynamic or named on the fly
However Niri works fantastically in both use cases because it gives me what I really want: Resizable, rearrangeable columns of windows, as many as I need for the current task and a way to quickly rearrange and spatially navigate so that I can see exactly what I need to see.
Try PewDiePie. around 6.7M people now know something like Linux and Hyprland exists, and that in 2025 it might even work better than MacOS or Windows and whatever desktop environments on Linux came before.
edit: and as fellow niri user, I recommend people try it. I think it's one of the easiest tiling WMs to get into, it feels very natural within minutes.
If that doesn't feel useful to you, then maybe a tiling wm isn't right for you. That's entirely fine.
My wm has an "escape" in that I can define floating desktops, and by default I have one, mostly used for file management, because there are things where I agree it's better to have floating/overlapping windows.
It doesn't really matter if it's a "waste of space" - I have two large monitors, and 10 virtual desktops to spread windows between (I'd add more, but I haven't felt the need). To the point where my setup, by default, centers the window with large margins when I have just one window open on a screen because it's more comfortable (and I'm just one keypress away from fullscreening the app anyway).
Most of the time I use tiling because I like not having to care about the layout beyond those defaults.
But I can also configure specific layouts. E.g. I have desktop dedicated to my todo list, a list of done items, and notes, and it has a fixed layout that ensures those windows are always in the same placement, on the same desktop.
In my day to day I have a couple terminals (each with 4-5 tabs, some are running screen sessions), two browsers (with max 3-4 tabs open), music player, at least 2-3 IDE's open (JetBrains), Notes, mail client, Slack. This is across two monitors.
For me it's pure speed at getting to where I need to go. My notes live on workspace 1, my main workspace on 2 and browser on 3, so I'm just a single key combination away from most of what I need. Can still alt+tab if I like.
It's quite the opposite.
My laptop has a small 11.1'' screen, so using a traditional desktop with smaller windows is not practical for me. Plus, not having the windows overlap with each other by default gives a more structured workflow.
unrelated to the comment: I wrote this answer 3 times, but the damn process killer on Android kept deleting it so I had to re-write it each time. if I sound mad, it is because I am.
Thirds, quarters, sixths. Move windows to the next screen. Increase and decrease size.. so many nice things you can do with just the keyboard.
Its keyboard shortcuts are so deeply in my brain I could rattle them off while operating heavy machinery :)
AeroSpace is almost there, it has a few quirks and annoyances and is missing some features but it's close enough that it's now my daily driver for client work requiring being on a Mac.
Highly recommended and hopefully it continues to evolve. Also hoping that the churn in macOS is not going to kill it for some unexpected reason.
As far as Hyprland, I tried it and when I got to a setup that I felt comfortable I realized that I had basically replicated my Sway setup with no added benefits so I just switched back to Sway. I'm not much into ricing anyway. I mostly want the chrome to stay out of my way.
That said, for people unfamiliar with i3/Sway, Hyprland could be a great way of getting into tiling so I'm definitely rooting for them!
AeroSpace tiling window manager finally changed my work day from constant struggle to only occasional struggle with macOS. I use it with sketchybar which is not yet perfect, but it could become quite good and performant with some work on it.
I currently use Gnome on Linux, not a tiling window manager, and I would gladly go with Hyprland, but about a year ago while I was trying it out, it crashed quite a few times so it clearly was not ready for production use back then. Will give it a shot again.
I've switched back full time to Omarchy, and couldn't be happier. I'll likely eventually land back on NixOS with hyprland and my custom configs, but for now, Omarchy is wonderful.
DHH is just the salesman a Linux distro like this needs, and the combination of smart decisions (most menu'd commands just call out to shell scripts behind the scenes) and text-based config make Omarchy a techie's dream.
Add something like claude code in your ~/.config directory and you have almost instant and infinite ability to customize.
It's so much fun.
For any former i3 users, I've found https://github.com/outfoxxed/hy3 to be a very acceptable replacement.
Why do people do this?
Having said that, I guess the compression of the video makes it less sharp and contrasty as it is in real life. But all code is shared in the original with a link in the description if someone really wants to dig deeper into it.
As a recent hyprland user it's really useful being able to pick out the features I like and incorporating them into my setup.