agentlytics
Comprehensive analytics dashboard for AI coding agents — Cursor, Windsurf, Claude Code, VS Code Copilot, Zed, Antigravi…
MacOS Niri and Hyprland inspired tiling window manager that's developer signed and notorized (safe for managed enterpri…
Thank you to everyone who contributed to OmniWM. Your ideas and code made a real difference.
|
Bitkey ━━━━━━━━
Naoki Ikeguchi @siketyan |
EPAM ━━━━━━━━
Aleksei Gurianov @Guria |
GitHub ━━━━━━━━
Ryan Hecht @RyanHecht |
━━━━━━━━
muhammadkh @MuhammadKh |
Luxor Labs ━━━━━━━━
Albert Ilagan @albertilagan |
ReactSquad ━━━━━━━━
Jan Hesters @janhesters |
vhf ━━━━━━━━
Lukas Gerlinski @lgerlinski |
|
Assumption University of Thailand ━━━━━━━━
Panuphong Burakitphachai @t1dotdev |
Linnaeus University ━━━━━━━━
Balazs Hevesi @balazshevesi |
NTU Singapore ━━━━━━━━
Nawat Suangburanakul @holmns |
SUSTech ━━━━━━━━
Yang-Yiming @Yang-Yiming |
|
OmniWM is built for high responsiveness and smooth, crisp animations.
brew tap BarutSRB/tap brew install omniwm
OmniWM supports both community-maintained Nix packages below. They install official OmniWM release artifacts, while their Nix expressions are maintained by DoomHammer and DavSanchez respectively.
| Package | Best for | Packaging difference |
|---|---|---|
| DoomHammer NUR package | Fast release tracking | Its current unzip extraction does not preserve the release's valid Developer ID signature, and it installs the app bundle without exposing omniwmctl on PATH. |
| DavSanchez package and Home Manager module | Signature-preserving, declarative integration | It may trail the latest release, but its bsdtar extraction preserves code signing and it provides omniwmctl, Home Manager settings, and launchd integration. |
Install the fast-tracking DoomHammer package directly:
nix profile install github:DoomHammer/nur-packages#omniwm
Existing NUR configurations can use nur.repos.doomhammer.omniwm.
Install the signature-preserving DavSanchez package directly:
nix profile install github:DavSanchez/nix-dotfiles#omniwm
For a declarative setup, use DavSanchez's exported
homeModules.omniwm
and overlays.additions. After either installation, complete the macOS setup in steps 3-6 below.
OmniWM.zip from ReleasesOmniWM.app to /ApplicationsDisplays have separate SpacesOmniWM checks for updates by default.
Open Release Page, Copy brew upgrade omniwm, Skip This Version, and Not Now.Settings > General > Updates or trigger a manual check from the status bar menu with Check for Updates....The documentation hub lives in docs/index.md.
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.
For setup, installation options, commands, queries, rules, subscriptions, and security details, see docs/IPC-CLI.md.
Displays have separate SpacesKeyboard Shortcuts to navigate between windowsSettings > General > UpdatesCheck for Updates... from the status bar menu whenever you want to run a manual update checkSettings > Hidden Bar. Right-click OmniWM's status bar icon to open the Hidden Icons Bar and click any icon to use it.OmniWM uses two display maps for different jobs:
The setup assistant opens automatically when OmniWM first sees multiple displays. To review or redo it later, choose Run Monitor Setup… in Settings > Monitors. The assistant's Show Numbers on Screens action helps match each physical display to its tile.
OmniWM offers two layout engines that you can switch between per workspace:
Niri (Scrolling Columns) - Windows arranged in vertical columns that scroll horizontally. Each column can have multiple stacked windows or be "tabbed" (multiple windows, one visible at a time). Best for wide monitors with many windows.
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.
All shortcuts are customizable in Settings > Hotkeys. Hyper is the literal Control + Option + Shift + Command chord. 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:
Shared works in any active layout.Niri works only when the active workspace uses the Niri layout.Dwindle works only when the active workspace uses the Dwindle layout.| Action | Default Shortcut | Layout |
|---|---|---|
| Switch to Workspace 1-9 | Option + 1-9 |
Shared |
| Move Window to Workspace 1-9 | Option + Shift + 1-9 |
Shared |
| Switch to Previous Workspace (Back and Forth) | Control + Option + Tab |
Shared |
| Switch to Next Workspace | Unassigned |
Shared |
| Switch to Previous Workspace (Sequential) | Unassigned |
Shared |
| Move Window to Workspace Up | Control + Option + Shift + Up Arrow |
Shared |
| Move Window to Workspace Down | Control + Option + Shift + Down Arrow |
Shared |
| Move Column to Workspace 1-9 | Unassigned |
Niri |
| Move Column to Workspace Up | Control + Option + Shift + Page Up |
Niri |
| Move Column to Workspace Down | Control + Option + Shift + Page Down |
Niri |
| Action | Default Shortcut | Layout |
|---|---|---|
| Focus Left / Right / Up / Down | Option + Arrow Keys |
Shared |
| Focus Down or Top / Up or Bottom | Unassigned |
Shared |
| Focus Previous Window | Option + Tab |
Niri |
| 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 |
| Toggle Command Palette | Control + Option + Space |
Shared |
| Open Menu Anywhere | Control + Option + M |
Shared |
| Toggle Workspace Bar | Unassigned |
Shared |
| Toggle Hidden Icons Bar | Unassigned |
Shared |
| Toggle Quake Terminal | Option + ` |
Shared |
| Toggle Overview | Option + Shift + O |
Shared |
| Action | Default Shortcut | Layout |
|---|---|---|
| Move Left / Right / Up / Down | Option + Shift + Arrow Keys |
Shared |
| Reorder Window Up / Down | Unassigned |
Shared |
| Action | Default Shortcut | Layout |
|---|---|---|
| Focus Next Monitor | Control + Command + Tab |
Shared |
| Focus Previous Monitor | Unassigned |
Shared |
| Focus Last Monitor | Control + Command + ` |
Shared |
| Move Workspace to Left / Right / Up / Down Monitor | Unassigned |
Shared |
The workspace-to-monitor actions target the active workspace and intentionally use the same temporary runtime override as omniwmctl workspace move-to-monitor --force. They do not rewrite the workspace's Home Monitor or swap workspaces, and unsafe fullscreen, hidden-app, scratchpad, or focus states still block the move.
| Action | Default Shortcut | Layout |
|---|---|---|
| Toggle Fullscreen | Option + Return |
Shared |
| Toggle Native Fullscreen | Unassigned |
Shared |
| Balance Sizes | Option + Shift + B |
Shared |
| Cycle Size Forward | Option + . |
Shared |
| Cycle Size Backward | Option + , |
Shared |
| Move to Root | Unassigned |
Dwindle |
| Toggle Split | Unassigned |
Dwindle |
| Swap Split | Unassigned |
Dwindle |
| Grow Left / Right / Up / Down | Unassigned |
Dwindle |
| Shrink Left / Right / Up / Down | Unassigned |
Dwindle |
| Grow / Shrink Focused Window | Unassigned |
Dwindle |
| Preselect Left / Right / Up / Down | Unassigned |
Dwindle |
| Clear Preselection | Unassigned |
Dwindle |
| Raise All Floating Windows | Option + Shift + R |
Shared |
| Toggle Focused Window Floating | Unassigned |
Shared |
| Assign Focused Window to Scratchpad | Unassigned |
Shared |
| Toggle Scratchpad Window | Unassigned |
Shared |
| Toggle Workspace Layout | Option + Shift + L |
Shared |
| Action | Default Shortcut | Layout |
|---|---|---|
| Move Container Left / Right | Control + Option + Shift + Left / Right Arrow |
Shared |
| Move Container Up / Down | Unassigned |
Dwindle |
| Toggle Column Tabbed | Option + T |
Niri |
| Toggle Container Full Primary Span | Option + Shift + F |
Niri |
The daily Focus and Move shortcuts adapt to the active layout. In Niri, Move Left / Right expels the focused window from a multi-window column or consumes a single-window column into its neighbor, while Move Up / Down reorders within the column.
Dwindle groups use the existing Focus and Move bindings, so there are no separate group shortcuts to memorize. Only the active member occupies the tile; the other members stay hidden and the clickable tab rail shows their order.
| Goal | Default Shortcut | Behavior |
|---|---|---|
| Focus another tile | Option + Arrow Keys |
Left / Right are always spatial. Up / Down are spatial for a singleton tile. |
| Select the next / previous tab | Option + Down / Up Arrow |
Within a group, Down advances and Up goes back. At the group edge OmniWM tries a spatial tile, then the configured monitor transition, and wraps locally only when neither exit succeeds. |
| Join a singleton into a tile or group | Option + Shift + Arrow Keys |
Joins the focused singleton with the touching tile in that direction. |
| Extract the active tab | Option + Shift + Arrow Keys |
When the focused tile is grouped, extracts only its active tab onto the requested side. |
| Move the complete tile or group | Control + Option + Shift + Left / Right Arrow |
Move Container swaps the whole structure. Up / Down are advanced, unassigned Dwindle actions. |
| Select an exact tab | Click its tab rail item | Reveals and focuses that member without changing the group order. |
Moving a tab directly from one existing group into another is intentionally a two-step operation: extract it first, then move the resulting singleton toward the destination group. A singleton at a genuine workspace edge can still use the normal cross-monitor Move behavior; a rejected group mutation does not fall through to tile swapping or monitor movement.
The unassigned advanced actions are available in Settings > Hotkeys. Focus Down or Top / Up or Bottom always wraps within the active Niri column or Dwindle group. Reorder Window Up / Down changes the active member's position by one without wrapping. Move Container is the whole-structure escape hatch and never transfers to another monitor at a workspace edge. Dwindle join/extract and Move Container operations are intentionally unavailable while Overview is open; leave Overview before changing a Dwindle tree.
| Action | Shortcut |
|---|---|
| New Tab | Cmd + T |
| Close Tab | Cmd + W |
| Next Tab | Cmd + Shift + ] |
| Previous Tab | Cmd + Shift + [ |
| Next Tab (Alt) | Ctrl + Tab |
| Previous Tab (Alt) | Ctrl + Shift + Tab |
| Select Tab 1-9 | Cmd + 1-9 |
| Split Pane (Horizontal) | Cmd + D |
| Split Pane (Vertical) | Cmd + Shift + D |
| Close Pane | Cmd + Shift + W |
| Equalize Splits | Cmd + Shift + = |
| Navigate Pane | Cmd + Option + Arrow Keys |
A true quake/sticky terminal (powered by Ghostty's libghostty) that slides in from the screen edge and:
Keyboard ShortcutsOption + drag to move (remembers size/position per monitor)Quickly search windows or app menus from one shared palette:
Keyboard ShortcutsCmd + 1 for Windows and Cmd + 2 for Menu when menu search is availableUp / Down move the selectionEnter activates the selected resultShift + Enter summons the selected window to the right when availableEscape dismisses the paletteAccess any application's menu from your keyboard:
See all windows at once with thumbnails:
Keyboard ShortcutsBackspace deletes search textAlt (Option) + Shift + Mouse Scroll temporarily zooms the current overview; the next opening starts from the configured baselineArrow Keys navigate the selection; Tab / Shift + Tab move horizontally, and keyboard navigation automatically scrolls the selected thumbnail into viewOption + drag a thumbnail onto a workspace, an exact window position, or a Niri column gap; layouts without an exact placement equivalent fall back to moving it to the destination workspaceCommand + W closes the selected window once per press and keeps Overview open; selection advances only after the window has closedEnter, Escape, the configured Overview shortcut, and clicking the backdrop dismiss Overview and focus the current selection; Escape does not clear search firstA visual indicator showing your workspaces:
Workspace-bar icon overrides can also be configured in settings.toml. Quote bundle IDs so TOML treats each dotted identifier as one key:
[workspaceBar.iconOverrides] "com.example.App" = "icons/custom.icns" "com.cmuxterm.app" = "bundle-resource:AppIconDark"
bundle-resource: loads a named image packaged inside the selected app. The Settings picker discovers likely app-icon resources on demand; runtime-generated or downloaded Dock icons may not be available. Absolute paths are used as written, ~ expands to your home directory, and relative paths are resolved from the directory containing settings.toml. Overrides affect only the workspace bar. A valid override takes precedence over the app's standard icon; an unavailable or invalid image falls back to the standard icon, then the dashed placeholder when no app icon is available. OmniWM does not watch image files; use Replace to reload a file changed in place.
Conceal selected menu-bar icons and reach them from a panel:
Settings > Hidden BarOption + drag swaps tiled windows and Option + Shift + drag inserts into a Niri column; in Overview, Option + drag targets a workspace, window position, or Niri column gapOption and right-drag a tiled window to resize (Niri)Option + Shift + Mouse Scroll Wheel (default, configurable) and scroll through columns horizontallyAccess settings by clicking OmniWM's status bar icon and selecting Settings or App Rules. Mouse and gesture settings live in Settings under Mouse & Trackpad.
OmniWM stores its editable config at ${XDG_CONFIG_HOME:-$HOME/.config}/omniwm/settings.toml; that file is the canonical settings source and is live-reloaded when saved from an editor.
updateChecksEnabled is part of the persisted settings model, so it round-trips through settings.toml.${XDG_STATE_HOME:-$HOME/.local/state}/omniwm and stay out of dotfile-oriented config storage.Configure per-application behavior in Settings > App Rules:
Initial container primary span is a one-time seed. It controls width in horizontal orientation and height in vertical orientation. Niri's Single Window Fit still takes visual precedence for a lone window, and physical minimum-size constraints can clamp the resolved pixel size without changing the stored initial proportion.
The equivalent TOML rule uses a proportion:
[[appRules]] bundleId = "net.kovidgoyal.kitty" initialContainerPrimarySpan = 0.5
Requirements:
Frameworks/GhosttyKit.xcframework/macos-arm64/libghostty-internal-fat.a)Use the bundled Debug launch for day-to-day development:
make run
make run builds, packages, development-signs, and opens dist/OmniWM.app through LaunchServices. This is the canonical development launch because it gives OmniWM its normal app identity. OmniWM uses its native status bar item while Hidden Bar concealment is inactive. While concealment is active, it uses a separate fallback icon next to the workspace bar because macOS can conceal the app-owned status item with the other restricted items. This behavior applies to both bundled and raw swift run OmniWM launches and is not specific to Debug builds.
If you find OmniWM useful, consider supporting development:
The best way to report a bug is from inside OmniWM: open the status-bar menu and choose Report a Bug…. It records an optional diagnostics trace, creates and reveals a diagnostics bundle for you to attach, and opens a pre-filled GitHub issue — OmniWM never sees your GitHub login.
Prefer the web? The GitHub issue form works too; please include your OmniWM and macOS versions there.
Issues and pull requests are welcome on GitHub.
Start with CONTRIBUTING.md for the actual project guidelines, expectations, and preferred direction.
For deeper technical context, the docs pages that back the documentation site are here:
OmniWM is licensed under the GNU General Public License v2.0-only. Copyright (C) 2026 BarutSRB — https://github.com/BarutSRB/OmniWM.
Every source file carries an SPDX license header. Forks and redistributions must retain these notices and the LICENSE file, and remain GPL-2.0 with source available.
more like this
Comprehensive analytics dashboard for AI coding agents — Cursor, Windsurf, Claude Code, VS Code Copilot, Zed, Antigravi…
Free open-source Cloudflare R2 desktop client and S3 GUI for macOS, Windows, and Linux. Manage Cloudflare R2, AWS S3, M…
search projects, people, and tags