I sorely miss tiling WMs when I use MacOS; Amethyst and yabai just seem to big out all the time, lose track of windows, get confused by native tabs, and deal poorly with windows that force maximum/minimum sizes. I've concluded that MacOS's window model just really doesn't mesh with tiling.
My current solution, after much experimentation with tools like Rectangle, Hookshot, and Spectacle, is to use Swish[1]. It feels sort of like an inside-out version of how I use Sway on linux. With Sway each window that I open is tiled onto the current desktop, then I re-balance the split or reposition the window with my mouse, and set the window to float if it doesn't cooperate.
With Swish each window opens as floating, but by swiping on its title bar I can tile it into whatever position I want. This defaulting to floating works better on MacOS where the frequency of uncooperative windows is much higher than on linux. The killer feature of Swish for me is that it keeps track of the grid you make by swiping windows into place and maintains it even when you resize or reposition windows relative to one another, much like i3/sway.
It's still quite frustrating though that I have to pay $16 for an app to make window management bearable. This is a basic OS feature that I've come to take for granted.
Actually, if you're interested at all, I just, after literally months of reading about this, found a pretty sick solution.
Have you ever heard of Phoenix? https://github.com/kasper/phoenix/. Despite googling around for this exact topic, with 3.8k stars I had never heard of it. Apparently someone has created slim, JS scriptable interface that is basically tailor made toward creating your own tiling WM. I just installed it and loaded one of the examples: https://github.com/nik3daz/spin2win. And what it does is basically ignores the built-in spaces and creates truly virtual desktops by just hiding and resizing windows. And it works pretty well. The response time between switching "desktops" is basically instant.
I had not heard of Phoenix, and it looks interesting. Though I doubt I would be able to do a better job of reimplementing sway/i3 in Javascript than the folks working on yabai have managed.
So, you don't have to. Check out that spin2win "example" I linked, it's really less of an example and more of a pretty fleshed out implementation of XMonad. I don't really know javascript/TS at all and I was able to get it running with a few tweaks in 20 minutes or so. Phoenix is super intuitive.
I'll admit it is a little bit janky (which the author admits/warns about). But it seriously does work better than yabai. This config (using Phoenix) basically abandons the native "Spaces" functionality and does everything by just maintaining an internal window state and moving windows around fast. So you don't have to disable SIP (a big thing for me, since I want to use this at work). I'm seriously kind of blown away, this is miles better than apps that people are paying for, and it was just sitting here in this guy's github fork.
It is super disappointing this is the best that Mac can do though. There is no reason there shouldn't be a mostly-native (ie, less janky) tiling wm solution on the platform.
Well that's the thing, I don't want an xmonad replacement; I'm not a fan of automatic tiling. I much prefer manual tiling a la i3. I looked through the Phoenix examples and didn't find something that worked how I wanted, so I'd be left implementing it myself. The reimplementation of Spaces by hiding/unhiding windows does sound like a nice trick that Amethyst and yabai should adopt though.
I've been using MacOS for awhile and this is likewise my one true gripe. I've played around with amethyst and yabai and also find them just a little too shaky to rely on. I miss the rock solid nature of i3/bspwm. And trying to script my own functionality with Hammerspoon or BTT has been an exercise in frustration. I'll give Swish a shot with this recommendation.
However I'm not sure Swish solves the big benefit of i3/bspwm for me, which is the lightning-quick virtual desktop and "send to desktop" functionality of a tiling WM on linux. Having two apps open side by side is useful, but not quite as useful as having two apps open full screen on virtual desktops 1 and 2, and the switch between them being totally instantaneous.
I recall that yabai can achieve this with SIP disabled. It somehow injects code to disable the Space switching animation, so hotkeys to switch Spaces become instant.