Skip to content
nunohPublic

About

Tiny window switcher with live thumbnails for macOS and GNOME. Native Swift app and GNOME Shell extension.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

uSwitch

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.

Features

  • 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.

Why?

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.

Install

macOS

brew install --cask nunoh/tap/uswitch

Or 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.app

No admin rights needed. Gatekeeper only checks apps that carry the quarantine flag.

GNOME

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.com

After 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.

First run on macOS

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.

Usage

macOS

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.

GNOME

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.

Build from source

macOS

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 launches

Local 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.

GNOME

For GNOME extension development and debugging notes, see gnome-extension/DEVELOPING.md.

Roadmap

See SPEC.md for current behaviour. Out of scope for now: settings UI, custom hotkeys, per-app cycle, moving windows between Spaces.

About the name

The u is µ — it's HyperSwitch in a smaller package.

License

MIT. Not affiliated with HyperSwitch or Bahoom.

About

Tiny window switcher with live thumbnails for macOS and GNOME. Native Swift app and GNOME Shell extension.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages