Nomos

A window manager for macOS. Windows stay floating — Nomos doesn’t tile the screen — but one key moves the frontmost window into zones you defined, across every display you have.

early access macOS 14+ Accessibility permission only opt-in update checks only
Download Nomos 2.4 MB · macOS 14 or newer

The ring

One ring through every display

Zones from every display are threaded onto a single ring, in an order you set by hand rather than one derived from screen geometry. One key walks that ring through every place a window can go, regardless of which monitor it is currently on — and wraps around at the end.

1 2 3 4 5 landscape · 2560 × 1440 portrait · 1440 × 2560 wraps back to 1

The ring is one list, not one list per screen. Zones sit flush against each other by construction: a zone is a leaf of a tree of splits, and a split always accounts for the whole of what it divides — a gap or an overlap between zones cannot be expressed at all.

Geometry

Geometry belongs to the zone, not the window

A window takes the shape of wherever it lands. A terminal moved onto a portrait monitor becomes wide and short there, instead of dragging along the tall, narrow shape it had on a landscape one. This is the difference from dragging a window across a monitor boundary by hand, where it keeps its old proportions and you resize it again at the other end.

Terminal Terminal tall and narrow here… …wide and short here

Measured on a two-monitor desk, the discrepancy between the frame Nomos asks for and the frame the window ends up with was half a point or less.

Keys

The keys

Every command is the hyper key plus one more. The hyper key is a combination of modifiers you choose — it defaults to ⇧⌘⌃⌥, what a Space Cadet keyboard called Hyper — and it is shared by every command below, which is why the table doesn’t spell the modifiers out on each row.

CombinationAction
hyper + next zone in the ring
hyper + previous zone in the ring
hyper + expand the window one level out in the layout tree
hyper + shrink it back toward the zone it was expanded from
hyper + Ttidy: lay out the current display’s windows across its zones
hyper + Ffill the display with the focused window
hyper + Asnap the focused window back into the zone it is already in
hyper + cycle the windows of the zone the focused window is in
hyper + 1…9move the focused window to the ring zone with that number

Every key above except the digits can be changed, from the settings window or by hand in the config file. The digits stay reserved on purpose: letting a command and a zone number land on the same combination would mean one of them wins silently.

Putting a window back

A window drifts — dragged aside to see what is behind it, resized by an application with its own ideas, left in place while the layout around it changed. hyper + A puts it back into the zone it is already in, without having to recall that zone’s number or walk the ring forwards and back again.

It puts the window back into the zone’s own rectangle, not wherever a drag or another app’s resize left it.

Several windows in one zone

A zone is a place, not a window, and several collect in one: two browser windows, a terminal under an editor. hyper + cycles through the windows of the zone the focused window is in — that zone, not the one under the pointer, because your hand is on the keyboard and the mouse is wherever you left it.

The first press selects the window before the current one, so pressing and letting go returns you to where you just were. A panel appears in the zone showing applications and window titles — titles are there for the case this exists for, two windows of the same browser being identical by icon and by name. The order comes from the stacking order rather than a remembered list, so it is right from the first press after a restart.

Seeing the zones

Hold the modifiers for a moment without pressing anything else and the zones appear on every screen, numbered in the order the arrows walk them. Release any of them and they disappear. Nothing is clicked and nothing is consumed — it is a hint, not a mode. A broken config reports its error there too, which is the moment you are most likely to be looking.

How long that moment lasts, and how the zones look while it does, are yours to set — in the settings window’s Overlay section or in the config file. The wait before they appear defaults to a third of a second, which is the compromise between flashing up on every hotkey and making you wait for it; delay = 0 shows them at once. The shading, the size of the numbers and their colour are settings for the same reason: what reads clearly on dark wallpaper disappears on bright.

Configuration

Zones are drawn, not typed

The settings window shows everything the config holds — the monitor map, each monitor’s zones, the ring order across every monitor, the hotkey modifiers. The zones themselves are edited on the real screens rather than on a map: the layout is drawn full-size on every monitor, below the settings window so it never covers what you are working on. Hover a zone to split or remove it; drag the boundary between two and both resize together, snapping to halves, thirds and quarters, with for the exact position instead. ⌘Z undoes a whole gesture at a time, not a pixel at a time.

Underneath it is plain TOML in ~/.config/nomos/config.toml, picked up automatically — no restart:

[hotkeys]
modifiers = ["control", "option"]

[overlay]                    # every field optional; these are the defaults
delay = 0.3                  # seconds of holding before the zones appear
backgroundOpacity = 0.18     # how much a zone darkens what is under it
numberSize = 64              # the zone number, in points
color = "#FFFFFF"            # borders and numbers

[[display]]
name = "XG32UCWG"
orientation = "landscape"

  [display.split]
  axis = "vertical"      # top-to-bottom cut, divides width
  at = 0.5

    [display.split.first]

    [display.split.second]

A broken config doesn’t crash anything: Nomos keeps the last valid layout and reports the error from the menu bar icon, so window placement stays usable while the file is being fixed.

Requirements

What it asks of your Mac

  1. macOS 14 or newer, Apple silicon and Intel.
  2. Accessibility permission, and nothing else. No Input Monitoring, no screen recording. The network stays untouched until you allow update checks, and checking for updates is the only thing it ever does there — no telemetry, no analytics.
  3. A hyper key of at least two modifiers. One modifier alone would take ordinary keys away from every application, so Nomos won’t accept it.
  4. Displays that report a name. Zones bind to a display by name, so a nameless one has nothing to bind to — the menu bar marks those unusable.

If you want one convenient key rather than a four-finger chord, map Caps Lock onto all four modifiers with Hyperkey — a small free app that does exactly this and nothing else. That is the usual way Caps Lock becomes Hyper, and it is how Nomos is used day to day on the machine it is built on.

Get it

Download

Signed with a Developer ID and notarized by Apple, so it opens without a warning and without a trip to System Settings to unblock it.

Download Nomos

2.4 MB · macOS 14 or newer · questions and bug reports

The first launch is two launches

Drag Nomos to Applications and open it. It asks for the Accessibility permission — the one that lets it move windows — and then quits rather than waiting around. Grant it in System Settings → Privacy & Security → Accessibility, then open Nomos again. That second launch is needed once and never again.

Nomos has no window of its own: it lives in the menu bar, and that icon is where the settings, the display list and any configuration errors are.

Where it actually stands

Verified on a two-monitor desk: a window walks the ring across both monitors and wraps, and a terminal moved to the portrait monitor comes out wide and short. Still early, though — it has run on one desk, tidy has seen only a handful of windows, and nobody but its author has used it.

Credits

Credits

The trickier parts of driving the Accessibility API — notably the size-then-position-then-size sequence needed to reliably resize a window, and the fallback to the focused window when the target can’t be found directly — are adapted from Rectangle by Ryan Hanson (MIT) — the app this one is indebted to, for the idea as much as for the code. Rectangle’s licence text ships inside the Nomos bundle, because MIT asks for the text itself to travel with the software, not merely for the source to name where it came from.

Nomos is proprietary software. Third-party code it adapts keeps its own terms.