glzr-io/glazewm · critical

Accessibility permissions are not granted. In System…

Error message

Accessibility permissions are not granted. In System Preferences, go to Privacy & Security > Accessibility and enable GlazeWM.

What it means

On macOS, `start_wm` checks accessibility (AX) permissions before initializing the window manager. If `dispatcher.has_ax_permission(true)` returns false, GlazeWM cannot observe/control other windows, so it bails with instructions to grant permission in System Preferences.

Solutions

  1. Open System Settings > Privacy & Security > Accessibility and enable GlazeWM (and your terminal if launching from it)
  2. Re-add the binary after rebuilding/moving it (toggle off/on)
  3. Restart GlazeWM after granting permission
Defensive patterns

Strategy: validation

Validate before calling

let has_ax = dispatcher.has_ax_permission(true);
if !has_ax {
  eprintln!("Grant GlazeWM accessibility permissions in System Settings > Privacy & Security > Accessibility, then restart.");
  std::process::exit(1);
}

Try / catch

match start_wm() {
  Err(e) if e.to_string().contains("Accessibility permissions") => {
    eprintln!("Enable GlazeWM under Privacy & Security > Accessibility and retry.");
  }
  r => r?,
}

Prevention

When it happens

Trigger: Running GlazeWM on macOS the first time, or after the app binary changes and macOS revokes/reset accessibility grants; running via a path not present in the Accessibility allowlist.

Common situations: Fresh installs, moving or rebuilding the binary (its code signature/path changes), macOS updates resetting privacy permissions, or running under a terminal not itself granted accessibility.

Understand the failure class

Background: Permission denied / not authorized / 403 Forbidden: access-control rejections when the caller lacks the required role, grant, or ownership — this error's family across 18 libraries.


AI-assisted analysis of glzr-io/glazewm@5709ad0a3c (2026-09-08). Data as JSON: /api/errors/890dd3c543aa3691. Report an issue: GitHub.

Appendix: source

Thrown at packages/wm/src/main.rs:116

    rt.block_on(wm_cli::start(args))
  }
}

#[allow(clippy::too_many_lines)]
async fn start_wm(
  config_path: Option<PathBuf>,
  verbosity: Verbosity,
  dispatcher: &Dispatcher,
) -> anyhow::Result<()> {
  setup_logging(&verbosity)?;

  // Ensure that only one instance of the WM is running.
  let _single_instance = SingleInstance::new()?;

  #[cfg(target_os = "macos")]
  {
    if !dispatcher.has_ax_permission(true) {
      anyhow::bail!(
        "Accessibility permissions are not granted. In System Preferences, \
         go to Privacy & Security > Accessibility and enable GlazeWM."
      );
    }
  }

  // Parse and validate user config.
  let mut config = UserConfig::new(config_path)?;

  // Add application icon to system tray.
  let mut tray = SystemTray::new(&config.path, dispatcher.clone())?;

  let mut wm = WindowManager::new(&mut config, dispatcher.clone())?;

  let mut ipc_server = IpcServer::start().await?;

  // On Windows, start watcher process for restoring hidden windows on
  // crash. macOS' hidden windows are always accessible.

View on GitHub (pinned to 5709ad0a3c)