A minimal window switcher for macOS.
Hold a modifier and press Tab to cycle through individual windows, not apps. The selected window glows, everything else can dim, and windows that cover it step aside so you can see it. Nothing gets focus until you release the key, so your window order stays exactly as it was.
No Dock icon, no menu bar icon, no screen recording permission, and no work while idle.
- Per-window switching. One icon per window, most recently used first. Minimized windows are listed last and restore when chosen.
- Glow. An accent-colored outline around the selected window.
- Dim. Optional: darken every other window.
- Reveal. Windows covering the selection move aside while you cycle and return afterwards. Focus and stacking order never change.
- Native feel. A quick Cmd+Tab jumps to the previous window. Shift+Tab or the arrow keys go back. Esc cancels.
- Custom shortcut. Any modifier plus a key. The native Cmd+Tab switcher is turned off only while glint uses Cmd+Tab.
- Lightweight. About 24 MB of memory, 0% CPU when idle, and a bundle under 400 KB.
- macOS 14 or later
- Swift 6 toolchain (Xcode 16 or the Command Line Tools)
- The Accessibility permission
glint is distributed as source. Build and install it with:
git clone https://github.com/zlotny/glint.git
cd glint
scripts/make-cert.sh # once, see "Code signing" below
scripts/install.sh # builds, signs, and installs /Applications/glint.app
open /Applications/glint.appOn first launch glint asks for the Accessibility permission and adds itself as a login item.
macOS ties the Accessibility grant to the app's code signature. scripts/make-cert.sh creates a self-signed glint-dev code-signing certificate in your login keychain. Builds signed with it keep the grant across rebuilds. Without it, scripts/bundle.sh signs ad-hoc, and you need to grant Accessibility again after every build.
Use another identity with GLINT_SIGN_IDENTITY="Your Identity" scripts/install.sh.
| Keys | Action |
|---|---|
| Cmd+Tab | Open the switcher, move to the next window |
| Cmd+Shift+Tab, Left arrow | Previous window |
| Right arrow | Next window |
| Esc | Cancel |
| Release Cmd | Switch to the selected window |
Open glint again (Spotlight, Raycast, Finder, or open -a glint) to show the settings:
- Shortcut
- Glow (on by default)
- Dim other windows (off by default)
- Launch at login (on by default)
- Quit glint
Quitting glint turns the native Cmd+Tab switcher back on.
- Only windows on the current Space of each display are listed.
- Windows of hidden apps (Cmd+H) are not listed.
- Key events do not reach glint while Secure Input is active, for example in a password field.
- glint uses private macOS APIs (
CGSSetSymbolicHotKeyEnabled,_AXUIElementGetWindow). A future macOS release can break them. - If glint crashes while windows are moved aside, they stay at the screen corner. Move them back by hand.
swift build # debug build
scripts/test.sh # unit tests
scripts/bundle.sh # build/glint.app
build/glint.app/Contents/MacOS/glint # run with logs in the terminalSource layout:
| Path | Role |
|---|---|
Sources/glint/Hotkey/ |
Event tap, key state machine, native Cmd+Tab suppression |
Sources/glint/Windows/ |
Window enumeration, MRU order, focus, moving covering windows aside |
Sources/glint/UI/ |
Chooser panel, glow and dim overlays, settings window |
Sources/glint/Support/ |
Coordinate conversion, settings storage |
Tests/glintTests/ |
Unit tests for the pure logic |