Settings Reference
This reference follows current main; features newer than the latest release are marked Unreleased.
Complete reference for settings.toml, in the file’s canonical order. The authoritative schema is CanonicalTOMLConfig.swift; defaults come from SettingsExport.swift and BuiltInSettingsDefaults.swift.
Conventions
- Keys marked (optional) may be omitted; every other key is required.
- Colors are tables with
red,green,blue,alphafloats in0.0–1.0. singleWindowFitvalues are strings:"fill", a custom size"WIDTHxHEIGHT"(e.g."1920x1080"), or — Niri only —"container_primary_span"."fill"is the Settings window’s “Full Screen” fit: the lone window takes the fullscreen layout frame, so it followsfullscreenUsesOuterGapsrather than the regular tiling gaps.- Values listed as enums accept exactly the raw strings shown.
File schema
Section titled “File schema”| Key | Type | Default | Description |
|---|---|---|---|
schemaVersion |
integer | 4 |
Version of the complete settings.toml schema. This top-level key appears before the first table. |
The canonical file declares:
schemaVersion = 4An absent version identifies a legacy version 0 file, while OmniWM v0.6.4 emitted version 1. OmniWM upgrades version 0, 1, 2, and 3 files sequentially in memory before strict version 4 validation, retaining the compatibility guarantee for settings emitted by v0.6.2 through v0.6.4. The version 2 to version 3 step moves the old flat routing rows into one saved arrangement; version 3 to version 4 adds the unassigned set/remove window-mark hotkey actions. A successful upgrade creates an exact write-once settings.toml.pre-v4 or settings.toml.pre-v4.1 backup, then atomically rewrites canonical TOML once; this can reorder keys and removes comments, while preserving unrecognized keys when their owner can be matched safely. Valid release migrations never use the .corrupt recovery slots. Older schema-less files are attempted but remain untouched with defaults active if they cannot validate, and files declaring a newer unsupported version remain untouched with configuration writes blocked. See Automatic version upgrades for the migration rules and recovery behavior.
general
Section titled “general”Global switches: hotkeys, Hyper key, default layout, sleep, updates, IPC, animations, interface language.
| Key | Type | Default | Description |
|---|---|---|---|
hotkeysEnabled |
boolean | true |
Master switch for all global hotkeys. |
systemHyperTrigger |
string | "None" |
Physical trigger for Hyper: None, a key name (CapsLock, F13–F20, LeftControl/RightControl, LeftOption/RightOption, LeftShift/RightShift, LeftCommand/RightCommand; OmniWM writes these with a space, for example "Left Control" and "Caps Lock", and accepts both spellings), or MouseButton3/MouseButton4/MouseButton5. |
hyperKeyModifiers |
string | "Control+Option+Shift+Command" |
Modifier set Hyper expands to: +-joined names, at least two of Control/Option/Shift/Command. |
defaultLayoutType |
string | "niri" |
Layout used by workspaces whose own layoutType is default: niri or dwindle. |
preventSleepEnabled |
boolean | false |
Prevents idle display sleep while your user session is active. |
updateChecksEnabled |
boolean | true |
Automatic update checks. |
ipcEnabled |
boolean | false |
Enables the IPC server used by omniwmctl. |
animationsEnabled |
boolean | true |
Animates window layout changes and other OmniWM-authored motion. macOS Reduce Motion turns them off regardless of this key. |
animationSpeed (optional) |
float | 1.0 |
Tiling animation speed multiplier: 2.0 is twice as fast, 0.5 is half as fast. Applies to Niri focus, window/column movement and resizing, Dwindle layout changes, and workspace swipe settling. Values are clamped to 0.25–4.0; nonfinite values use 1.0. Changes apply to newly started transitions. Direct gesture tracking, inertial scrolling, Overview, and Quake terminal animations keep their own behavior. |
language |
string | unset | Interface language as a packaged localization code, such as "ja" or "sr-Latn". Leave it unset to follow macOS. Takes effect the next time OmniWM starts. |
Pointer-driven focus and monitor-edge focus/move behavior.
| Key | Type | Default | Description |
|---|---|---|---|
followsMouse |
boolean | false |
Focuses a managed window when the pointer enters it, no click needed. |
raiseOnMouseFocus |
boolean | false |
Also raises the window when focus-follows-mouse focuses it. A tiled window that a visible floating window overlaps from the front is focused without raising. |
lockModifier |
string | "off" |
Modifier that holds focus in place while pressed: off, option, leftOption, rightOption, command, leftCommand, rightCommand, control, leftControl, rightControl, shift, leftShift, rightShift. |
moveMouseToFocusedWindow |
boolean | false |
Moves the pointer to the window that gains focus. |
followsWindowToMonitor |
boolean | false |
Follows ordinary window or column transfers to another workspace, including dedicated monitor-move actions. Edge-crossing moves always follow. |
crossesMonitorAtEdge |
boolean | false |
Directional focus continues onto the neighboring monitor at the screen edge. |
moveCrossesMonitorAtEdge |
boolean | false |
Directional window move continues onto the neighboring monitor at the workspace edge and always follows the moved window. |
mouseWarp
Section titled “mouseWarp”Cursor warping across the monitor arrangement (used with routing.mode = "custom").
| Key | Type | Default | Description |
|---|---|---|---|
margin |
integer | 1 |
Edge margin in pixels used when warping the cursor between monitors. |
enabled |
boolean | true |
Enables cursor warping between monitors. |
constrainToArrangement |
boolean | false |
Constrains the cursor to the configured monitor arrangement. |
routing
Section titled “routing”How monitors are arranged for cross-monitor focus, move, and warp.
| Key | Type | Default | Description |
|---|---|---|---|
mode |
string | "macOS" |
macOS follows the system display arrangement; custom selects a saved arrangement for the connected displays. |
arrangements |
array of tables | [] |
Saved custom routing grids, written as [[routing.arrangements]] with nested [[routing.arrangements.monitors]] rows. |
Each arrangement has a required id UUID and a required monitors array. Each monitor row requires monitorName, gridColumn, and gridRow; monitorDisplayUUID and monitorDisplayId are optional identity fields. Grid coordinates are integers. Settings records display UUIDs automatically; matching uses UUID first and the existing display-ID/name fallback for displays without UUIDs.
OmniWM selects the first exact connected-set match. Otherwise, it selects the arrangement with the fewest total rows that contains every connected display; the first arrangement wins ties. It then uses only the connected displays’ grid positions. An uncovered set or an invalid selected grid follows macOS. Resolution, enumeration order, and macOS placement do not affect selection.
Editing, resetting, or finishing Monitor Setup saves exactly the connected set and retains an existing exact arrangement’s ID. An edit to an inherited grid creates a separate arrangement without changing its larger source. Connecting displays or opening Settings does not create arrangements. Keep arrangement IDs stable when editing by hand so unrecognized configuration fields remain associated with the right arrangement.
[routing]mode = "custom"
[[routing.arrangements]]id = "FBE84D50-689B-4B97-A820-B8E3BFD581B7"
[[routing.arrangements.monitors]]gridColumn = 0gridRow = 1monitorDisplayUUID = "8D575171-D0DD-43BB-9FEF-356E6B7C917D"monitorName = "Built-in Retina Display"
[[routing.arrangements.monitors]]gridColumn = 0gridRow = 0monitorDisplayUUID = "3EFD184C-D5D3-40EF-AF27-14C4222A467B"monitorName = "DELL U2720Q"For no saved arrangements, use arrangements = [] inside [routing] and omit the array-of-table entries. The example UUIDs above are illustrative; use the identities recorded for your displays by Settings > Displays.
monitors
Section titled “monitors”Optional table that ranks displays for OmniWM’s monitor roles. Omit it to keep the default roles: Main is the display with the macOS menu bar, and Secondary and Tertiary are the next displays in arrangement order.
| Key | Type | Default | Description |
|---|---|---|---|
ranking |
array of tables | unset | Displays in preference order, written as [[monitors.ranking]] rows. The highest-ranked connected display is Main, the next connected one is Secondary, the third is Tertiary, and unranked displays follow in the default order. |
Each row requires name; displayUUID and displayId are optional identity fields that Settings records automatically. A row with a displayUUID matches only that display. A row without one falls back to the display-ID/name pair, and then to a case-insensitive name match when it identifies exactly one connected display. A row whose display is disconnected is skipped, so a docked external display can outrank the built-in display while the built-in display becomes Main again when undocked.
[[monitors.ranking]]displayUUID = "3EFD184C-D5D3-40EF-AF27-14C4222A467B"name = "DELL U2720Q"
[[monitors.ranking]]displayUUID = "8D575171-D0DD-43BB-9FEF-356E6B7C917D"name = "Built-in Retina Display"Workspaces whose home is Main, Secondary, or Tertiary follow this ranking, and so does the Quake terminal’s mainMonitor mode. The is-main field and selector in omniwmctl keep reporting the macOS main display.
Gaps between tiled windows and screen edges (points).
| Key | Type | Default | Description |
|---|---|---|---|
size |
float | 16.0 |
Stored inner gap between tiled windows. An enabled focus border may raise the runtime-effective gap without rewriting this value. |
fullscreenUsesOuterGaps |
boolean | false |
Fullscreen layout frames keep the outer gaps. |
outer.left |
float | 0.0 |
Outer gap at the left screen edge. |
outer.right |
float | 0.0 |
Outer gap at the right screen edge. |
outer.top |
float | 0.0 |
Outer gap measured from the physical top edge of each display. The menu bar height is subtracted first and the result is clamped at 0, so a display without a menu bar needs a smaller value than the main display for the same visual gap below the menu bar. |
outer.bottom |
float | 0.0 |
Outer gap at the bottom screen edge. |
Per-display values come from [[monitorGapOverrides]]. An override row must match the connected display’s UUID, or both display ID and name if that display has no UUID. An unmatched row is ignored and the global values apply; the override row’s own id does not identify the display.
Options for the scrolling (Niri) layout.
| Key | Type | Default | Description |
|---|---|---|---|
visibleContainerCount |
integer | 2 |
How many containers (columns) share the viewport side by side. When fewer containers are open, they expand proportionally to fill unused space while preserving their relative widths. Manual resizing takes priority until the container count changes. |
infiniteLoop |
boolean | false |
Treats the column strip as a loop instead of a bounded row. |
centerFocusedColumn |
string | "never" |
When to center the focused column: never, always, onOverflow. |
alwaysCenterSingleColumn |
boolean | false |
Centers the column when a workspace holds only one. |
singleWindowFit |
string | "fill" |
Size of a lone window: fill (the “Full Screen” fit, which uses the fullscreen layout frame and honors fullscreenUsesOuterGaps), container_primary_span, or WIDTHxHEIGHT. |
containerPrimarySpanPresets (optional) |
float array | [1/3, 1/2, 2/3] |
Span fractions the span-cycling actions step through. |
defaultContainerPrimarySpan (optional) |
float | 0.5 |
Primary-axis span fraction for new containers. |
resizeStepPercent (optional) |
integer | 5 |
Increment for Niri grow/shrink actions in percentage points, clamped to 1–100. Applies to container primary, window primary, and window secondary spans. Explicit CLI sizes are unaffected. |
edgeGaps (optional) |
boolean | true |
Keeps the inner gap between columns and the screen edges, in addition to the outer gaps. false uses the inner gap only between columns and between stacked windows. A lone window is unaffected. |
The resize increment defaults to 5% instead of the previous fixed 10%.
dwindle
Section titled “dwindle”Options for the Dwindle (BSP) layout.
| Key | Type | Default | Description |
|---|---|---|---|
smartSplit |
boolean | false |
Automatically chooses the split direction from the active window’s center relative to the target tile’s center and aspect ratio. |
defaultSplitRatio |
float | 1.0 |
1.0 = equal split, <1.0 = first window smaller, >1.0 = first window larger. |
splitWidthMultiplier |
float | 1.0 |
Biases when vertical vs. horizontal splits are preferred. |
singleWindowFit |
string | "fill" |
Size of a lone window: fill (the “Full Screen” fit, which uses the fullscreen layout frame and honors fullscreenUsesOuterGaps) or WIDTHxHEIGHT (no span mode in Dwindle). |
useGlobalGaps |
boolean | true |
Uses the gaps values; when false, the inner gap comes from a per-monitor innerGap override (falling back to gaps.size), clamped to the same 0–64 range as gaps.size. |
moveToRootStable |
boolean | true |
Keeps a window on the same screen side when moving it to the root. |
borders
Section titled “borders”Border drawn around the focused window.
| Key | Type | Default | Description |
|---|---|---|---|
enabled |
boolean | true |
Draws the focused-window border. |
width |
float | 5.0 |
Exterior border width in points; configured values are clamped to 1–12 points when applied. Managed layout frames use its physical-pixel ceiling as the minimum runtime inner and outer clearance while borders are enabled; stored gap values are unchanged. |
color |
color table | red ≈ 0.0846, green 1.0, blue ≈ 0.9793, alpha 1.0 |
Border color (default is a cyan accent) used in light appearance. |
darkColor |
optional color table | absent | Border color used when macOS is in dark appearance. Falls back to color when absent. The glow also inherits it unless glow.color or glow.darkColor is set. |
gradient |
optional table | absent | Enables a two-color linear gradient border when enabled = true. |
gradient.enabled |
boolean | false |
Uses the gradient instead of the solid border color. |
gradient.direction |
string | "topLeftToBottomRight" |
Either topLeftToBottomRight or topRightToBottomLeft, in the border surface’s local coordinates. |
gradient.start / gradient.end |
color tables | — | Complete endpoint colors. A present gradient table must include both colors. |
gradient.dark |
optional table | absent | Dark-appearance endpoint colors. |
gradient.dark.start / gradient.dark.end |
color tables | — | Endpoint colors used in dark appearance. Each stop falls back to the matching gradient.start / gradient.end value when absent. |
glow |
optional table | absent | Adds a visual-only glow around the border. It never changes layout gaps or resize hit-testing. |
glow.enabled |
boolean | false |
Draws the glow before the border. |
glow.radius |
float | 8.0 |
Glow radius in points, accepted from 0 through 32. The overlay surface expands to contain it. |
glow.opacity |
float | 0.6 |
Glow opacity from 0 through 1. |
glow.color |
optional color table | absent | Overrides the glow color in light appearance. When absent, the glow inherits the border’s solid color or gradient endpoints. |
glow.darkColor |
optional color table | absent | Glow color used in dark appearance. Falls back to glow.color, then to the border colors. |
Gradient and glow are composable. A missing table preserves solid rendering. Non-finite or structurally invalid values preserve the previous valid appearance; finite gradient color components are clamped to 0...1, while glow radius and opacity must remain within their documented ranges. Glow reuses the border’s solid color or gradient endpoints unless glow.color or glow.darkColor overrides it, so a gradient border produces a spatially matching gradient glow by default.
Border and gradient colors resolve per macOS appearance: dark values apply when the system (or OmniWM’s own Appearance setting, when not Automatic) uses the dark appearance, and update live as the appearance switches — no restart needed. Unset dark values keep the base colors, so existing configs render exactly as before. In Settings, inherited colors are labeled explicitly; Customize creates an override and Reset restores inheritance. Editing one dark gradient endpoint leaves the other inherited until customized. The glow inherits the resolved border color or gradient endpoints, so it adapts with them.
overview
Section titled “overview”Zoom and colors for the Overview.
| Key | Type | Default | Description |
|---|---|---|---|
enabled (optional) |
boolean | true |
Enables Overview. When off, its shortcuts, mouse button, trackpad gesture, and direct commands cannot open it; saved input assignments remain available when re-enabled. |
zoom |
float | 1.0 |
Overview zoom factor. |
backdrop |
color table | 0.05, 0.05, 0.08, 1.0 |
Backdrop behind the zoomed-out workspaces. |
windowBorders.normal |
color table | 0.3, 0.3, 0.35, 0.5 |
Border for windows at rest. |
windowBorders.hovered |
color table | 0.4, 0.6, 1.0, 1.0 |
Border for the hovered window. |
windowBorders.selected |
color table | 0.3, 0.8, 0.4, 1.0 |
Border for the selected window. |
workspaceBar
Section titled “workspaceBar”The per-monitor workspace bar. Per-monitor exceptions live in monitorBarOverrides. A shell profile or theme can override most of these keys in its own [workspaceBar]. Unreleased: available when building from main.
| Key | Type | Default | Description |
|---|---|---|---|
enabled |
boolean | true |
Shows the workspace bar. When off, all monitors’ bars are off, including monitors with enabled = true overrides; those preferences return when the global bar is re-enabled. |
hoverPreviewsEnabled (optional) |
boolean | true |
Shows window thumbnail previews when hovering over bar icons. Turning it off releases the preview capture and cache while leaving the bar active. |
notificationBadges (optional) |
string | "off" |
App-wide Dock badges on existing icons: off, dot, or text. Global setting. |
notificationBadgeRefreshIntervalSeconds (optional) |
float | 5.0 |
Badge refresh interval, rounded to whole seconds and clamped to 1–60. |
showLabels |
boolean | true |
Shows workspace names next to their numbers. |
showFloatingWindows |
boolean | false |
Includes floating windows’ icons in workspace pills. |
windowLevel |
string | "popup" |
Bar window level: normal, floating, status, popup, screensaver. |
position |
string | "overlappingMenuBar" |
overlappingMenuBar, belowMenuBar, bottom, left, or right. Bottom and side placements follow the usable display edge, avoiding a visible Dock. |
notchMode |
string | "moveBelowMenuBar" |
Notch handling: off, moveBelowMenuBar, splitActiveLeft, splitActiveRight, or fillLeftOfNotch. The last fills the menu-bar area left of the notch and covers app menus; without a notch it uses the left half of the menu bar. At top positions, this mode overrides position, xOffset, yOffset, height, and reserveLayoutSpace: the bar uses the menu-bar height and reserves no layout space. Bottom/left/right ignore notch modes without changing the saved preference. |
notchActiveZoneWidth |
float | 180.0 |
Width in points of the active zone around the notch. |
fullWidth (optional) |
boolean | false |
Spans the whole screen edge, with the shell’s leading, center and trailing widgets at its start, middle and end (top, middle and bottom on a side bar). notchMode, notchActiveZoneWidth and the offset along the bar don’t apply. Over the menu bar it sits at the top of the screen, above the native menu bar, and sets macOS’s Automatically hide and show the menu bar to Always, on every display, unless it already is. Your previous choice comes back when the last full-width bar leaves the menu bar or turns off, or OmniWM quits (after a crash, at the next launch). Unreleased: available when building from main. |
fullWidthNotchMode (optional) |
string | "rightOfNotch" |
Where a full-width bar’s center widgets go on a display with a notch: off (centered under the notch), moveBelowMenuBar (the whole bar moves below the menu bar), rightOfNotch, leftOfNotch, or splitAroundNotch (the first half left of the notch, the rest right of it). Bottom/left/right ignore it. Unreleased: available when building from main. |
systemStatsButton |
boolean | false |
Adds a system stats button to the bar. When building from main, the button and the Toggle System Stats hotkey need the shell’s system-stats widget in one of the bar’s groups. |
deduplicateAppIcons |
boolean | false |
Collapses repeated icons of the same app within a pill. |
hideEmptyWorkspaces |
boolean | false |
Hides inactive empty workspaces in the bar and Overview; next/previous navigation skips them. |
excludedBundleIDs |
string array | [] |
Bundle IDs whose windows never contribute icons to the bar. |
iconOverrides |
table | {} |
Bundle ID → custom icon source (see below). |
reserveLayoutSpace |
boolean | false |
Reserves space at the selected edge for tiled and layout-fullscreen windows. Overlapping placement reserves only how far the bar’s screen-constrained bottom edge extends below the top of the usable frame, including yOffset (zero when it fits within the menu-bar area). Other positions reserve the configured bar thickness regardless of offsets. |
autoHide (optional) |
boolean | false |
Reveal when the pointer touches the bar’s edge span. Hide after the pointer moves inward past the bar and interactions end; moving along the edge keeps it visible. Never reserves layout space. Supports per-display overrides and combines with modifier-hold reveal. |
autoHideRevealDelayMilliseconds (optional) |
float | 0.0 |
How long the pointer must stay at the bar’s edge before an auto-hidden bar appears, clamped to 0–1000. Leaving the edge sooner cancels the reveal. Global setting. |
autoHideHideDelayMilliseconds (optional) |
float | 0.0 |
How long an auto-hidden bar stays after the pointer moves inward past it and interactions end, clamped to 0–1000. Returning to the bar sooner cancels the hide. Global setting. |
revealModifier |
string | "off" |
Reveal the bar by holding a modifier. Any value other than off makes the bar overlay-only: it reserves no layout space at all while the modifier is configured, not just while it is held. Values: off, option, control, command, shift, controlOption, optionCommand, optionShift, controlCommand, controlShift, commandShift, controlOptionCommand, controlOptionShift, optionCommandShift, controlCommandShift, controlOptionCommandShift. |
revealHoldMilliseconds |
float | 200.0 |
How long the modifier must be held before the bar reveals. |
hideInNativeFullscreen |
boolean | false |
Hides the bar while a native-fullscreen space is active. Effective fillLeftOfNotch at a top position always hides there, regardless of this setting. |
height |
float | 24.0 |
Bar thickness in points: height for horizontal bars, width for left/right bars. Side bars scroll when content exceeds the usable display height. |
backgroundOpacity |
float | 0.1 |
Bar background opacity (0.0–1.0). |
inactiveIconOpacity (optional) |
float | unset | Opacity of unfocused app icons; finite values clamp to 0.0–1.0. Omit to use the built-in appearance; Reset to System Default clears the override. |
transparentBackground (optional) |
boolean | false |
Hides the bar material, tint, and border while keeping its contents interactive. Takes precedence over solidBlackBackground. |
solidBlackBackground (optional) |
boolean | false |
Uses a solid black bar background when transparentBackground is false. |
showItemBackgrounds (optional) |
boolean | true |
Shows backgrounds behind workspace groups, floating windows, scratchpads, and stats. |
showAccentHighlights (optional) |
boolean | true |
Shows the focused-workspace outline and focused-icon glow. |
xOffset |
float | 0.0 |
Horizontal offset in points. |
yOffset |
float | 0.0 |
Vertical offset in points; positive values move the bar up, negative values move it down. |
accentColor (optional) |
color table | unset | Accent color override; unset uses the built-in accent. |
textColor (optional) |
color table | unset | Text color override; unset uses the built-in text color. |
iconOverrides maps a bundle ID to either an image file path — absolute, ~/-relative, or relative to the omniwm config directory — or bundle-resource:NAME for an image resource inside that app’s own bundle:
[workspaceBar.iconOverrides]"com.apple.Safari" = "~/Pictures/safari-alt.png""com.mitchellh.ghostty" = "bundle-resource:AppIcon"gestures
Section titled “gestures”Mouse and trackpad gestures.
The seven optional overviewGesture… and window… keys below configure Overview swipes and trackpad window move/resize.
| Key | Type | Default | Description |
|---|---|---|---|
scrollEnabled |
boolean | true |
Trackpad column scrolling (fingerCount) and modifier + mouse scroll wheel scrolling along the Niri primary axis; false turns off both. |
scrollSensitivity |
float | 5.0 |
Scroll gesture sensitivity. |
scrollModifierKey |
string | "optionShift" |
Modifier for wheel scrolling: optionShift, controlShift, commandShift, controlOptionShift, optionCommandShift, controlCommandShift, or controlOptionCommandShift. The System Hyper Trigger does not add modifiers to wheel events. |
mouseMoveModifierKey |
string | "option" |
Modifier for drag-to-swap of tiled windows in Niri and Dwindle (Niri also accepts Shift for insert): off, option, control, command, controlOption, optionCommand, controlCommand, controlOptionCommand. |
mouseResizeModifierKey |
string | "option" |
Modifier for right-drag resize: option, control, command, shift, controlOption, optionCommand, optionShift, controlCommand, controlShift, commandShift, controlOptionCommand, controlOptionShift, optionCommandShift, controlCommandShift, controlOptionCommandShift. |
fingerCount |
integer | 3 |
Trackpad column-scroll finger count: 3 or 4. |
invertDirection |
boolean | true |
Inverts trackpad gesture direction. |
trackpadScrollStyle |
string | "snap" |
snap (snap to columns) or momentum. |
workspaceSwipeEnabled |
boolean | false |
Trackpad swipe switches to the next/previous workspace. |
workspaceSwipeFingerCount |
integer | 3 |
Workspace-swipe finger count: 2, 3, or 4. |
workspaceSwipeAxis |
string | "vertical" |
Workspace-swipe axis: horizontal or vertical. |
overviewGestureEnabled (optional) |
boolean | false |
Enable the trackpad gesture that opens Overview with an upward swipe and closes it with a downward swipe. |
overviewGestureFingerCount (optional) |
integer | 4 |
Overview gesture finger count: 3 or 4. |
windowMoveEnabled (optional) |
boolean | false |
Drag without clicking to swap the tiled window under the cursor in either layout. |
windowMoveFingerCount (optional) |
integer | 4 |
Window-move finger count: 2, 3, or 4. |
windowResizeEnabled (optional) |
boolean | false |
Drag without clicking to resize the tiled window under the cursor in either layout. |
windowResizeFingerCount (optional) |
integer | 3 |
Window-resize finger count: 2, 3, or 4. |
windowGestureSensitivity (optional) |
float | 1.0 |
Move/resize sensitivity, clamped to 0.1…5.0; non-finite values use 1.0. |
Window move and resize gestures use all directions, so their finger counts must differ from every other enabled gesture. Configuration loading rejects overlaps with each other, column scrolling, workspace switching, or Overview. In Settings, Set Up… previews the conflicting assignments and lets you choose which gestures to turn off before applying the change. When editing TOML, disable or reassign conflicting gestures in the same edit. Moving stays on the starting monitor; resizing can continue beyond its bounds. Lift all fingers to finish, and turn off matching macOS gestures under System Settings → Trackpad → More Gestures. These gestures are inactive while Overview is open and do not use invertDirection.
Overview follows your fingers like Mission Control. Swipe up with the configured finger count and the thumbnails fly out as you move; release past the halfway point, or flick upward, to finish opening, and release earlier to cancel without disturbing the app you were in. Swipe down while Overview is open to close it the same way. Closing matches Escape: it activates the highlighted window, or restores the previously active app when there is no selection. Touching the trackpad while Overview is animating catches it in place. With animationsEnabled off or macOS Reduce Motion on, the swipe triggers immediately after a short travel instead of tracking. Direction is independent of invertDirection. Lift all fingers between gestures. Configuration validation rejects enabled gestures that share the same fingers and upward movement; the Settings Set Up… flow helps resolve those conflicts. Horizontal swipes may share fingers with Overview. Validation accounts for connected monitors’ column orientations and workspace swipes running perpendicular to column scrolling when their finger counts match. Without column scrolling, workspace swipes use their configured axis. If a display change creates an overlap, ambiguous upward swipes are ignored until the assignments are corrected. Disable the matching macOS Mission Control gesture to avoid interception.
statusBar
Section titled “statusBar”Extra readouts beside the menu bar icon.
| Key | Type | Default | Description |
|---|---|---|---|
showWorkspaceName |
boolean | false |
Shows the active workspace beside the menu bar icon. |
showAppNames |
boolean | false |
Also shows the focused app’s name. |
useWorkspaceId |
boolean | false |
Shows the workspace number instead of its name. |
showIcon |
boolean | true |
Shows the OmniWM icon beside the workspace. When off, only the workspace shows, except while diagnostics are recording or Secure Input is on. Has no effect while showWorkspaceName is off. |
hiddenBar
Section titled “hiddenBar”Menu-bar icon concealment (requires macOS 27+ and Full Disk Access).
| Key | Type | Default | Description |
|---|---|---|---|
enabled |
boolean | true |
Enables the Hidden Bar feature while the workspace bar is on. |
hiddenBundleIDs |
string array | [] |
Bundle IDs of menu-bar apps whose icons are concealed. |
rehideIntervalSeconds |
float | 5.0 |
Seconds before revealed icons re-hide automatically. |
A shell profile can override enabled and rehideIntervalSeconds in its own [hiddenBar]. Unreleased: available when building from main.
clipboard
Section titled “clipboard”Clipboard history limits. History content itself is stored in the state directory, not in the config file.
| Key | Type | Default | Description |
|---|---|---|---|
historyEnabled |
boolean | false |
Enables clipboard history capture. |
maxItems |
integer | 200 |
Maximum number of unpinned history entries. |
maxItemBytes |
integer | 8388608 |
Maximum size of a single entry (8 MiB). |
maxTotalBytes |
integer | 67108864 |
Maximum total history size, including pins (64 MiB). |
ignoredTypes |
string array | [] |
Exact pasteboard type identifiers that exclude a copy from history. |
quakeTerminal
Section titled “quakeTerminal”The drop-down (Quake) terminal.
| Key | Type | Default | Description |
|---|---|---|---|
enabled |
boolean | true |
Enables the Quake terminal. |
position |
string | "center" |
Terminal position: top, bottom, left, right, center. Edge positions slide in; center fades in place. |
widthPercent |
float | 50.0 |
Width as a percentage of the monitor’s available screen area. |
heightPercent |
float | 50.0 |
Height as a percentage of the monitor’s available screen area. |
animationDuration |
float | 0.2 |
Show/hide animation duration in seconds. |
autoHide |
boolean | false |
Hides the terminal when it loses focus. |
opacity (optional) |
float | 1.0 |
Terminal background opacity (0.0–1.0). |
backgroundEffect |
string | "standardBlur" |
Background material: standardBlur, glassRegular, glassClear. |
backgroundBlurRadius (optional) |
integer | 0 |
Background blur radius; 0 disables the extra blur. |
monitorMode (optional) |
string | "focusedWindow" |
Which monitor it appears on: mouseCursor, focusedWindow, mainMonitor. |
scratchpads
Section titled “scratchpads”Optional labels for the ten scratchpad slots. A label replaces the slot number in the workspace bar and in omniwmctl output.
| Key | Type | Default | Description |
|---|---|---|---|
labels |
table | {} |
Slot number (1–10) → label string. |
[scratchpads.labels]1 = "term"2 = "notes"appearance
Section titled “appearance”Appearance of OmniWM’s own UI.
| Key | Type | Default | Description |
|---|---|---|---|
mode |
string | "dark" |
automatic, light, or dark. |
tabRailAppIcons (optional) |
boolean | false |
Replaces compact tab markers with app icons in Niri and Dwindle. Each tab group reserves a 28-point rail instead of 10 points; crowded rails scroll vertically. |
The Show app icons in tab rails toggle in Settings → Appearance → App & Motion controls the same option. Changes apply live without restarting.
[appearance]mode = "dark"tabRailAppIcons = truehotkeys
Section titled “hotkeys”Array of tables — one entry per assignable action, each with an id (the action identifier) and a binding:
[[hotkeys]]binding = "Option+1"id = "switchWorkspace.0"
[[hotkeys]]binding = "Unassigned"id = "toggleScratchpad.1"bindingis a human-readable chord:+-joined modifiers (Control,Option,Shift,Command, or theHypershorthand for the fullhyperKeyModifiersset) followed by a key name — or"Unassigned". ALeft/Rightprefix pins a modifier to one side (e.g."Left Option+H"). A binding can instead be an extra mouse button,MouseButton2–MouseButton31, alone or after modifiers without side prefixes (e.g."Option+MouseButton3"); a button used bysystemHyperTriggeror Overview cannot also be a hotkey.- The array is validated strictly: each action may appear only once, and an action that is left out is unassigned. Workspace
10+action IDs are optional and appear while those workspaces exist. An unknown, unassignable, or duplicate action id rejects the whole file, so rebind by editingbindingvalues in place. - The numeric suffix is zero-based for
switchWorkspace.N,moveToWorkspace.N,focusColumn.N, andmoveColumnToWorkspace.N—switchWorkspace.0is Switch to Workspace 1 (Option + 1by default) — and one-based forswitchWorkspaceSlot.N,moveToWorkspaceSlot.N,focusWindowInColumn.N,moveColumnToIndex.N,toggleScratchpad.N, andassignFocusedWindowToScratchpad.N. toggleShellWidget.<name>toggles the shell drawer or widget popout named<name>. Settings lists one for every drawer and every widget with a popout, and a bound one stays while its drawer or widget is missing. Unreleased: available when building frommain.
The default bindings are listed in the keyboard shortcuts guide; assignable actions appear in Settings > Keyboard Shortcuts.
workspaces
Section titled “workspaces”Array of workspace definitions.
| Key | Type | Description |
|---|---|---|
id |
string (UUID) | Stable identity; keep it unchanged when editing. |
name |
string | Workspace name; numeric names define the ordering and number-key targets. |
displayName (optional) |
string | Label shown in the bar instead of name (emoji welcome). |
monitorAssignment |
table | type = main, secondary, tertiary, or specificDisplay. For specificDisplay, the output sub-table contains a required name (string), optional displayUUID (string), and optional displayId (integer). The role types resolve through the monitors ranking. |
layoutType |
string | default (follow general.defaultLayoutType), niri, or dwindle. |
For specificDisplay, displayUUID takes precedence when present. Without it, displayId and name must match a monitor that has no display UUID. A name alone cannot identify the target monitor.
Default: nine workspaces named 1–9, all Niri — 1–5 and 8–9 on the main monitor, 6 (shown as ❤️) and 7 (shown as 🚀) on the secondary, matching the default Option + 1–9 bindings.
[[workspaces]]displayName = "❤️"id = "5953F2BF-A378-4266-91B2-287174C4FA4D"layoutType = "niri"name = "6"
[workspaces.monitorAssignment]type = "secondary"appRules
Section titled “appRules”Array of per-app window rules, editable in the App Rules window. Matchers select windows; the remaining fields say what to do with them.
| Key | Type | Description |
|---|---|---|
id (optional) |
string (UUID) | Stable rule identity; generated if omitted. Keep an existing ID unchanged when editing. |
bundleId |
string | App bundle ID to match (may be empty when an advanced matcher is used). |
appNameSubstring (optional) |
string | Matches on the app name. |
titleSubstring (optional) |
string | Matches on the window title. |
titleRegex (optional) |
string | Regex match on the window title; when both title matchers are set, the regex wins. |
axRole (optional) |
string | Matches the accessibility role. |
axSubrole (optional) |
string | Matches the accessibility subrole. |
layout (optional) |
string | auto (default), tile, or float. |
assignToWorkspace (optional) |
string | Workspace name the window is routed to. |
initialContainerPrimarySpan (optional) |
float | Initial Niri span for the window’s container (0.05–1.0). |
minWidth (optional) |
float | Minimum layout width in points. |
minHeight (optional) |
float | Minimum layout height in points. |
The defaults ship 13 rules that set minimum sizes for apps with known resize floors (Codex, Commander One, Chrome, Zed, Safari, Zen, Firefox, Dia, Spotify, Discord, Ghostty, Outlook, Messages).
[[appRules]]bundleId = "com.apple.Safari"id = "81426D13-C1A5-475E-AFBC-00BBA05042D0"minHeight = 220.0minWidth = 574.0Per-monitor overrides
Section titled “Per-monitor overrides”Five arrays hold per-monitor exceptions to the global tables. Every entry requires monitorName. Use the display’s monitorDisplayUUID; for a display without a UUID, supply both monitorDisplayId and monitorName. A name alone does not match a display. All entries except orientation also carry an id UUID identifying the override row, not the display. Override keys are all optional — an omitted key falls back to the corresponding global setting. All five arrays default to empty. Custom routing grids live separately in routing.arrangements.
When workspaceBar.enabled = false, no monitor can show its bar. Saved monitorBarOverrides.enabled values take effect again when the global bar is enabled.
| Array | Overridable keys |
|---|---|
monitorBarOverrides |
enabled, showLabels, showFloatingWindows, deduplicateAppIcons, hideEmptyWorkspaces, reserveLayoutSpace, autoHide, notchMode, notchActiveZoneWidth, fullWidth, fullWidthNotchMode, position, windowLevel, height, backgroundOpacity, inactiveIconOpacity, transparentBackground, solidBlackBackground, showItemBackgrounds, showAccentHighlights, xOffset, yOffset — see workspaceBar. fullWidth and fullWidthNotchMode are Unreleased: available when building from main. |
monitorOrientationOverrides |
orientation: horizontal or vertical layout orientation for that monitor |
monitorNiriOverrides |
visibleContainerCount, centerFocusedColumn, alwaysCenterSingleColumn, singleWindowFit, infiniteLoop — see niri |
monitorDwindleOverrides |
smartSplit, defaultSplitRatio, splitWidthMultiplier, singleWindowFit, useGlobalGaps, innerGap — see dwindle |
monitorGapOverrides |
innerGap, outerGapLeft, outerGapRight, outerGapTop, outerGapBottom, fullscreenUsesOuterGaps — see gaps |
[[monitorGapOverrides]]id = "0B54A3C1-6E1B-4D5B-9A64-2F0D8A11C001"innerGap = 8.0monitorDisplayUUID = "3EFD184C-D5D3-40EF-AF27-14C4222A467B"monitorName = "DELL U2720Q"outerGapTop = 4.0The example UUID is illustrative; replace it with the identity recorded for your display. These overrides are most easily managed from Settings > Displays and Settings > Layouts tabs, which record the display’s UUID automatically so the override survives display reconnects.