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
- Open System Settings > Privacy & Security > Accessibility and enable GlazeWM (and your terminal if launching from it)
- Re-add the binary after rebuilding/moving it (toggle off/on)
- 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
- Prompt users for accessibility permission on first macOS launch
- Re-request the permission prompt after binary rebuilds or moves
- Document the requirement in install instructions and preflight-check at startup
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)