What's New Since 0.4.9.9
This release focuses on making multi-monitor setups more predictable, while cleaning up hotkeys, single-window sizing, spacing, and app rules.
✨ New Features
🖥️ Custom monitor layout ("Monitor Routing")
OmniWM now has a dedicated OmniWM Routing Arrangement in Settings → Monitors. By default it follows your macOS display arrangement, but you can switch to Custom Arrangement and drag your displays into the layout OmniWM should use for cross-monitor behavior. This map drives focus movement, moving windows between monitors, and mouse warp — it does not change where macOS physically places windows. Great when macOS's arrangement doesn't match where your monitors actually sit.
How to use: Settings → Monitors → OmniWM Routing Arrangement → choose Use macOS Arrangement (default) or Custom Arrangement, then drag each display tile into a grid that matches your real desk. A Left/Right/Up/Down neighbor preview shows the result.
🔀 Directional focus can cross to the next monitor (opt-in)
Pressing Focus Left/Right/Up/Down at the edge of a workspace used to do nothing once you ran out of windows. Now it can jump focus to the monitor physically next to you in that direction, selecting the window nearest the edge you crossed — treating all your displays as one continuous space.
How to use: turn on Focus Across Monitor at Edge (menu-bar menu under CONTROLS, or Settings → Monitors → Cross-Monitor Behavior). Default focus keys are Option + arrow keys. Off by default; does nothing on a single monitor.
↔️ Move a window across to the next monitor (opt-in)
Keep nudging a window past the edge of a workspace and it can now hop to the neighboring monitor's active workspace.
How to use: enable Move Window Across Monitor at Edge (menu-bar menu or Settings → Monitors → Cross-Monitor Behavior). Off by default.
📋 App rules for apps that have no bundle ID
App rules now work for apps that don't expose a normal runtime bundle ID (some Electron/Java/wrapper apps, e.g. VMD). Leave Bundle ID blank and match by app name or window title instead. Bundle ID is still the strongest match when an app has one.
How to use: menu-bar → App Rules → Add app rule. Pick the app from the running-apps list (apps with no bundle ID are now flagged "No bundle ID" and auto-enable name matching), or leave Bundle ID empty and open Advanced Matchers to switch on App Name Contains and/or set a Title Match (substring or regex). A rule must still have at least one identifier — a rule built only from AX role/subrole is rejected as too broad. The CLI supports the same:
omniwmctl rule add --app-name-substring VMD --layout float
⌨️ Pin a shortcut to the left or right modifier
Shortcuts can now fire only on a specific side of a modifier — e.g. Left Option and Right Option can be treated differently.
How to use: Settings → Hotkeys. After you record a shortcut that includes a modifier, a Modifier side dropdown appears: Either (default, same as before), Left, or Right. Existing shortcuts keep matching either side unless you change them. Side-pinned shortcuts require Input Monitoring permission; either-side shortcuts keep working without it.
🎯 System Hyper Trigger (one key acts as Hyper)
Don't want to hold four keys? A single key or extra mouse button can stand in for the whole Hyper chord while held — e.g. hold Caps Lock and OmniWM treats it as ⌃⌥⇧⌘.
How to use: Settings → Hotkeys → System Hyper Trigger dropdown. Supported triggers include Caps Lock, F13–F20, right-side modifier keys, and extra mouse buttons (3/4/5). Set to None by default; requires Input Monitoring permission.
🔧 Changes & Improvements
Hyper is now a literal ⌃⌥⇧⌘ chord
"Hyper" is simplified — it's now literally Control + Option + Shift + Command, with no virtual-Hyper machinery to configure. (See System Hyper Trigger above for a one-key stand-in.)
The default workspace-switch shortcuts changed:
- Switch to workspace 1–9: now
Option + 1–9(wasHyper + 1–9) - Move window to workspace 1–9: still
Option + Shift + 1–9
Your custom hotkeys stay custom, but if you relied on the old Hyper behavior, check Settings → Hotkeys.
⚠️ The old Hold Threshold setting was removed — a System Hyper Trigger now acts as Hyper instantly while held, with no delay to configure.
Single-window sizing: Full Screen / Custom / Column Width
Single-window settings are now clearer and shared across Niri and Dwindle. The old per-layout ratio picker is replaced by one control with three modes:
- Full Screen (new default) — a lone window fills the available work area.
- Custom (W:H) — a fixed width × height (default 1920×1080), centered and clamped to the screen.
- Column Width (Niri only) — keeps the old default-column-width behavior, now an explicit choice.
How to use: Settings → Niri Layout or Dwindle Layout → Single Window (also available per-monitor, shown as "Global" until you override it).
⚠️ Default is now Full Screen. Old ratio-style settings are migrated into Custom sizes where possible, but if your setup depended on the old implicit single-window sizing, check Settings → Niri/Dwindle.
Fullscreen truly fills the display
Fullscreen and single-window Full Screen now use the same gapless, UI-safe layout frame — edge-to-edge, ignoring tiling gaps, while still staying clear of the menu bar/notch and the workspace bar. Normal tiled layouts still respect your gaps.
⚠️ If you use outer gaps, fullscreen / Full Screen windows will now look noticeably larger and flush to the edges.
Mouse warp, simplified
Mouse warp (jumping the pointer from one screen edge to the next) now follows your routing arrangement instead of the old warp axis/order model, and is a single on/off toggle.
⚠️ The old warp order and axis/direction settings were removed. If you had custom warp ordering before, review Settings → Monitors after updating and set up a Custom Arrangement if needed.- How to use: Mouse Warp toggle (menu-bar menu or Settings → Monitors → Cross-Monitor Behavior); on by default. A new Mouse Warp Margin stepper (1–10 px) controls how close to the edge the pointer warps.
- (The cross-monitor control "Follow Window to Workspace" was also renamed to Follow Window to Monitor to better describe what it does.)
Per-monitor outer margins, now in one place
Outer margins can be configured per monitor from Settings → General → Outer Margins, helpful for mixed setups where one display needs different top/bottom/left/right spacing than another. These now apply to both the Niri and Dwindle layouts.
⚠️ The outer-margin sliders moved from the Dwindle Layout tab to the new "Outer Margins" section on the General tab. Use the Configure dropdown to pick Global Defaults or a specific monitor.- Top margins are now measured consistently from each screen's physical top edge, so spacing behaves better across built-in, notched, and external displays.
Uncapped workspace bar offsets
The workspace bar's X/Y position offsets are no longer capped at ±500 px, so you can position the bar farther for unusual or notch-aware layouts. (Heads-up: very large values can push the bar off-screen; reset toward 0 to recover.)
How to use: Settings → Workspace Bar → Position Offset → X/Y Offset (global or per-monitor).
🐛 Fixes and Polish
- Fixed multi-monitor outer gap resolution so each display resolves its own consistent margins, especially when mixing notched and notchless screens. (#419)
- Fixed lone-window sizing bugs that could leave a window at a broken size or stuck after moving across workspaces. (#420, #220)
- Improved Niri behavior when windows move between workspaces or modes (per-workspace membership is now reconciled correctly for windows present in more than one workspace).
- Directional focus no longer dead-ends on empty Niri edge cases when cross-monitor focus is enabled.
- Monitor orientation editing now uses the monitor arrangement canvas — click a display to edit it instead of using a separate picker.
- Status-bar cross-monitor controls were grouped and relabeled for clarity.
- For CLI/IPC users, the per-display query now reports resolved outer gaps (
outer-gap-left/right/top/bottom). - OmniWM's GPL-2.0-only licensing is now explicitly documented and enforced in source headers.
⚠️ Quick heads-up for existing users
- Workspace switching is now
Option + 1–9(wasHyper + 1–9). - Single windows fill the screen by default (Full Screen).
- Fullscreen windows now reach the screen edges (gaps ignored).
- Mouse-warp order/axis settings are gone — warp now follows your monitor routing.
- Outer Margins moved from the Dwindle tab to the General tab.
- The Hyper "Hold Threshold" setting was removed.
- New opt-in features (System Hyper Trigger, left/right modifier shortcuts) need macOS Input Monitoring permission.
Release Integrity
OmniWM-v0.5.0.zipcontains the Developer ID signed, notarized, and stapled OmniWM app.OmniWM-v0.5.0.zipSHA-256:df60450706f417f03f0eec0d1ba98cbd4cd5ad4770cdcc3ebecb29b717db7116GhosttyKit.xcframework-v0.5.0.zipSHA-256:82ed64eef824be6fec1e8fc363c557702b42b89eb012f37e616a0a3041cff100