github BarutSRB/OmniWM v0.6.5
OmniWM v0.6.5

5 hours ago

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 conflict clears. Processes already in the exiting state no longer block startup, matching existing zombie handling, while genuinely unidentified live blockers are shown by PID. #605

  • Physical-top gap matching and live per-monitor top-gap reload behavior now have explicit regression coverage.

Documentation, Internal Cleanup, and Thanks

  • Documentation now clarifies workspace is-focused/is-current/is-visible flags, AppKit's bottom-left coordinate system, Full Screen single-window fit, Workspace Bar reveal overlays and yOffset, and physical-top/per-monitor gap matching.

  • Internal layout settings no longer carry unread duplicate outer-gap state, and the website's pre-release version baseline was aligned with the already-published 0.6.4 app before preparing 0.6.5.

  • Thanks to Steven Nance (@llwt) for the window-picker and Dwindle-group fixes, and Panuphong Burakitphachai (@t1dotdev) for the menu-extra focus fix. Steven joins the contributor showcase under Nx.

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.5.zip SHA-256: f5e4315152745755b0bad269a6b31a97da9bbfa52a29707347d7673de2e91e8d
  • GhosttyKit.xcframework-v0.6.5.zip SHA-256: 855f2ba910d819ae1ba4dbe86a57dbba318e72912934baf720b044731ef4be8c

Don't miss a new OmniWM release

NewReleases is sending notifications on new releases.