HyperSwitch, but µ. A tiny window switcher with live thumbnails for macOS and GNOME.
uSwitch is available as a native Swift app for macOS and a GNOME Shell extension for Linux.
- Live thumbnails of every window on the current Space or workspace.
- Every window gets its own tile, including multiple windows from the same app.
- Minimized windows stay visible — a compact icon + title strip under the active tiles; shown but skipped by the Tab cycle.
- All-Spaces overview — Option+Tab groups every window by Space (using WindowServer's per-Space lists, so no leftovers), with the current Space marked.
- Fast switching — a quick key flick can switch without flashing the popup (optional flick delay, off by default).
- Small and native — a Swift app on macOS and a GNOME Shell extension on Linux; no Electron.
- Doesn't leak Escape on macOS — global Cmd+Esc bindings (iTerm, etc.) keep working.
HyperSwitch set the bar for thumbnail-based window switching on macOS, but it is no longer maintained — it nags with a "Check for updates" prompt and crashes intermittently. AltTab is actively developed and far more configurable, but its key handling can conflict with terminal workflows that bind Cmd+Esc (lwouis/alt-tab-macos#1217).
uSwitch targets the narrow gap between them: HyperSwitch's switching model in a small, current implementation that leaves the rest of your key bindings alone. The GNOME extension brings the same window-first, thumbnail-based switching model to Linux instead of grouping windows by application.
brew install --cask nunoh/tap/uswitchOr grab the latest Apple Silicon .dmg from Releases, open it, and drag uSwitch.app into /Applications. A .zip is attached too, with a SHA256SUMS.txt and a build attestation. Or build from source.
macOS 13+. Release builds are self-signed and not notarized. Homebrew skips the Gatekeeper prompt; for a manual install, after the first blocked launch, open System Settings → Privacy & Security, scroll to Security, click Open Anyway, then confirm Open. Later launches work normally.
Managed Mac (corporate MDM): right-click → Open may be blocked. Instead, copy the .app via AirDrop, USB, or any means other than a browser download, then strip the quarantine flag before opening:
xattr -dr com.apple.quarantine /Applications/uSwitch.appNo admin rights needed. Gatekeeper only checks apps that carry the quarantine flag.
The extension supports GNOME Shell 48–50 and has been tested on Ubuntu 26.04 with GNOME Shell 50.1 on Wayland.
Clone the stable branch, then install and enable the extension:
git clone --branch main https://github.com/nunoh/uSwitch.git
cd uSwitch
make install-gnome-extension
gnome-extensions enable uswitch@nh.comAfter updating the extension, log out and back in so GNOME Shell loads the new code. Everything is installed for the current user; do not run these commands with sudo.
uSwitch needs two permissions:
- Accessibility — to capture Cmd+Tab before the system does.
- Screen Recording — to render window thumbnails.
On first launch a setup window lists both, with a button that opens the right pane of System Settings → Privacy & Security. It updates live: the switcher starts as soon as Accessibility is on, and a Restart uSwitch button appears once Screen Recording is on, since macOS applies that one after a restart.
| Key | Action |
|---|---|
| Cmd+Tab | Open switcher (current Space) / cycle forward |
| Cmd+Shift+Tab | Open switcher / cycle backward |
| Option+Tab | Open all-Spaces overview / cycle forward |
| Option+Shift+Tab | Overview / cycle backward |
| Fn (while open) | Step through minimized windows |
| Release Cmd or Option | Raise selected window |
| Esc | Cancel (swallowed — won't trigger system shortcuts) |
| Cmd+Q (while open) | Quit the selected app, stay in the switcher |
| Cmd+W (while open) | Close the selected window, stay in the switcher |
| Cmd+M (while open) | Minimize the selected window, stay in the switcher |
| Cmd+1…9 (while open) | Switch straight to that window of the current Space |
| S or Cmd+F (while open) | Toggle the all-Spaces overview on/off |
| Cmd+, (while open) | Open Settings |
These are the default bindings. Shift reverses the Tab cycle. Fn while the switcher is open steps through minimized windows; hold Fn to keep stepping, using your macOS keyboard repeat delay and speed. Cmd+Fn+Tab and Option+Fn+Tab open cycling through all windows. Shift+Tab alone never opens the switcher.
The menu bar icon has Settings…, Launch at Login, About, and Check for Updates… (plus Quit). Settings covers the two shortcuts, minimized-window behaviour, thumbnail size, overview scaling, the flick delay, and automatic updates. Sparkle checks daily and can download signed updates and install them when uSwitch quits. The update settings apply live.
| Key | Action |
|---|---|
| Alt+Tab or Super+Tab | Open switcher / cycle forward |
| Add Shift | Cycle backward |
| Release Alt or Super | Raise selected window |
| Esc | Cancel |
The extension replaces GNOME's application and window switchers so that every window appears as a separate tile. Only windows on the current workspace are shown.
make dev # debug build, signs with the local cert, runs in foreground
make bundle # release build into dist/uSwitch.app
make release # release build + versioned Apple Silicon zip
make dmg # release build + versioned Apple Silicon zip and dmg
make install # release build into /Applications and launchesLocal dev, bundle, and install builds use the stable self-signed certificate from scripts/setup-cert.sh, so permission grants persist across local rebuilds. Releases are signed with the same certificate in CI, so grants also persist across updates.
For GNOME extension development and debugging notes, see gnome-extension/DEVELOPING.md.
See SPEC.md for current behaviour. Out of scope for now: settings UI, custom hotkeys, per-app cycle, moving windows between Spaces.
The u is µ — it's HyperSwitch in a smaller package.
MIT. Not affiliated with HyperSwitch or Bahoom.