Skip to content

Releases: OmniNull/OmniWM

OmniWM v0.7.1

Choose a tag to compare

@BarutSRB BarutSRB released this 19 Sep 20:14
CleanShot 2026-09-19 at 4 30 38 PM

What's New Since 0.7.0

Overview has been rebuilt around your desktop. OmniWM 0.7.1 brings a major overhaul to how you see, find, and organize your windows: spacious wallpaper ribbons, a separate view for each display, search that reaches inside tabbed columns and groups, and much richer mouse and keyboard controls. Your window arrangements stay recognizable as you move through even your busiest workspaces.

A new Overview

  • Workspace ribbons that preserve your layout. Each display now shows its own workspaces at a consistent scale, so a wide Niri workspace no longer shrinks all its windows to fit. Ribbons preserve window proportions, horizontal and vertical layouts, and Dwindle's spatial arrangement. Wallpaper extends with tiled content, while native dark glass and focus borders bring the view together.
  • Find windows inside tabs and groups. Search by app name or window title, including inactive Niri tabs and Dwindle group members. Each group keeps one preview card with arrows and a title picker, so you can browse its windows without losing the surrounding layout. Small Dwindle tiles use compact controls. Result counts, a clear no-results message, and a Clear button make searching easier to follow.
  • Create and organize workspaces in place. Empty workspaces are visible and keyboard-selectable. Click the trailing +, select it and press Return, or drop a window onto it to create a workspace. Drag windows between ribbons or onto another display, with destination labels and edge scrolling to guide the move. Floating windows keep their size when dropped.
  • Keep your place while rearranging. Workspace pans survive structural edits, including Niri consume and expel operations. Cards animate into their new positions, and mouse-wheel scrolling, overflow paging, and keyboard selection reveals use Overview's spring motion. Trackpad scrolling and direct dragging remain immediate.
  • New input preferences. In Settings → Overview, assign a middle or extra mouse button to toggle Overview, adjust mouse-wheel speed from 5% to 200%, or invert scrolling direction. Mouse-button activation is unassigned by default, and buttons used by System Hyper cannot also toggle Overview. Wheel-speed adjustments leave trackpad speed unchanged.
  • Previews that are ready when you return. Overview prioritizes the selected window and remembers recently visible previews at full quality within a 128 MiB cache budget after closing. Cached previews appear immediately; the first live image gently fades into an empty card. Saved Niri columns and Dwindle groups also appear correctly on the first opening after launch, without visiting each workspace first. Motion continues to respect your animation preference and macOS Reduce Motion.

Fixes and project updates

  • Fix blocked Niri window moves. Small differences between a requested size and the size an app accepts no longer become hard minimums that can incorrectly prevent left/right window transfers. This addresses the captured case where a full-height window on a secondary display could not move into a smaller stack. (#709)
  • OmniWM now lives under OmniNull. App links, update checks, documentation, and release tooling point to OmniNull/OmniWM.

Breaking changes and upgrading from 0.7.0

No configuration migration or script changes are required. Configuration stays at schema 3, IPC stays at protocol 15, and existing commands and default shortcuts retain their contracts. The new Overview settings are optional.

There are intentional changes to Overview's interaction and appearance:

  • Navigation stops at the ends. Arrows, configured focus shortcuts, Tab/Shift-Tab, and tab-preview arrows no longer wrap around. Ordinary keyboard traversal also includes empty workspaces and the + target; search traversal stays within matching windows on the current display.
  • Each display shows its own workspaces. To move a window between displays, drag it onto the destination display's Overview panel.
  • Zoom is remembered. Zoom changes made inside Overview are saved when it closes, rather than resetting on the next opening.
  • The selected border follows your desktop focus border by default. To keep using a separate Overview selected-window color, turn off Settings → Overview → Selected Border Matches Focus Border. Existing saved colors and backdrop opacity are preserved.

If you edit settings.toml by hand, the new optional overview.mouseButton accepts raw button numbers 2–5 and cannot use the same button as System Hyper. An invalid assignment rejects the configuration file: at launch OmniWM uses defaults; during a running session the last accepted settings stay active. Leaving it unset preserves existing mouse-button behavior.

Thanks

Thank you to everyone contributing to and supporting OmniWM. The contributor credits now include Matt Petters for the Quake Terminal hyperlink support shipped in 0.7.0, and we welcome cafe3310 to the sponsor list.

Full changelog: v0.7.0…v0.7.1

Website and documentation · Installation guide

OmniWM v0.7.0

Choose a tag to compare

@BarutSRB BarutSRB released this 16 Sep 21:43

What's New Since 0.6.10

OmniWM 0.7.0 adds trackpad window controls, an interactive Overview, more appearance options, and configurable display priorities.

Highlights

  • Overview matches Mission Control 1:1. Its opening and closing behavior is an exact 1:1 recreation of native macOS Mission Control, based on fully reverse-engineering that behavior. Swipe up to open and down to close, catch an animation mid-flight, or release early to cancel. The gesture is off by default: enable Overview with three or four fingers in Settings → Mouse & Trackpad → Trackpad Gestures. Overview also retains thumbnails for reopening, closes toward the selected window, and lets you drag thumbnails between workspaces without holding Option. (#666)
  • Move and resize windows without clicking. New opt-in trackpad gestures work with tiled windows in both Niri and Dwindle. Choose two, three, or four fingers in Settings → Mouse & Trackpad → Trackpad Gestures; Set Up… helps resolve conflicting assignments. (#678)
  • Gradient borders and glow. In Settings → Workspace → Borders, customize two-color gradients, optional glow, and separate light and dark appearance colors. Enabling a gradient replaces the solid border color. Colors follow macOS appearance changes; glow leaves layout spacing and resize hit areas unchanged. (#648)
  • More workspace bar styles. Adjust inactive icon opacity, choose transparent or solid black backgrounds, and toggle item backgrounds and accent highlights globally or per display. Fill Left of Notch fills the menu-bar area left of the notch, covering application menus; without a notch it uses the left half of the menu bar. This mode ignores Position, Offset, Height, and Reserve Space, and always hides on displays showing native fullscreen content. (PR #669)
  • Choose your preferred displays. Rank monitors in Settings → Monitors so Main, Secondary, and the new Tertiary workspace role follow your preferred connected displays. Quake Terminal's Main Monitor destination follows the same ranking. (PR #663)
  • Redesigned tab rails. Compact indicators include window details on hover. Enable app icons directly on tab rails to identify mixed-app groups in either layout. (PR #635, #588)
  • Quake Terminal hyperlinks. Command-click an OSC 8 hyperlink to open http/https links in your default browser or mailto links in your mail app. Other schemes are blocked. (PR #702)
  • Nushell completions. Generate command and argument suggestions with omniwmctl completion nu on Nushell 0.108 or newer.

Improvements and fixes

  • Focus command palette search when it opens so you can start typing immediately.
  • Restore keyboard focus when switching to an already-visible workspace after OmniWM's Mouse Warp moves the pointer between displays. Also preserve focus when transferring windows between workspaces. (PR #661)
  • Fix the Niri column strip shifting when clicking or Command-Tabbing into a window while another app on that workspace is hidden with Command-H. (PR #640)
  • Restore the configured Niri single-window fit after neighboring windows close or move to another workspace. (#668)
  • Prevent residual trackpad scrolling from reaching applications after workspace gestures. (PR #637)
  • Correct Quake Terminal scaling when moving between Retina and non-Retina displays. (PR #679)
  • Avoid misclassifying newly discovered windows when fullscreen-button accessibility reads temporarily fail.
  • Avoid repeated waits on apps already reported as unresponsive when rescanning windows after launch, unlock, or display changes.

Upgrading

Recommended gesture setup: Turn off native macOS Mission Control in System Settings → Trackpad → More Gestures to free its gesture for OmniWM's new 0.7.0 gestures. Disable other overlapping native gestures, such as App Exposé, when using the same fingers. Keep Displays have separate Spaces enabled; that is a separate setting OmniWM still requires.

Window Resize defaults to three fingers, which conflicts with the three-finger Column Scroll enabled by default, so its row initially offers Set Up…. To keep Column Scroll, choose another finger count for Resize—for example, two fingers, which can intercept normal scrolling in apps. Move and Resize each need an unused finger count; Overview and Move also conflict if both use their default four fingers. Overview may share fingers with a horizontal swipe, but not a conflicting upward swipe. Use Set Up… to resolve overlaps.

Editing settings.toml: Conflicting gesture assignments cause the entire configuration file to be rejected. At launch, OmniWM uses built-in defaults for every setting; while it is running, the invalid edit is ignored and the last accepted settings stay active. Configuration remains at schema 3, and the new trackpad gestures, border effects, tab-rail app icons, and monitor ranking are opt-in.

Reduce Motion: OmniWM now honors macOS Reduce Motion throughout the app. If it is already enabled, upgrading disables OmniWM animations, including Overview's finger-tracked transitions and Quake Terminal's slide. Enable Animations is unavailable while Reduce Motion is on; your saved OmniWM preference is preserved.

Scripts and shell completions: IPC remains at protocol 15. switch-workspace, switch-workspace-slot, switch-workspace-anywhere, and omniwmctl workspace focus-name now return executed instead of no_change when the workspace is already visible but keyboard focus needs to be handed back. Regenerate saved Bash, Zsh, and Fish completions with omniwmctl completion bash, omniwmctl completion zsh, or omniwmctl completion fish to pick up the updated suggestions. Shells that generate completions at startup pick up the changes when reloaded.

Thanks

Thank you to YeungKC, Cypress, Taylor Bell, Fletcher Alderton, Henrik Larsson Hestnes, minchik, Matt Wicks, mattpetters, Brian Smyth, MateuszJuszczyk, and t1dotdev for contributing to this release.

Full changelog: v0.6.10…v0.7.0

OmniWM v0.6.10

Choose a tag to compare

@BarutSRB BarutSRB released this 12 Sep 22:04

What's New Since 0.6.9

  • Added a separate OmniWM Dev installation with independent settings and state, plus commands to switch between development and release builds.
  • Simplified contributor setup with checksum-verified dependencies, make setup, make doctor, and automated macOS verification and tests.
  • Fixed development-tool lookup and Swift 6.4 compilation issues affecting task-local code and optimized builds.
  • Reorganized runtime, settings, and integration code and expanded regression coverage.
  • Updated configuration, feature, CLI, and architecture documentation and added contributor and website development guides.
  • Updated contributor credits and credited sponsor b-allan-w.

Official website and documentation: https://omniwm.app
Installation guide: https://omniwm.app/guides/install/

Release Integrity

OmniWM is signed with Developer ID, notarized by Apple, and includes a stapled notarization ticket.

  • OmniWM-v0.6.10.zip — SHA-256: 10eef893077d210d1545f5775a2b92b2f366df61db4fbd8abc22b3ab1d08c4af
  • GhosttyKit.xcframework-v0.6.10.zip — SHA-256: 4cc414f1b76c7f9ffe13dd5b047cf9deb8bd182e33e522045c7d939ff1cd151f

OmniWM v0.6.9

Choose a tag to compare

@BarutSRB BarutSRB released this 10 Sep 01:18

What's New Since 0.6.8

There are zero breaking changes since 0.6.8.

  • Credit sponsors Álvaro Barchín and Marc Hendrichsen.
  • Decompose UI views, overview geometry, CLI completions, and IPC arguments.
  • Decompose IPC models and rule engine and consolidate layout contexts.
  • Fixed scratchpad ownership, persistence, and terminal occlusion.
  • Treat compiler warnings as errors and fix lifecycle bugs.
  • Fixed lifecycle races and streamline Niri navigation.
  • Clean up Swift declarations and concurrency annotations.
  • Reduce settled Niri edge strips and stabilize window parking.
  • Fixed scrolling in the App Rules application picker.
  • Preserve Niri monitor contact through native rounding.

Official website and documentation: https://omniwm.app
Installation guide: https://omniwm.app/guides/install/

Release Integrity

The OmniWM app is Developer ID signed, Apple-notarized, stapled, and Gatekeeper verified.

  • OmniWM-v0.6.9.zip SHA-256: 9c24ab174e11a1e21155a0640e0323beaa7e22a402e59b69694c8465b002b165
  • GhosttyKit.xcframework-v0.6.9.zip SHA-256: 02ec649259f7465a8e4ae4866f1ef5b9ae876b25190801a340c67052b9324dd4

OmniWM v0.6.8

Choose a tag to compare

@BarutSRB BarutSRB released this 07 Sep 04:07

What's New Since 0.6.7

OmniWM 0.6.8 moves Homebrew installs to the official cask, lets scripts and the CLI rename workspaces, makes switching between windows of the same app immediate again in Niri layouts, and fixes a crash on macOS 27 betas for users in comma-decimal regions.

Before You Upgrade

  • Quit OmniWM before upgrading with Homebrew, then relaunch it. Homebrew replaces the app bundle underneath a running OmniWM, and a new omniwmctl talking to an older running OmniWM gets invalid_request for the new workspace rename action.
  • The project Homebrew tap is retired. OmniWM is in Homebrew's official cask repository, and 0.6.7 was the last release published to BarutSRB/tap.

🚨🚨🚨

If you installed with `brew tap BarutSRB/tap`, quit OmniWM and run, in this order: 

1. `brew update` 
2. `brew upgrade omniwm` 
3. `brew untap BarutSRB/tap`. 

🚨🚨🚨

Keep that order: brew update fetches the retired tap's redirect and moves your install to the official cask, while untapping before it would offer to uninstall OmniWM. Full steps: Migrating from the project tap. New installs use brew install --cask omniwm.

  • Settings and scripts are unaffected. This release needs no settings migration, and the IPC protocol stays at version 15.

New: Rename Workspaces from Scripts and the CLI

  • omniwmctl workspace rename <workspace> <display-name> sets a workspace label from the command line or over IPC. The target is a raw workspace ID or an unambiguous display name, the label persists to settings.toml exactly as if you had set it in Settings, an empty name clears it back to the raw ID, and renaming to the current label returns no_change. #621
  • Rename from a launcher. A Raycast script command, or an OmniCast command with a picker, turns "type the new name, hit enter" into a rename straight from the root search, so a workspace can follow the project you are working on without a trip to Settings.
  • Let events rename for you. omniwmctl watch workspace-bar --reconnect --exec ./badge.sh runs a script for every workspace-bar event, so a workspace can badge itself 🚨 ALARM the moment a window on it gets a title containing a keyword and drop the badge when that window goes away. The events guide ships the full badge.sh; it renames only when the computed label differs, and OmniWM publishes workspace-bar only when the bar actually changed, so the loop settles instead of re-triggering itself.
  • Hand it to your agents. Because renaming is a plain IPC action, an automation agent can name workspaces after the windows you place on them, so the bar keeps describing what each workspace holds.
  • Renames neither trigger a layout pass nor drop runtime monitor overrides from move-to-monitor --force. The CLI reference documents the action and its wire shape.

Fixes and Improvements

  • Switching between windows of the same app is immediate again in Niri layouts. Keyboard focus now moves to the target column right away instead of about 100 ms later, matching in-column navigation and Dwindle. #655
  • Settings, App Rules, and other OmniWM windows no longer crash on macOS 27 betas for users whose region uses a comma as the decimal separator (German, French, Portuguese, and others). The built-in terminal's startup had switched the process's numeric locale, which broke symbol rendering in those regions; the terminal's own shell locale is unchanged. #576

Documentation

Website and documentation · Installation guide

Release Integrity

The OmniWM app is Developer ID signed, Apple-notarized, stapled, and Gatekeeper verified.

  • OmniWM-v0.6.8.zip SHA-256: 0823963c8a5c3bde854f7fdd03cd8c25c4421a40bd6f74844f2c8f7c16a26765
  • GhosttyKit.xcframework-v0.6.8.zip SHA-256: db543774b853ac0b051daa784ce8907a3101856ba3e5e65757da492b32d61e57

OmniWM v0.6.7

Choose a tag to compare

@BarutSRB BarutSRB released this 06 Sep 09:00

What's New Since 0.6.6

OmniWM 0.6.7 remembers your monitor arrangements for different desks, updates the built-in terminal, and fixes several problems with window focus, fullscreen apps, and menus.

Before You Upgrade

  • The settings file format has changed. OmniWM upgrades your existing settings automatically and saves the original as settings.toml.pre-v3 beside your settings file. Most users do not need to do anything. If you return to 0.6.6, restore that backup because the older version cannot read the upgraded settings.
  • If you edit settings by hand or maintain templates: the file now uses schemaVersion = 3, and custom monitor positions move from monitorRoutingOverrides to routing.arrangements. The upgrade can change the file's formatting and remove comments; the backup preserves the original.
  • If you use command-line scripts: the app fingerprint shown by omniwmctl version is now shortened. Scripts that need the full value should use omniwmctl version --json.

New: Remember Your Home and Work Monitor Setups

  • Arrange your screens once in Settings → Monitors, and OmniWM remembers that set of connected displays. The matching arrangement returns automatically when you reconnect them, so your home and work setups no longer overwrite each other.
  • OmniWM can also reuse a saved arrangement when only some of those screens are connected, keeping the remaining screens in their saved positions.
  • If an older arrangement mixed displays from different desks, one desk may need arranging once again in Settings → Monitors. #629

Fixes and Improvements

  • Updated GhosttyKit, the engine behind OmniWM's built-in terminal.
  • Menu bar menus stay open when another app, such as Steam, briefly takes focus. #646
  • Rapidly switching Ghostty tabs no longer creates duplicate windows or extra columns. #643
  • Windows on other workspaces stay hidden when an app enters or leaves macOS fullscreen. #647
  • Closing a Dwindle window keeps you on your current workspace, including when other workspaces use a different layout. #649
  • Newly opened apps show the correct focus border. When focus follows the mouse is enabled, it works without needing an extra click or window switch. #641
  • Quake Terminal's “Main Monitor” setting follows the main display selected in macOS, including setups with one screen above another. #652
  • Menu arrows appear only beside items that open another menu.

Website and documentation · Installation guide

Release Integrity

The OmniWM app is Developer ID signed, Apple-notarized, stapled, and Gatekeeper verified.

  • OmniWM-v0.6.7.zip SHA-256: b20e6fb216acae4e2ebf93f6624488b75553944eab1d5e2f76ffa18ab4f6e868
  • GhosttyKit.xcframework-v0.6.7.zip SHA-256: 11d583605b6e2f730c436fc844f0c8fda3e7cf0c23b243d0c9913a4d8ee56aad

OmniWM v0.6.6

Choose a tag to compare

@BarutSRB BarutSRB released this 05 Sep 17:47

What's New Since 0.6.5

OmniWM 0.6.6 focuses on more responsive window switching, better window spacing, and more reliable focus borders. It also fixes custom Hyper shortcuts and makes setting up multiple displays clearer.

Before You Upgrade

  • Update omniwmctl alongside OmniWM. Older copies cannot run commands or queries against this release. If you use a custom integration, it must support protocol 15 instead of 14.
  • Check scripts that read omniwmctl version as plain text. Its output now includes extra build information, so those scripts may need updating. JSON output is available for scripts that need structured information.
  • Your existing settings format is unchanged; this release does not require a settings migration.

Window Switching, Layouts, and Borders

  • Reduced pauses when switching windows with Niri keyboard shortcuts and updating the focus border.
  • Improved spacing between Niri columns when an app cannot shrink to the requested size. OmniWM also avoids repeatedly asking an app to use a size it has already refused.
  • Fixed the remaining window ending up in the wrong position after closing another window when Niri's Single Window fit is set to Full Screen.
  • Focus borders now follow the window's actual on-screen size more accurately.
  • Fixed rounded focus borders occasionally becoming square while switching windows. Intentionally chosen square corners are still respected.

Settings and Multiple Displays

  • Monitor Setup now helps you assign at least one workspace to every connected display, so windows have somewhere to go when you move them between displays. You must complete these assignments before finishing the setup assistant. Existing assignments are not automatically changed.
  • Changes made in Monitor Setup are applied together when you finish the assistant.
  • Fixed custom Hyper shortcuts changing unexpectedly when settings are saved or updated.
  • Settings now explains how much space your top-gap setting leaves below the menu bar on each display.

Command-Line Tools and Troubleshooting

  • Fixed command-line connections hanging when several tools connect at the same time.
  • Added performance information through omniwmctl query metrics and clearer build details through omniwmctl version, making it easier to investigate slowdowns and identify the running version.

Thanks to Taylor Bell (@tayiorbeii) for the focus-border improvements in #639.

Website and documentation · Installation guide

Release Integrity

The OmniWM app is Developer ID signed, Apple-notarized, stapled, and Gatekeeper verified.

  • OmniWM-v0.6.6.zip SHA-256: 78c55c79f999fe6187fcb85080a480c15b0c4fe71416e4482258ac5920d04cdb
  • GhosttyKit.xcframework-v0.6.6.zip SHA-256: 1a62133db9635129762cfb7009a65623ed52b57a66eca43c9990daffe5962760

OmniWM v0.6.5

Choose a tag to compare

@BarutSRB BarutSRB released this 02 Sep 15:45

What's New Since 0.6.4

OmniWM 0.6.5 makes Dwindle layouts survive restarts, adds modifier-drag tile swapping, introduces monitor-relative workspace slots, and expands window control and event streaming through omniwmctl. It also overhauls window admission, focus ownership, exterior borders, settings safety, multi-trackpad input, and display transitions.

Before You Upgrade — Breaking and Behavior Changes

  • Settings migrate automatically from schema 1 to schema 2. A valid 0.6.4 file needs no manual editing. On first launch, OmniWM saves its exact bytes as settings.toml.pre-v2 or settings.toml.pre-v2.1, then writes canonical schema-2 TOML. If neither backup slot is safe, migration leaves the original untouched and blocks writes. Values, safely matchable unknown keys, symlink targets, and permissions are preserved, but the rewrite can reorder the file and remove comments. Migration adds 19 unassigned actions: switchWorkspaceSlot.1 through .9, moveToWorkspaceSlot.1 through .9, and closeFocusedWindow.

  • Restore the pre-v2 backup before downgrading to 0.6.4. Once 0.6.5 writes schema 2, 0.6.4 treats the file as a future schema, leaves it untouched, runs with defaults, and blocks settings writes. Automatic migration is guaranteed for files emitted by 0.6.2 through 0.6.4; older schema-less files are attempted but cannot be guaranteed.

  • Enum-backed settings are now uniformly strict. An unknown enum value now rejects the whole file instead of silently falling back or dropping that value. At startup, OmniWM leaves an invalid file byte-for-byte untouched, runs with in-memory defaults, and reports the problem in Diagnostics. An explicit save from Settings protects the rejected bytes in .corrupt storage before replacement. Config generators must emit documented enum values and every schema-2 hotkey ID exactly once.

  • IPC protocol moves from 13 to 14. Upgrade the bundled omniwmctl with the app. A protocol-13 client is rejected. Already-satisfied operations now return status: "ignored" with code no_change; not_found is reserved for absent targets. Automation must also account for the new window_action_failed error, close/move/slot command cases, JSON windowId, the trailing WINDOW ID column in full window tables, and optional Workspace Bar app bundleId values.

  • Subscription output and disconnect behavior are now explicit. omniwmctl subscribe --format json emits pretty envelopes and --format ndjson emits one compact envelope per line. table, tsv, and text are rejected for subscriptions instead of being silently coerced to JSON. A plain subscription exits with code 2 when OmniWM closes the stream; use --reconnect to survive an app relaunch.

  • Rules for exceptional windows are stricter. Structural admission now runs before ordinary rule ranking. Buttonless accessory roots, prohibited-app roots, non-AXWindow roles, and unsupported subroles require a precise rule with identifying match data, exact axRole and axSubrole, and an explicit Tile or Float result. Parentless roots at status-window level or higher additionally require that precise rule to be user-authored; built-in rules cannot opt those high-level roots in. Broad bundle/title rules and Automatic layout no longer cross these gates. WindowServer children, help tags, and input-method surfaces remain unmanaged and cannot be opted in.

  • Enabled focus borders can increase effective layout clearance. Borders are now fully exterior, and the border width rounded up to a physical-pixel boundary floors runtime inner and outer gaps without rewriting stored gap values. True layout fullscreen remains borderless. Setups with zero gaps or gaps narrower than the border may therefore gain visible spacing.

  • Dwindle sizing semantics were corrected. Size cycling now gives the focused side 30%, 50%, or 70% of its split instead of the old effective 15%, 25%, or 35% first-child behavior. When useGlobalGaps = false under [dwindle], monitor-local Dwindle innerGap values are now clamped to the shared 0–64 range.

Persistent and Mouse-Draggable Dwindle

  • Dwindle now restores each workspace's split orientation and ratios, tab-group membership and order, and active tab across restarts, independent of window arrival order. Missing siblings are pruned safely, while conflicting or incomplete placement data falls back to normal insertion. Fullscreen state and the selected window are intentionally not restored.

  • Hold the configured mouse-move modifier—Option by default—and left-drag a Dwindle tile onto another tile to swap them. A tab group moves as one complete tile; the tree changes only on drop, and dropping on the source tile or empty space is a no-op. Shift retains no insertion meaning in Dwindle.

Workspaces and Window Control

  • New monitor-relative actions Switch to Workspace Slot 1–9 and Move to Workspace Slot 1–9 address the one-based workspace position on the interaction monitor. All 18 actions start unassigned. The CLI equivalents are omniwmctl command switch-workspace slot <number> and omniwmctl command move-to-workspace slot <number>; the CLI accepts any positive one-based position, while native actions cover slots 1–9. Existing numeric workspace actions remain global raw IDs.

  • Fresh settings now include workspaces 1 through 9: 1–5, 8, and 9 on the main monitor, plus 6/❤️ and 7/🚀 on the secondary monitor. Migration preserves an existing workspace array, so upgrading users do not silently gain workspaces 8 and 9.

  • Close the focused window with the new unassigned closeFocusedWindow action or omniwmctl command close-focused-window, and close any managed window with omniwmctl window close <opaque-id>. OmniWM waits for macOS's destroyed notification instead of removing model state speculatively.

  • Move any managed window without focusing it first using omniwmctl window move-to-workspace <opaque-id> <workspace>. The destination accepts a raw workspace ID or an unambiguous display name. Moving a non-selected window leaves focus and the active workspace unchanged; selected-window moves retain the configured follow behavior.

  • When a workspace moves to a monitor with a different visibleContainerCount, Niri re-derives only automatically sized column spans along the destination monitor's primary axis. Manually sized columns are preserved, including across horizontal and vertical displays. Constraint-driven width clamps now honor Animations Off.

Automation and CLI

  • omniwmctl subscribe and watch now support --reconnect. After a successful initial handshake, a lost connection retries with bounded exponential backoff and requests catch-up snapshots when it resubscribes. An initial connection failure still exits immediately.

  • ndjson is available across CLI output, with subscriptions producing one compact envelope per line: the subscribe response first, then event envelopes.

  • omniwmctl command toggle-overview can now close an open Overview onto its current selection. Other mutating IPC commands remain blocked while Overview owns interaction.

  • Window queries expose the raw CGWindowID through the window-id selector and JSON windowId; field selection can omit it, and the opaque id remains the correct identifier for window actions. Workspace Bar query and subscription payloads now include each app's optional bundleId.

  • active-workspace now publishes switches into empty workspaces from the same authoritative projection used by queries. display-changed now publishes a full snapshot after every adopted display add, removal, or reconfiguration, while deduplicating identical consecutive snapshots.

Window, Focus, and Border Reliability

  • Window admission and focus ownership were redesigned around structural eligibility and exact native focus. The new path fixes Microsoft Office search/transient-child focus, restores closeable accessory roots and precise rule opt-ins, preserves admission and placement hints while evidence is undecided, and batches exact WindowServer evidence for tracked windows omitted from broad visibility scans. #626

  • Meaningful Accessibility frame-verification mismatches no longer become false minimum-size constraints. This fixes launch-time sizing, overlap, and lag while retaining legitimate bounded minimum-size convergence. #625

  • Focus borders now use one persistent, pixel-rounded exterior surface placed below the target at its actual window level. A verified external child can retain the selected managed parent's border, and border-only updates avoid rebuilding unrelated surfaces.

  • Hands-off and external surfaces no longer appear in Overview or Command Palette. Eligible Dwindle group members remain represented even when another member is excluded. #617

  • Third-party menu-bar-extra menus and Chrome-style transient popups remain open instead of managed focus immediately reclaiming the front. #618

  • Clicking unmanaged UI suppresses the subsequent focus-driven cursor warp without admitting or managing that surface.

Displays, Input, Settings, and Startup

  • Transient missing or one-pixel display samples no longer tear down valid Niri monitor and display-link state.

  • Raw multitouch ownership is isolated per physical device, preventing a built-in trackpad and an external trackpad from overwriting or ending each other's gestures. Missing final lift frames recover after a stale gap so later gestures are not permanently blocked.

  • Overview scrolling now follows the macOS Natural Scrolling setting.

  • An accepted external settings reload cancels any older deferred save, preventing stale in-memory state from overwriting the edited file.

  • The launch-conflict alert rescans every second and dismisses itself when the co...

Read more

OmniWM v0.6.4

Choose a tag to compare

@BarutSRB BarutSRB released this 28 Aug 21:46

What's New Since 0.6.3

0.6.4 turns the single scratchpad into ten multi-window scratchpad slots, adds automatic settings migration so upgrades no longer reset your configuration, exposes diagnostics capture through omniwmctl, and lets the Workspace Bar step aside per display during native fullscreen. It also retires stale tiles for apps that close windows without destroying them, and introduces OmniWM's compass-mark identity, its website, and a documentation hub.

Before You Upgrade — Breaking Changes

  • Your 0.6.3 settings migrate automatically. No reset, no manual edit. On first launch OmniWM copies the exact original file to settings.toml.pre-v1 (or .pre-v1.1) and rewrites the live file with schemaVersion = 1. The migration preserves configured values, safely matchable unknown keys, symlink targets, and permissions. It also fills in the keys 0.6.4 requires — workspaceBar.hideInNativeFullscreen = false and an empty [scratchpads.labels] — and maps your old scratchpad hotkeys onto slot 1. The canonical rewrite can reorder the document and strip comments; the .pre-v1 backup retains the original text verbatim. Automatic migration is guaranteed for settings emitted by OmniWM 0.6.1 through 0.6.3, so a normal 0.6.3 upgrade needs no config work. Diagnostics reports every automatic change and the backup location.

  • Rolling back to 0.6.3 resets your settings. Keep the .pre-v1 backup. A settings file written by 0.6.4 contains hotkey action IDs that 0.6.3 cannot resolve. 0.6.3 treats the whole file as invalid, preserves it as settings.toml.corrupt, and starts from full defaults. Migration is forward-only: to downgrade, quit OmniWM and restore settings.toml.pre-v1 over settings.toml before launching 0.6.3.

  • Two hotkey action IDs were renamed and eighteen were added. assignFocusedWindowToScratchpad became assignFocusedWindowToScratchpad.1 and toggleScratchpadWindow became toggleScratchpad.1; slots 2 through 10 add the remaining pairs, all Unassigned. Migration rewrites the two old IDs in place, so your existing triggers survive and Settings > Hotkeys keeps working. This matters if you keep settings.toml in a dotfiles repo, generate it from a template, or hand-merge it across machines — the old IDs are no longer valid action IDs, and an unknown ID invalidates the file. In Settings the rows now read Assign Focused Window to Scratchpad N and Toggle Scratchpad N. No other action ID, default binding, config path, runtime-state path, IPC socket path, or CLI command path changed, and OmniWM still requires macOS 26+ on Apple Silicon.

  • IPC protocol goes from 11 to 13. Upgrade the bundled omniwmctl with the app. A 0.6.3 client speaks 11 and will be rejected. Protocol 13 covers two bumps:

    • Capture requests and results, the captureActions capability list, and a new capture_state_conflict error code. Clients that switch exhaustively over IPCErrorCode must handle it.
    • Scratchpad slot indexing. command scratchpad assign and command scratchpad toggle now require a scratchpadIndex argument (<1-10> in the CLI); the old no-argument form is an error.
  • Window and Workspace Bar payloads changed shape.

    • query windows gains a nullable JSON scratchpadIndex field and a scratchpad-index field selector. Full table, text, and TSV output keep the existing SCRATCHPAD column in place, but assigned windows now show their slot number instead of true, so parsers must update value handling rather than column positions.
    • The --scratchpad selector changed meaning. It used to match the scratchpad window; it now matches every window assigned to any of the ten slots, so scripts that assumed a single result can now receive many.
    • IPCWorkspaceBarMonitor.scratchpad — previously a nullable object holding one window — is replaced by scratchpads, an always-present array. Each entry carries index, an optional label, windows, and isVisible. An empty array replaces what used to be null.
  • focus previous is advertised differently. It was published as Niri-only while command enforcement had always treated it as shared, so it already ran fine on Dwindle. The manifest now matches reality. query capabilities, query commands, and generated shell completions all report shared — regenerate cached capability output and completion scripts.

  • The IPC/CLI and architecture references moved out of the repository. docs/IPC-CLI.md and docs/ARCHITECTURE.md are now short stubs pointing at omniwm.app/reference/cli/overview and the architecture guide. The full text is maintained under website/src/content/docs/. Bookmarks and links to the old in-repo files still resolve, but no longer contain the reference itself.

Headline Feature — Ten Multi-Window Scratchpads

The scratchpad is no longer a single parked window. There are now ten numbered slots, each holding any number of floating windows, overlaid on whatever workspace you are looking at. An empty slot is inert and invisible. #585

  • Assign Focused Window to Scratchpad N moves the focused window into slot N, floating it if it was tiled and parking it off-screen. Pressing the same shortcut on a window already in slot N returns it to the layout.

  • Toggle Scratchpad N reveals or parks every window in the slot as one coordinated operation, on the monitor you are interacting with. Revealing a slot parks whichever slot was showing, so at most one scratchpad is on screen at a time.

  • A revealed scratchpad follows you across workspace switches and stays up until you toggle it off. If it is showing on another monitor, its shortcut summons it to the one you are on.

  • Revealed windows behave as ordinary floating windows. Whether clicking something underneath pushes them behind it follows the usual focus and raise rules, including Raise Window When Focus Follows Mouse.

  • Every non-empty slot gets a Workspace Bar pill showing its name and its windows' icons; clicking the pill toggles that slot. Scratchpad pills always group by app, independent of the Deduplicate App Icons setting.

  • Slots are addressed by number everywhere. An optional label replaces the number in the Workspace Bar and in omniwmctl output:

    [scratchpads.labels]
    1 = "term"
    3 = "COMMS"
  • Automation gets the full surface: omniwmctl command scratchpad assign <1-10>, omniwmctl command scratchpad toggle <1-10>, and window queries that expose both scratchpad membership and the slot index.

Scratchpad membership lasts for the lifetime of the OmniWM process — only the labels are persisted. The ten assign/toggle pairs start unassigned except for slot 1, which inherits your previous scratchpad shortcuts through migration.

Settings and Automation

  • Settings persistence now safely preserves unknown TOML keys through saves, including array-owned keys when their owner can be matched unambiguously. Ambiguous preservation, exhausted migration-backup slots, unsafe symlinks, and unsupported-schema or migration-backup save races leave the file untouched and block writes rather than risk data loss.
  • Trace and performance captures can be scripted with omniwmctl capture start trace, omniwmctl capture start performance, omniwmctl capture stop, and omniwmctl capture status. Capture state and the most recent artifact metadata are available through IPC. As with all omniwmctl use, Enable IPC must be turned on from the menu bar first.
  • Quake Terminal's updated GhosttyKit adds Kitty clipboard reads and writes, binary-safe multi-format transfers, clipboard type listings, requester-aware confirmation previews, optional session grants, and a dedicated selection clipboard.

Workspace Bar and Window Lifecycle

  • Hide in Native Fullscreen is a new opt-in Workspace Bar setting, off by default. Suppression is derived per display, so a bar disappears only on the monitor showing a native-fullscreen Space and returns automatically on exit. Reserved tiled layout space stays stable to prevent unrelated windows from jumping. #601
  • Windows that apps such as Calendar close by ordering out instead of destroying are now retired from the layout. OmniWM validates targeted rescans against the app's Accessibility window list, including when the frontmost app loses its last focused window. #610
  • Targeted rescans preserve intentionally parked windows, including scratchpad and other hidden lifecycle states, rather than mistaking them for closed windows.

Identity, Website, Documentation, and Thanks

  • OmniWM now uses a compass-mark identity across the app icon, launch overlay, status item, repository, and a reproducible brand-asset package.
  • omniwm.app launches with interactive feature demos, a knowledge base, install and CLI references, testimonials, sponsor credits, and canonical-domain redirects.
  • The README, architecture guide, IPC/CLI contract, issue-reporting guidance, and contributor documentation were rewritten against the current codebase and Swift 6.4 toolchain. The README now documents scratchpads, orientation-aware Niri containers, the advanced-commands hotkey filter, and the complete shortcut tables.
  • Matt Wicks (@wicksipedia) joins the contributor showcase under SSW Consulting, and the latest private sponsor is recognized anonymously with a path to request public credit.

Release Integrity

The OmniWM app is Developer ID signed, Apple-notarized, stapled, and Gatekeeper verified.

  • OmniWM-v0.6.4.zip SHA-256: 9b2bf54d20d67f536270032e0625176c06c6e03b8897ddf025558d948339e5e7
  • GhosttyKit.xcframework-v0.6.4.zip SHA-256: c7b1a8541206fa4ebf55e5dca8f12df4efa7ed5df490c4c426a5ee091c74ec21

OmniWM v0.6.3

Choose a tag to compare

@BarutSRB BarutSRB released this 25 Aug 03:52

What's New Since 0.6.2

0.6.3 adds focus-without-raise, configurable fullscreen margins, Start at Login, Quake Terminal microphone support, and low-perturbation performance captures. It also hardens settings recovery, focus ownership, animation, lock-screen handling, Hidden Bar, and the AX apply path.

Before You Upgrade — Breaking Changes

  • Your settings.toml is replaced with defaults on first launch unless you edit it first. 0.6.3 requires two new fields that a normal 0.6.2 file does not contain. Without them, OmniWM preserves the old file byte-for-byte as settings.toml.corrupt or settings.toml.corrupt.1, replaces the live file with full defaults, and starts from those defaults. Nothing is destroyed, but your configuration stops applying until you restore it.

    To avoid the reset entirely, merge these values into the existing sections before upgrading:

    [focus]
    raiseOnMouseFocus = true
    
    [gaps]
    fullscreenUsesOuterGaps = false

    raiseOnMouseFocus = true keeps the 0.6.2 hover behavior — the new default is false. fullscreenUsesOuterGaps = false matches the new default and preserves existing fullscreen geometry.

    If 0.6.3 has already reset a normal 0.6.2 file, quit OmniWM, recover from whichever of settings.toml.corrupt or settings.toml.corrupt.1 contains the preserved file under your XDG config directory (normally ~/.config/omniwm), add both fields, and restore the corrected file.

  • Settings now use the complete current schema. Missing or decode-invalid required values no longer inherit defaults. 0.6.2 repaired absent keys and a few specific invalid values — many malformed TOML types already failed decoding there — so the practical change for anyone who hand-edits settings.toml is that a missing required key now invalidates the whole file and triggers the preserve-and-reset above. The hotkey list must contain every assignable action exactly once; unknown, unassignable, missing, or duplicate action IDs invalidate the file. Unknown non-hotkey extension keys at the top level and inside known tables remain diagnosed and preserved across successful saves; unknown keys nested inside arrays such as appRules are diagnosed but may be dropped on save. A third distinct invalid file fails closed if both write-once recovery slots are already occupied.

  • Focus Follows Mouse no longer raises windows by default. Hover focus now targets the specific window without deliberately activating its app, issuing AX Raise, or changing SkyLight ordering. Enable Raise Window When Focus Follows Mouse or set focus.raiseOnMouseFocus = true for the 0.6.2 full-fronting behavior.

  • Overview keyboard navigation changed. Arrow keys navigate spatially. Left and Right stay inside the current workspace, moving between windows that share a row and wrapping at that row's ends. Tab and Shift-Tab now cycle forward and backward through all matching windows instead of acting as horizontal navigation.

  • IPC visibility is more exact. SkyLight ordered-out windows now report isVisible: false / is-visible: false and are excluded by query windows --visible. Automation that treated visible-workspace membership as sufficient may receive fewer windows.

  • Display query output gained a field. query displays adds the fullscreen-uses-outer-gaps display field and its fullscreenUsesOuterGaps JSON property, which the display-changed subscription payload carries as well. Full table, text, and TSV output gain a FULLSCREEN GAPS column, so positional parsers must update. This is additive on IPC protocol 11; no command path, query name, selector, or existing wire field was removed or renamed.

  • Trackpad scroll sensitivity is normalized. Hand-edited values outside 0.1...100 are clamped before use, while nan, inf, and -inf use the default value of 5. The normalized value is written on the next successful settings save.

  • Direct OmniWMIPC source consumers have three removals. IPCWorkspaceSummary, IPCAutomationManifest.subscriptionDescriptor(for:), and IPCSocketPath.resolvedSecretPath(environment:fileManager:) are gone. The secret path can be composed with secretPath(forSocketPath: resolvedPath(...)). OmniWMIPC is not published as a library product, so this does not change the shipped v11 wire protocol or normal omniwmctl use.

No hotkey action IDs or default bindings changed in 0.6.3. The config and runtime-state locations, IPC socket path, and CLI command paths are also unchanged, and OmniWM still requires macOS 26+ on Apple Silicon.

Headline Features

  • Start at Login is now available under Settings → General → Startup. OmniWM mirrors the live macOS registration state, explains when approval is required, and links to Login Items. This is per-machine system state, not a portable TOML key. #593
  • Fullscreen outer margins can be kept globally or per display for OmniWM Full Screen, Niri maximized layouts, and the Single Window “Full Screen” fit. Workspace Bar reservations remain in effect; native macOS Full Screen is unchanged. The default is off, preserving previous fullscreen geometry once the settings file is updated or regenerated.
  • Focus without raise lets Focus Follows Mouse change keyboard focus without intentionally bringing an obscured window forward. The new setting can restore the previous raise-and-front behavior. #602
  • Performance Capture can be started from Diagnostics or the status menu, and Issue Reporting reflects a capture that is already running. It records bounded OmniWM-process CPU, energy, wakeup, I/O, and memory deltas alongside owner-local counters with low measurement perturbation, auto-stops after ten minutes, and retains the newest five performance captures. Problem captures also gain end-to-end frame lineage through intake, layout, AX writes, retries, and WindowServer observation.
  • Quake Terminal microphone support lets hosted terminal apps request audio-input permission through OmniWM. macOS may show an OmniWM microphone prompt the first time a child app requests it; omniwmctl remains unentitled. #597

Window Management and Focus

  • Tiled windows dragged by their native title bar now return to their authoritative tile after mouse-up, including delayed AX and WindowServer echoes. Modifier-driven Niri interactions and remembered floating geometry remain intact. #561
  • Temporarily hidden tiled windows reveal at the current accepted layout frame instead of stale historical geometry.
  • Windows returned to tiled mode before quitting now remain tiled after restart while retaining remembered floating geometry for a later toggle.
  • System-modal dialogs and hands-off application surfaces no longer trigger automatic focus recovery or get displaced by newly admitted floating windows. Focused dialogs also survive identity rekeys. #565 #577
  • When a focused floating app quits, OmniWM restores the workspace's retained tiled focus without disturbing Niri viewport or Dwindle selection state.
  • Background apps' stale AX focused-window callbacks can no longer steal focus from the actual frontmost app. Managed-focus retries are bounded and stale owned surfaces are retired. This is automatic; no per-app focus-stealing override was added. #594
  • Private window activation now posts a complete synthetic click, preventing Ghostty from retaining a missing mouse-up and buffering rendering. #569
  • Niri no longer snaps the viewport backward when the trailing column grows or leaves full-span mode. #580 #590

Overview, Animation, and Surfaces

  • Overview transitions now use a display-link session on each participating display, reverse safely when toggled mid-transition, and close cleanly when display topology changes.
  • Overview spatial navigation now respects visual rows and Niri column geometry, while Tab cycling stays linear across filtered results.
  • Dwindle animations begin only after their matching layout plan is accepted, so stale or replaced plans cannot leave phantom motion running.
  • Animation ticks avoid redundant AX size writes when trusted geometry confirms the size is unchanged. Border motion and size-preserving tab-rail moves are grouped into the display-link SkyLight transaction to reduce visual drift.
  • Abandoned gestures settle and release their display-link sessions instead of leaving animation work alive.

Lifecycle, Responsiveness, and Settings

  • Layout refresh and animation work pause while the screen is locked, then resume only after a usable post-unlock topology sample, protecting native-fullscreen and window state across lock and wake transitions.
  • Trackpad frames are coalesced in a bounded mailbox and duplicate scroll delivery is removed, preventing burst input from accumulating amplified motion.
  • Hidden Bar refreshes from app, display, activation, and panel lifecycle events instead of polling every second. It also discovers status items created by already-running apps and bounds unknown/open menu recovery.
  • Prevent Sleep now holds one continuous assertion only for the enabled active user session, releasing it on disable or session resignation and reacquiring it on return.
  • AX frame writes, notification queues, input queues, diagnostic storage, surface lifetimes, and focus retries are bounded and cleaned up deterministically under bursts and shutdown.
  • Core runtime paths avoid redundant AX/Core Foundation bridging, specialize frame-only updates, reuse unchanged reconciliation snapshots,...
Read more