Amethyst & chunkwm – Comparing MacOS Tiling Window Managers

If you typically work with a lot of applications open at once on MacOS, you’ve probably noticed that things get pretty cluttered pretty fast. MacOS’s window manager has a few built-in features to help manage things, but I was never completely happy with it. In the last few months, I’ve been experimenting with using two tiling windows managers—Amethyst and chunkwm. In this post, I’ll give a brief overview of some of their differences and difficulties.

Why Use a Tiling Window Manager?

Tiling window managers (TWMs) organize the applications on your desktop into non-overlapping tiles. They may do this by putting applications side-by-side, in rows, or in any number of non-overlapping layouts. The placement of windows is handled automatically for you, but you are given the power to easily rearrange and resize windows.

A big difference between tiling window managers and traditional window managers is that when you resize a window using a tiling window manager, other windows will also resize to ensure maximum use of screen real estate with no overlap.

The Contenders

I’ve been using both Amethyst and chunkwm, and I have been fairly happy with them. I don’t want to pick favorites here, but there are differences that could affect your choice if you are looking to jump into TWMs.

Amethyst

Amethyst is probably the easier option to get started. Its installation is straightforward, and it has a minimal GUI for editing its settings. Enabling and disabling is handled through the menu bar.

Amethyst provides a number of standard layouts that you can cycle through using a hotkey. In each layout, there is a “main” window (sometimes you can have multiple main windows, but I haven’t used that feature much). It seems the intention here is that most of your work is in the main window, and you can monitor the others. You can easily navigate to auxilary windows and swap them to the main position. You can also resize the main window, and all auxillary windows will adjust accordingly.

A few examples:

  • Tall: The main window is on the left side of the screen, with auxillary windows stacked vertically on the right.
  • Row: All windows are stacked vertically. The top one is considered the main window, and it usually takes up much more space than the others.
  • Binary Space Partitioning: Panes are split recursively. You can visualize this as starting with one pane, cutting it in two horizontally, then cutting the left-hand side in half vertically. (This is the layout `chunkwm` uses.)
  • Fullscreen: Only the main window is shown–all others are hidden.

chunkwm

chumkwm is a bit harder to implement. In addition to the window manager, you need to install another service to handle keyboard input. The maker of chunkwm provides two options. Both chunkwm and khd, the keyboard handler that I’ve used, need to be started as services via the command line, so I found it helpful to create aliases for enabling and disabling them. Editing settings is done via an `rc` file.

chunkwm deals exclusively with binary space partitioned layouts, and it gives you a ton of control within this paradigm. By default, you shift focus between frames using hotkeys reminiscent of Vim navigation, and you can resize the currently-focused pane.

Resizing takes the form of expanding or contracting one edge of the pane. For instance, the default configuration allows you to push the top of your current frame up using `command`-`option`-`w`, and you can pull it back down using `command`-`shift`-`w`. By default, recursive splits alternate between horizontal and vertical, which I don’t believe you can do with Amethyst.

The Downsides

I’ve really liked using both of these tools. I find it difficult when I have to go without tiling windows managers. When I use them, things feel clean, I know right where everything is, and I can see what I want to see. However, I have experienced a few pain points with them.

The learning curve

With both window managers, there are hotkeys to memorize, patterns you get used to, and settings you need to tweak to get them where you want. It definitely takes some time to get the muscle memory to be productive.

Some apps don’t play well with TWMs

I’ve seen a few applications that fight for control of their size. Some win (mostly MacOS applications like System Preferences). Some tie (iPhone simulators enlarge to take up the most space in a pane without distorting their dimensions in Amethyst). Some lose (popup menus in IDEs on chunkwm get expanded to take up a ton of real estate on the screen). And some are just horrible (chunkwm and iPhone simulators just flash between the size that the simulator wants, and the size chunkwm wants).

Both window managers have mechanisms for opting out of tiling. chunkwm does this by workspace, and Amethyst does this by application.

(Dis)connection with external monitors

With both window managers, everything goes wrong when you unplug an external monitor. Maybe this is fair–what would the expected behavior be in this situation? But it’s still a pain; my workflow now includes restarting the window manager whenever I unplug. It’s the biggest issue I’ve seen, and it would be a dealbreaker if I were connecting/disconnecting external monitors frequently throughout my day.

Wrapping It Up

Okay, so the list of complaints about these tools is longer than I’d like, but I think the pain points are worth it. Since installing them, I’ve felt more productive than ever. What’s your experience with TWMs?