PRO Feature

Window rules require FazerWM Pro. The free tier does not apply any window rules. Built-in auto-floating of dialogs still works on every tier (see Auto-Float below).

The Window Rules pane: a rule selected
✚ Picture in Picture
✚ FazerWM
✚ Resolve
✚ Comms
+-
Rule
Rule name:Picture in Picture▲▼🗑
Match
App ID:com.example.App</>Pick App
Title:(?i)^picture(?:[- ]in[- ]picture| in picture)$</>Pick Title
Window type:AnyTiled onlyFloating only
Action
Target workspace:None
Group windows in column
Window width:Default (2 across)Override…
Float window
Avoid mouse pointer
Sticky (visible on all workspaces)
Window Position:CustomX: 0%  Y: 100%

Like Named Workspaces, this pane is a two-column editor: the rule list (+ / -, context-menu delete, ▲ / ▼ ordering in the detail header) and the rule editor with three blocks: name, Match, and Action. Rules are evaluated by score: each matching criterion is 1 point, and the highest-scoring rule wins. That lets a broad app-level rule coexist with a specific title-level one.

The rule editor

Rule name

An optional label shown in the list; unnamed rules display their match pattern.

Match

Two regex fields, App ID (bundle identifier) and Title (window title), each with two helpers:

A third control, Window type, is a segmented picker that filters the rule by FazerWM's float classification:

SegmentMatchesConfig
AnyTiled and floating windows alike (default)match.floating omitted
Tiled onlyOnly windows FazerWM tiles (skips the app's dialogs and modals)match.floating: false
Floating onlyOnly floating windowsmatch.floating: true

Action

ControlWhat it doesConfig key
Target workspaceA menu with None, Current workspace, your named workspaces, and numbered workspaces 1–9. Choosing a named workspace reveals a Preferred display chip selector for multi-display targeting.workspace
Group windows in columnWhen on, matching windows stack into one shared column. Set a group name (with a Pick menu of existing names) and a layout mode (Vertically Tiled or Tabbed). Windows from different apps can share a group.group
Window widthStarts at Default (N across), inheriting the global defaultWindowWidth. Override… opens the same across/%/pt width editor as General, with a path back to Use Default.width
Float windowOpens the window floating instead of tiled. Reveals the three floating options below.floating.enabled
Avoid mouse pointerKeeps the window away from the cursor: on multi-display it opens on a display without the cursor; on single-display it opens in the opposite quadrant. Hold Hyper to pause avoidance and click the window; after release it stays put for 3 seconds or until you move the mouse.floating.avoidMouse
StickyThe window stays visible across workspace switches.floating.sticky
Window PositionA preset menu (Default, Center, Top-Left, Top-Right, Bottom-Left, Bottom-Right) plus X/Y fields for exact coordinates (50%, 100px).floating.position

The Regex Helper

Clicking the </> button beside App ID or Title opens a sheet that builds and tests the pattern for you:

The Regex Helper sheet: App ID mode
Regex Helper - App ID
Close
Live Test
Pattern:^com\.apple\..*
Results: 3/12 matches↻
✔Safaricom.apple.Safari
○Firefoxorg.mozilla.firefox
✔Findercom.apple.finder
○Codecom.microsoft.VSCode
… and 8 more
Patterns
App ID PatternsGeneral SyntaxSearch…
Prefix Match (Developer)
^com\.apple\..*
Matches all apps from a developer (e.g., all Apple apps). Examples: com.apple.Safari, com.apple.Mail, com.apple.Finder
Case Insensitive Contains
(?i).*slack.*
Matches regardless of case. Examples: com.Slack.desktop, com.tinyspeck.SlackMacGap

The sheet has two halves:

Clicking a preset card applies it. Many presets are generative: they derive the pattern from what you already typed. Prefix Match (Developer) extracts the developer prefix from a bundle ID, and Contains extracts the searchable term. Some presets also offer a word or position picker to insert at the start, the end, or an exact spot in your pattern.

💡 Lint is advisory

The sheet flags an invalid regex in red and possible catastrophic-backtracking risk (nested wildcards, unbounded repeats) in orange, but never blocks saving. The same backtracking hint also appears inline under the rule fields when you type a risky pattern by hand.

Rule structure in YAML

windowRules:
  - name: Picture in Picture      # optional label
    match:
      appId: regex pattern        # match bundle identifier
      title: regex pattern        # match window title
      floating: false             # optional: tiled windows only
    floating:                     # any subset of:
      enabled: true
      avoidMouse: true
      sticky: true
      position: { x: 0%, y: 100% }
    width: 50%                    # fraction | Nx | Npt
    workspace: chat               # name | number | current
    group:
      name: terminals
      mode: tabbed

Match criteria

CriterionDescriptionExample
appIdA regex against the app bundle identifier^org\.wezfurlong\.wezterm$
titleA regex against the window title^Picture-in-Picture$
floatingFilter by FazerWM's float classification: false = tiled windows only, true = floating only. Omit to match either. Set in the GUI with the Window type segmented picker in the Match section.false
💡 Excluding an app's dialogs

An appId-only rule matches every window the app opens, including file pickers and modals that FazerWM auto-floats. Add floating: false to match only the app's standard tiled windows:

  - match:
      appId: com.blackmagic-design.DaVinciResolve
      floating: false
    width: 100%
    workspace: 2

Even without the flag, FazerWM never stretches an auto-floated dialog to a tiling width. The flag gives you explicit control, so the rule skips dialogs entirely.

Scoring

Each matching criterion scores 1 point; the highest-scoring rule wins. Broad and specific rules can coexist:

windowRules:
  # Broad: matches any Firefox window (score: 1)
  - match:
      appId: firefox$
    width: 50%

  # Specific: matches Firefox PiP only (score: 2)
  - match:
      appId: firefox$
      title: ^Picture-in-Picture$
    floating: true
    position: center
    width: 40%

Floating windows

Floating windows are left out of the tiling layout: they keep their own size and position and stack like ordinary macOS windows (there is no separate "floating layer"). A window floats either because the source app already defines it as floating (dialogs, accessory apps, elevated windows; automatic and free), or because a window rule floats it explicitly.

The full model, including window states, the Hyper+Z before/after view, and how floating relates to tiling, is covered in Core Concepts: Scrollable Column Tiling → Floating Windows.

Auto-Float (built-in, free)

FazerWM floats certain windows automatically, with no rule, so dialogs and utilities behave naturally:

💡 Original position preserved

Auto-floated windows keep their original position and size; they are not centered or resized.

ℹ️ Built-in vs. rule-based floating

Automatic detection is built-in and free on every tier. Floating a window explicitly with a rule is part of Window Rules and requires Pro.

Workspace renames

When you rename a named workspace in the Named Workspaces pane, window rules that target it by name are rewritten automatically, so you never have to fix rules after a rename.

Examples

windowRules:
  # Terminal with fixed width
  - match:
      appId: ^org\.wezfurlong\.wezterm$
    width: 80%

  # Firefox PiP as floating, away from the mouse
  - match:
      appId: firefox$
      title: ^Picture-in-Picture$
    floating:
      enabled: true
      avoidMouse: true
      sticky: true
      position: { x: 0%, y: 100% }
    width: 50%

  # Float a specific app window (shorthand)
  - match:
      appId: ^com\.apple\.finder$
      title: ^Copy$
    floating: true

  # Float with exact position
  - match:
      title: ^StatusBarServer$
    floating:
      enabled: true
      avoidMouse: true
      position:
        x: 10%
        y: 90%

  # Comms apps grouped in one tabbed column
  - match:
      appId: ^(com\.apple\.mail|com\.ferdium\.ferdium-app)$
    group:
      name: comms
      mode: tabbed

  # IDE on workspace 2, wide, preferred display
  - match:
      appId: ^com\.jetbrains\.intellij$
    workspace:
      name: 2
      preferredDisplay: [LG Ultrawide]
    width: 80%
💡 Comments and the GUI

Comments inside the windowRules array are removed when rules are edited through this pane; the GUI rewrites the block structurally (same for namedWorkspaces). Keep hand-written commentary above the array, or edit the YAML directly and hot-reload.