OmniWM
OmniWM is a free, open-source, Developer ID-signed and Apple-notarized tiling window manager for Apple Silicon Macs running macOS 26 or later. It combines Niri-style orientation-aware scrolling containers and Hyprland-style Dwindle BSP layouts, selectable per workspace, with multi-monitor routing and optional local CLI/IPC automation.
Website · Documentation · Install · Compatibility · Fluxer
Demo Video
Contributors
Thank you to everyone who contributed to OmniWM. Your ideas and code made a real difference.
🛠️ Maintainers
|
🏢 By Employer
|
Bitkey ━━━━━━━━
Naoki Ikeguchi @siketyan |
BlueLabs ━━━━━━━━
Cristian Álvarez Belaustegui @crbelaus |
EPAM ━━━━━━━━
Aleksei Gurianov @Guria |
Finanzguru ━━━━━━━━
Janek Thomaschewski @jthomaschewski |
GitHub ━━━━━━━━
Ryan Hecht @RyanHecht |
━━━━━━━━
muhammadkh @MuhammadKh |
inDrive ━━━━━━━━
millia ampora @dappermint |
Liip ━━━━━━━━
Jonathan Macheret @Jonathanm10 |
Luxor Labs ━━━━━━━━
Albert Ilagan @albertilagan |
mooola ━━━━━━━━
Luke Stephens @imprisonedmind |
Nx ━━━━━━━━
Steven Nance @llwt |
ReactSquad ━━━━━━━━
Jan Hesters @janhesters |
Spotify ━━━━━━━━
Alexander Dergachev @Cy6erBr4in |
SSW Consulting ━━━━━━━━
Matt Wicks @wicksipedia |
vhf ━━━━━━━━
Lukas Gerlinski @lgerlinski |
Viber ━━━━━━━━
Yuri Chukhlib @YuriNachos |
Walt ━━━━━━━━
Anton Plotnikov @pltanton |
🎓 By Education
|
Assumption University of Thailand ━━━━━━━━
Panuphong Burakitphachai @t1dotdev |
Linnaeus University ━━━━━━━━
Balazs Hevesi @balazshevesi |
NTU Singapore ━━━━━━━━
Nawat Suangburanakul @holmns |
Olin College of Engineering ━━━━━━━━
Cypress Frankenfeld @cypressf |
SUSTech ━━━━━━━━
Yang-Yiming @Yang-Yiming |
✨ All Contributors
|
🐞 Bug Reporters
Thank you to everyone whose bug reports led to fixes.
|
Highlights
- Optional window switcher with previews and separate Command-Tab / Option-Tab workspace scopes
- Ghostty-powered quake/sticky terminal
- Native macOS window-tab support
- Local IPC and
omniwmctlautomation - Scratchpads and sticky windows for any app
- Overview
- Unified command palette for windows, app menus, clipboard history, OmniWM commands, applications, and files
- Menu Anywhere
- Niri-style tabbed containers and Dwindle tile groups
- Niri-style scrolling and Hyprland-style Dwindle BSP layouts
- Status-bar icon concealment (similar to Ice)
- Keep Awake (similar to Caffeine)
- Interactive workspace and app-icon bar
- Many more features not shown in the video.
Compatibility and Limitations
OmniWM requires Apple Silicon, macOS 26 or later, Accessibility, Input Monitoring, and Displays have separate Spaces. Screen Recording is optional. Read the complete Compatibility, Requirements & Limitations page before installing.
- Dwindle restore scope — After a restart OmniWM rebuilds each Dwindle workspace from the persisted placements: split orientation and ratio, tab-group membership, tab order, and the active tab. Fullscreen state and the selected window are not restored, and once a window without a persisted placement is present, later windows insert normally instead of being placed from the catalog.
- Scratchpad membership — Window membership lasts for the current OmniWM process. Scratchpad labels persist, but memberships do not.
Performance & Trust
OmniWM is built for high responsiveness and smooth, crisp animations.
- Direct macOS integration — OmniWM uses public frameworks and selected Apple private APIs for window management and visual surfaces.
- Refresh-rate-aware animations — Animation pacing follows the active display refresh rate, including 60, 120, and 144 Hz displays.
- SIP stays enabled — Official OmniWM releases do not require disabling System Integrity Protection.
- Signed and notarized releases — Official release builds are Developer ID signed and Apple-notarized.
- Free and open source — OmniWM has no subscriptions, feature paywalls, trial limits, or usage caps and is licensed GPL-2.0-only.
- OmniShell network consent (Unreleased: available when building from
main) — Widgets need declared hosts and user consent or organization preapproval; native programs need trust tied to their executable and command. Settings > Network & Permissions manages those decisions and the built-in Weather and Lyrics switches, both on by default. Organization policies can block them. See network permissions and managed preferences.
Requirements
- macOS 26+ (Tahoe) on Apple Silicon
- Hidden Bar concealment and optional issue-report rewriting require macOS 27 or later; rewriting also requires enabled Apple Intelligence and an available local model
- Accessibility and Input Monitoring permissions (required at launch)
- Screen Recording permission for Overview thumbnails, drag previews, and captured Hidden Bar glyphs (optional)
- Full Disk Access permission for Hidden Bar concealment and the OmniShell Notifications widget (optional); notification replies and dismissal also use Accessibility
- System Audio Recording permission for per-app volume, Calendars access for the calendar widget, Location for the Wi-Fi widget's network name and Bluetooth for the Bluetooth widget in the Luau shell (optional)
- Displays have separate spaces ON (the macOS default; OmniWM pauses window management until it is enabled)
Installation
Homebrew
OmniWM is in the official Homebrew cask repository:
brew install --cask omniwm
This installs OmniWM.app and puts omniwmctl on your PATH.
Upgrading
Quit OmniWM first, then run brew upgrade omniwm and relaunch it. Homebrew replaces the app bundle underneath a running OmniWM.
Migrating from the project tap
BarutSRB/tap is retired: 0.6.7 was its final release, and every later version ships only through the official cask. If you installed from the tap, quit OmniWM and run these commands in this order:
brew update
brew upgrade omniwm
brew untap BarutSRB/tap
brew update has to come first: it fetches the retired tap's redirect to the official cask and moves your install over. Untapping before that would offer to uninstall OmniWM. brew reinstall --cask homebrew/cask/omniwm is optional and only switches the install record to the official cask right away.
Nix
OmniWM is packaged in nixpkgs, maintained by mmfallacy and samiser, and Home Manager ships an official
programs.omniwm module, maintained by DavSanchez. The package installs the signed release artifact with bsdtar, so the Developer ID
signature stays valid, and exposes OmniWM and omniwmctl on PATH. Both currently live on unstable branches
only (the nixpkgs unstable channels and Home Manager master) and may trail the latest GitHub release.
Install the package directly:
nix profile install nixpkgs#omniwm
With nix-darwin or Home Manager, add pkgs.omniwm to environment.systemPackages or home.packages.
For a declarative setup, enable the Home Manager module. It installs the package, runs OmniWM as a launchd
agent, and writes ~/.config/omniwm/settings.toml from an attribute set or a tracked TOML file:
programs.omniwm = {
enable = true;
settings = ./omniwm-settings.toml;
};
Treat the declared TOML file or attribute set as authoritative: edit it and run Home Manager switch to apply
changes. OmniWM preserves settings symlinks, so settings backed by a read-only Nix-store file cannot be saved
from the GUI. Set programs.omniwm.launchd.enable = false if you prefer to start and quit OmniWM manually
instead of having Home Manager manage its launchd agent.
After either installation, complete the macOS setup in steps 3-7 below.
GitHub Releases
- Download the
OmniWM-vapp archive from the latest release.zip - Extract and move
OmniWM.appto/Applications - In System Settings > Desktop & Dock > Mission Control, turn ON
Displays have separate Spaces - Log out of macOS and log back in for that change to take effect unless you had it on already
- Launch OmniWM and grant Accessibility and Input Monitoring when prompted
- Optionally grant Screen Recording for capture-derived visuals
- Return to OmniWM’s permissions window and click Start OmniWM or Continue Without Screen Recording. If a required permission still appears missing, click Check Again. To skip the window on later launches without Screen Recording, tick Don't ask about Screen Recording again first; it still appears if a required permission goes missing (Unreleased: available when building from
main)
Canary builds
Stable releases are recommended for everyday use. Canary builds let you try recent changes and help test fixes before the next release. Daily scheduled runs publish a build only when the checked-out main commit, or the app commit beneath any documentation-only commits on top, passes CI and includes app changes since the newest stable or canary tag in its history; documentation-only changes do not trigger a new build. Builds are signed and notarized, but may contain regressions.
To try one with a Homebrew or GitHub Releases install:
- Save a copy of
~/.config/omniwm/settings.toml - Quit OmniWM, then download the newest canary build and replace
OmniWM.appin/Applicationswith the app from its ZIP - Relaunch OmniWM. It uses your existing settings
Install and Relaunch in the update popup (Unreleased: available when building from main), download from the release page, or use brew upgrade --cask omniwm@canary if you installed that Homebrew cask and its new version is available. Older Canary builds need one manual update to gain Canary update checks.
To return to stable, quit OmniWM. If you installed omniwm@canary, run brew uninstall --cask omniwm@canary followed by brew install --cask omniwm. For an existing omniwm Homebrew install, run brew reinstall --cask omniwm; for a direct download, replace the app with the latest release. If stable cannot read settings saved by a canary, quit OmniWM and restore your copy. When reporting a canary bug, include its release link.
Updates
OmniWM checks for updates by default.
- On launch, OmniWM polls the latest GitHub release at most once per day.
- OmniWM never installs anything on its own.
Install and Relaunch(Unreleased: available when building frommain) downloads the release's app zip from GitHub, checks it against the SHA-256 digest GitHub publishes for it, checks that the new app carries the release's version and is signed and notarized by the same Developer ID as the running copy, swaps the bundle in place and relaunches. If you cancel the quit, the new version starts on the next launch. The button only appears when the release has an app zip and OmniWM can write to its own bundle, so Nix store and other read-only installs keep the manual actions. - When a newer release is available, OmniWM shows a centered popup with release notes and actions for
Install and Relaunch(when available),Open Release Page,Copy brew upgrade omniwm,Skip This Version, andNot Now. - You can control this from
Settings > General > Updatesor trigger a manual check from the status bar menu withCheck for Updates....
Documentation
The canonical documentation hub lives at omniwm.app. This README and the guides follow current main; features newer than the latest release are marked Unreleased.
- Documentation Home
- Layout Modes
- Keyboard Shortcuts
- Architecture Guide
- IPC & CLI Reference
- Contribution Docs
- Canonical Contributing Guide
IPC and CLI
OmniWM ships with a bundled CLI, omniwmctl, for automation and scripting.
IPC is disabled by default. Enable Enable IPC from the menu bar before using the CLI or any automation.
Diagnostics can be scripted with omniwmctl capture start trace, omniwmctl capture start performance, omniwmctl capture stop, and omniwmctl capture status.
omniwmctl window mark can name, list, focus, summon, and remove runtime window marks. See Window Marks.
For setup, installation options, commands, queries, rules, subscriptions, and security details, see the IPC & CLI Reference.
Quick Start
- Launch OmniWM from your Applications folder
- In System Settings > Desktop & Dock > Mission Control, turn ON
Displays have separate Spaces - Log out of macOS and log back in for that change to take effect unless you had it on already
- Grant Accessibility and Input Monitoring in the launch permissions window, and optionally Screen Recording. Return to that window and click Start OmniWM or Continue Without Screen Recording; use Check Again if a required permission still appears missing
- Windows will automatically tile in orientation-aware Niri containers: monitors using horizontal orientation show columns that scroll left and right, while vertical orientation shows rows that scroll up and down
- Keep one macOS Space per display and navigate with OmniWM workspaces; extra native Spaces are tolerated (their windows are left to macOS, not tiled)
- Use the defaults in Keyboard Shortcuts to navigate, and customize them in
Settings > Keyboard Shortcuts - Click the menu bar icon to access Settings, including
Settings > General > Updates - Enable
Start at LoginunderSettings > General > Startupto launch OmniWM automatically when you log in - Use
Check for Updates...from the status bar menu whenever you want to run a manual update check - On macOS 27+, if you enable Hidden Bar and selected menu-bar icons disappear, right-click or Option-click OmniWM's menu-bar icon to open the Hidden Icons Bar and click any icon to use it.
User Guide
Multi-Monitor Setup
OmniWM uses two display maps for different jobs:
- Open System Settings > Displays > Arrange. Put the physically largest or widest display at the bottom. Place the next smaller display above and to its right so its bottom-left corner touches the lower display's top-right corner. Continue the same staircase for every additional display. This macOS map is a technical arrangement used for actual window placement; it does not need to look like your desk.
- Open OmniWM Settings > Displays and arrange the OmniWM routing map to match where the displays really sit on your desk. Tiles can be separated by empty grid cells, but every display must remain connected through a chain of shared rows or columns. A diagonal-only tile is disconnected and cannot exchange directional focus, window moves, or mouse warp.
- Assign at least one workspace to every connected display. Window moves between displays need a destination workspace, so the setup assistant will not finish while a display is uncovered. You can reassign an existing workspace or explicitly add one for that display.
- Leave Mouse Warp turned on for the recommended experience. It lets the pointer cross between displays according to the real-desk OmniWM map even though macOS uses the staircase.
Custom arrangements are remembered for each set of connected displays, so home and work can keep different positions for the same laptop display. Reconnecting a saved set restores its arrangement automatically. If there is no exact match, OmniWM inherits the smallest saved arrangement containing every connected display; an uncovered set or an invalid grid follows macOS. Editing, resetting, or finishing setup saves only the connected set, leaving any larger arrangement unchanged. Simply connecting displays or opening Settings does not save an arrangement. Workspace assignments and other per-monitor settings remain separate.
Move Window Across Monitor at Edge sends a window beyond a workspace edge to the adjacent routed display and always follows it. Dedicated monitor-move actions work independently of this setting and use Follow Window to Monitor, which also controls focus after ordinary window or column transfers to another workspace.
Workspace homes can be Main, Secondary, Tertiary, or a specific display. By default Main is the display with the macOS menu bar and Secondary and Tertiary are the next displays in arrangement order. The Monitor Roles list in Settings > Displays lets you rank displays instead: the highest-ranked connected display is Main, then Secondary, then Tertiary, and disconnected entries are skipped, so two external displays can hold fixed roles at your desk while the built-in display takes over when you unplug. The Quake terminal's Main Monitor option follows the same ranking.
Layout Modes
OmniWM offers two layout engines that you can switch between per workspace:
Niri (Orientation-Aware Scrolling Containers) - On monitors using horizontal orientation, windows form vertical columns that scroll left and right; in vertical orientation, they form horizontal rows that scroll up and down. Each container can hold multiple windows or be "tabbed" (multiple windows, one visible at a time).
Hyprland Dwindle (BSP) - Binary space partition layout that recursively divides screen space. Each new window splits the space in half, and a tile can group multiple windows as tabs. Best for traditional tiling with predictable layouts.
Use the Toggle Workspace Layout shortcut below to switch layouts per workspace or configure them in GUI settings.
Keyboard Shortcuts
All shortcuts are customizable in Settings > Keyboard Shortcuts. Hyper is the literal Control + Option + Shift + Command chord by default; which modifiers make up Hyper is configurable in Settings > Keyboard Shortcuts (for example, exclude Shift to keep Hyper + Shift + … free for extra bindings). Changing the combination retargets every shortcut that currently resolves to Hyper onto the new one, so the shortcut list updates in place as you toggle the modifiers. Optionally pick a System Hyper Trigger — a single key (Caps Lock, F13–F20, or a left- or right-side modifier) or an extra mouse button that acts as Hyper while held (this needs Input Monitoring permission). Leave the trigger as None if you already produce Hyper another way, such as a Karabiner Elements remap. The tables below list all the default hotkeys:
Layout legend:
Sharedworks in any active layout.Niriworks only when the active workspace uses the Niri layout.Dwindleworks only when the active workspace uses the Dwindle layout.
If a shortcut does not fire: Check Settings > Keyboard Shortcuts and Settings > Troubleshooting for registration issues, then look for another hotkey tool, such as skhd or Raycast, still running with the same binding. HotkeyClash can help inspect possible conflicts in running apps, supported config files, and macOS shortcuts. It does not parse Raycast's shortcut settings. Disable or reassign the conflicting binding and retry before editing settings.toml.
Workspace
| Action | Default Shortcut | Layout |
|--------|------------------|--------|
| Switch to Workspace 1-9 | Option + 1-9 | Shared |
| Move Focused Window to Workspace 1-9 | Option + Shift + 1-9 | Shared |
| Switch to Workspace Slot 1-9 (position on the current monitor) | Unassigned | Shared |
| Move Focused Window to Workspace Slot 1-9 (position on the current monitor) | Unassigned | Shared |
| Switch to Last Active Workspace (Back and Forth) | Control + Option + Tab | Shared |
| Switch to Next Workspace | Unassigned | Shared |
| Switch to Previous Workspace (Sequential) | Unassigned | Shared |
| Move Focused Window to Workspace Up | Control + Option + Shift + Up Arrow | Shared |
| Move Focused Window to Workspace Down | Control + Option + Shift + Down Arrow | Shared |
| Move Focused Column to Workspace 1-9 | Unassigned | Niri |
| Move Focused Column to Workspace Up | Control + Option + Shift + Page Up | Niri |
| Move Focused Column to Workspace Down | Control + Option + Shift + Page Down | Niri |
When you create workspace 10 or higher, Settings > Keyboard Shortcuts adds its Switch, Move, and Move Column actions as Unassigned.
Focus
| Action | Default Shortcut | Layout |
|--------|------------------|--------|
| Focus Left / Right / Up / Down | Option + Arrow Keys | Shared |
| Focus Next / Previous Window (Wrap) | Unassigned | Shared |
| Focus First / Last Window in Column | Unassigned | Niri |
| Focus Window or Workspace Down / Up | Unassigned | Niri |
| Focus Previously Focused Window | Option + Tab | Shared |
| Traverse Backward | Unassigned | Niri |
| Traverse Forward | Unassigned | Niri |
| Focus First Column | Option + Home | Niri |
| Focus Last Column | Option + End | Niri |
| Focus Column 1-9 | Control + Option + 1-9 | Niri |
| Focus Window 1-9 in Column | Unassigned | Niri |
| Toggle Command Palette | Control + Option + Space | Shared |
| Open Menu Anywhere | Control + Option + M | Shared |
| Set Mark on Focused Window | Unassigned | Shared |
| Remove Mark from Focused Window | Unassigned | Shared |
| Close Focused Window | Unassigned | Shared |
| Toggle Workspace Bar | Unassigned | Shared |
| Toggle Hidden Icons Panel | Unassigned | Shared |
| Toggle Quake Terminal | ` Option + ` | Shared |
| Toggle Overview | Option + Shift + O | Shared |
| Toggle System Stats | Unassigned | Shared |
| Volume Up | Unassigned | Shared |
| Volume Down | Unassigned | Shared |
| Mute or Unmute Volume | Unassigned | Shared |
| Play or Pause Media | Unassigned | Shared` |
... (README truncated for length)