Back to home

Manual

Azimuth is a menu-bar window manager for macOS. It places, transforms, and moves the focused standard window predictably — using the keyboard, without scenes or automation.

Predictability over clever inference.

Requirements

Five things to know before using Azimuth.

Accessibility permission

Azimuth controls windows via the Accessibility API. Enable it in System Settings → Privacy & Security → Accessibility → toggle Azimuth on (macOS 10.13–12: System Preferences → Security & Privacy → Privacy → Accessibility). On first launch a brief guide appears from the menu bar item, linking straight to the right Settings pane when permission is missing.

Running Azimuth

Download the DMG from the releases page and drag Azimuth to Applications — no build tools required. The release is Developer ID–signed and notarized, so it opens without Gatekeeper warnings.

Target window

Azimuth operates on the focused window of the target app. Standard windows and dialogs are always accepted; any other window — including one whose type macOS does not report, as with some Java and Electron apps — is accepted when macOS says its position and size can both be changed. Full-screen spaces, minimized windows and windows that refuse to be moved or resized — sheets and panels, typically — are skipped with a clear failure message.

Target app policy

Commands act on the most recently active non-Azimuth app's focused window. Opening Azimuth's own Settings window does not change the target — your previous working app remains the target.

macOS version

Azimuth runs on macOS 13 (Ventura) or later. On macOS 10.13–12, use the legacy build (1.7.2 Legacy, link below): the same core features, no new ones, and after you upgrade to macOS 13 or later its next update check switches it to the regular version. Ventura no longer receives Apple security updates, so use the newest macOS your Mac supports.

Download the legacy build (1.7.2 Legacy) →

Feature summary

All implemented and planned capabilities, grouped by area.

Area Feature Status
App shell Menu-bar app + Dock hidden (release) + Settings window ✅
Permissions Accessibility status display, request, and Settings navigation ✅
Window identification Resolve the focused window (standard, dialog, or any window that reports itself movable and resizable); skip full-screen, minimized and unfocused ✅
Command Maximize to work area (or with uniform gaps) ✅
Command Absolute thirds (1/3): horizontal left/center/right · vertical top/middle/bottom ✅
Command Absolute two-thirds (2/3): horizontal left/right · vertical top/bottom ✅
Command Snap + throw to adjacent display (snapThrow, left/right/up/down) ✅
Command Move keep-size (left/right/up/down) · center ✅
Command Relative shrink 1/2 & 2/3 (left/right/up/down edge pinned) ✅
Command Move to next display (keep shape; moveToDisplay) ✅
Command Undo (1 step per window) ✅
Coordinates Multi-monitor support + position-aware adjacent display selection ✅
Input Global hotkeys (Carbon) · Standard / Vim presets ✅
Settings Preset selection / failure beep + notification toggles / launch at login ✅
Settings Per-command shortcut customization + conflict warnings ✅
Settings Command group on/off · per-command unbind · hide menu-bar icon ✅
Settings Updates: current version + Check for Updates… ✅
Settings Advanced tab: how long to wait for an unresponsive app (Quick 0.25s / Balanced 0.5s / Patient 1s) ✅
Updates Automatic updates (Sparkle): checks the appcast, verifies EdDSA + notarization, updates in place ✅
Stability AX messaging timeout · transient failure skip · permission cache hardening ✅
Planned Anchor: position current window relative to another window 🟡
Planned Scene save/restore, per-app default positions 🟡
Planned URL scheme / Shortcuts / per-app rules 🟡

Shortcuts — all 34 commands

Four modifier layers, each governing a distinct class of behavior. The layers never overlap.

⌃⌥
Halves (snap/throw) · Maximize · Center · Undo · Thirds & two-thirds (number keys)
⌃⌥⌘
Move (keep current size)
⌃⌥⇧
Relative shrink (1/2 against a pinned edge; 2/3 on ⌃⌥⇧ M , . /)
⌃⌥⌘⇧
Move to next display
Group Command Shortcut (Standard)
Halves (snap + throw) Left
⌃⌥←
Right
⌃⌥→
Top
⌃⌥↑
Bottom
⌃⌥↓
Maximize · Undo · Center Maximize
⌃⌥↩
Maximize with gaps
⌃⌥⇧↩
Undo
⌃⌥⌫
Center
⌃⌥C
Thirds (1/3) Horizontal: left · center · right
⌃⌥123
Vertical: top · middle · bottom
⌃⌥456
Two-thirds (2/3) Horizontal: left · right
⌃⌥78
Vertical: top · bottom
⌃⌥90
Move (keep size) Left · Right · Up · Down
⌃⌥⌘←→↑↓
Relative shrink (1/2) Left · Right · Up · Down
⌃⌥⇧←→↑↓
Relative shrink (2/3) Left · Down · Up · Right
⌃⌥⇧M,./
Move to next display Left · Right · Up · Down
⌃⌥⌘⇧←→↑↓
Vim preset: Only directional keys and Undo change. Directions become H (left) · L (right) · K (up) · J (down), Undo → U. Maximize, Center, and number shortcuts are identical.

Example: ⌃⌥H (snap left) · ⌃⌥⌘K (move up) · ⌃⌥⇧J (shrink down) · ⌃⌥⌘⇧L (move to right display) · ⌃⌥U (undo).
Running commands without shortcuts: In DEBUG builds, use the menu-bar icon → Window Commands (Debug) submenu to trigger any command directly. Settings (⌘,) has three tabs: General (permission status, failure beep and notification, launch at login, hiding the menu-bar icon, updates), Shortcuts (preset, per-command recording and Reset, group and per-command on/off) and Advanced (how long to wait for an unresponsive app). In the Shortcuts tab every group starts collapsed — open one with its disclosure triangle, or type in the filter and matching groups expand on their own.

All 34 key combinations are registered at launch. If a registration fails — because another app or macOS already holds that combination, or because the hotkey system could not start — Settings marks the row "In use by system" in Settings. Some combinations macOS reserves appear to register successfully and are swallowed before they reach Azimuth; Azimuth cannot tell those apart, so they show no badge and the shortcut simply does nothing. Either way, every shortcut can be remapped with the Settings recorder.

Command behavior

Precise description of what each command does — what changes, what stays the same, and what the edge cases are.

Maximize
⌃⌥↩

Fills the work area — the visible region excluding the menu bar and Dock. The window expands to use every pixel available without overlapping system chrome.

Maximize with gaps
⌃⌥⇧↩

Like Maximize, but leaves a uniform 12pt inset on all four sides so the window doesn't touch the screen edges — visual breathing room, tiling-friendly. Falls back to a plain maximize if the work area is too small for the gap.

Absolute thirds & two-thirds
⌃⌥1–0

Positions the window at an exact fraction of the work area. Axes are independent: a horizontal command only changes x/width; a vertical command only changes y/height. Compose freely — apply a horizontal third then a vertical third to land in any corner or center cell.

Snap + throw (halves)
⌃⌥←→↑↓

Two-stage behavior: if the window is not already in that half, it snaps there. If it is already in that half, it is thrown to the adjacent display in the same direction, landing in the opposite half (throw right → lands in the left half of the right display). If there is no adjacent display in that direction, the window stays put.

Move (keep size)
⌃⌥⌘←→↑↓

Nudges the window by exactly its own width (horizontal) or height (vertical), with no resize and no display change. Clamped at the work-area boundary — repeat presses push the window to the edge and keep it flush. A window that already sits off-screen past an edge is recovered into the work area, so a directional Move can pull it back onto the screen rather than push it further out. A window larger than the work area has no room to move on that axis, so it stays flush against that edge.

Center
⌃⌥C

Moves the window to the center of the work area without changing its size.

Relative shrink (1/2 · 2/3)
⌃⌥⇧←→↑↓
⌃⌥⇧M,./

Shrinks the window to 1/2 (arrows) or 2/3 (M , . / → left/down/up/right, like Vim HJKL) of its current size relative to a pinned edge — not the screen. The edge in the given direction is fixed; the opposite edge moves inward. Exact, repeatable, and composable: 2/3 then 1/2 lands on 1/3.

Move to next display
⌃⌥⌘⇧←→↑↓

Sends the window to the adjacent display in the given direction, keeping its relative position on the new screen — a centered window stays centered even at a different resolution. It keeps its exact pixel size if it fits; if it doesn't, both axes shrink by the same factor, so the shape (aspect ratio) is preserved. If there is no adjacent display in that direction, the window stays put.

Undo
⌃⌥⌫

Restores the window's previous frame — one step per window. History is discarded if the display configuration changes (e.g., a monitor is connected or disconnected), since absolute coordinates become invalid.

Failure feedback

When a command cannot complete, Azimuth plays a beep (configurable in Settings) and records the reason, which you can read in the menu bar item's menu. You can also opt in to a notification on failure. Transient failures — such as those caused by a Space transition or a window animation in progress — are silently skipped without a beep, since they self-resolve immediately. Two cases behave differently. If the command failed because Accessibility permission is missing, Azimuth opens the Settings window for you — once per launch, so it never becomes a nuisance. And if the target app took too long to answer, the reason reads "The app is taking too long to respond"; the Advanced tab decides how long Azimuth waits before giving up.

Note on size-increment apps (Terminal, etc.): Some apps constrain their window size to a character-grid increment. When Azimuth applies a half or maximize command, the result is rounded down to the nearest character cell, which may leave a sub-row gap at the edge. This is an app-level constraint and expected behavior. Similarly, the work area excludes the menu bar and Dock, so a gap at the screen edge is normal.

Roadmap

Planned work, in order of priority.

Stage Description Status
P8 / v1 Regression testing across representative apps (Finder / Safari / Terminal / VS Code / Xcode), failure case collection and stabilization — v1 release gate ✅ Shipped / stable
Hardening DisplayResolver: edge-based adjacency detection for asymmetric monitor layouts ⏸ Deferred
v1.5+ Anchor: snap or size-match the current window to another window on the same display 🟡
v2 Workspaces: per-app default positions, named scene save/restore, monitor-aware scenes 🟡
v3 Automation: URL scheme, AppleScript/Shortcuts actions, per-app rules, edge stash/pin 🟡
"Predictability over clever inference. Any effect achievable by composing simple commands is not added as a separate feature."