TabMedic is a lightweight macOS window switcher built with SwiftUI and AppKit.
It enumerates windows via yabai -m query --windows, shows each window as its own row using the reported app name and title, and uses Accessibility APIs to raise and focus the chosen window.
- macOS 14.0+
- Xcode 15+
yabaiinstalled and running- Accessibility permission for exact window focusing
The default global shortcut is Command + Shift + Space.
Change it in TabMedic/Models/Shortcut.swift.
TabMedic requires yabai for discovery and requests Accessibility permission for exact window focusing.
Without Accessibility permission:
- the permission explanation overlay is shown
- exact window activation is unavailable
- the app fails gracefully instead of activating the wrong window
TabMedic/TabMedicApp.swift: SwiftUI entry pointTabMedic/AppDelegate.swift: startup wiringTabMedic/Models: data models and shortcut definitionTabMedic/Services: hotkey, panel, discovery, activation, permissionsTabMedic/ViewModels: overlay state and filtering logicTabMedic/Views: SwiftUI overlay and onboarding UI
To create a local DMG installer like Juggler:
chmod +x scripts/build-installer.sh
./scripts/build-installer.shThe script builds a Release app and writes these files:
build/TabMedic-v<version>.dmgbuild/TabMedic.dmg
Open the DMG and drag TabMedic.app into Applications.
The generated installer is intended for local use on your Mac. If you want to distribute it to other Macs without Gatekeeper warnings, add Developer ID signing and notarization.
This repository includes a GitHub Actions workflow that builds the DMG and attaches it to a GitHub Release.
- Push your code to GitHub.
- Create and push a version tag that matches the app version, for example:
git tag v1.0
git push origin v1.0- GitHub Actions runs
.github/workflows/release.ymlon that tag. - The workflow builds these release assets:
TabMedic-v<version>.dmgTabMedic.dmg
- Users can download the DMG from the repository's Releases page.
You can also run the workflow manually from the Actions tab by providing an existing tag.
If the release upload fails with a permissions error, set the repository's Actions workflow permissions to allow read and write access for GITHUB_TOKEN.
The published DMG is still unsigned and not notarized. People can download it from GitHub, but Gatekeeper will warn until you add Developer ID signing and Apple notarization.
- Open
TabMedic.xcodeprojin Xcode. - Build and run the
TabMedicscheme. - Grant Accessibility access when prompted.
- Press
Command + Shift + Spaceto open the switcher.
- Discovery depends on
yabaireturning JSON foryabai -m query --windows. - Exact window activation still matches Accessibility windows by title and bounds.
- Duplicate-titled windows can still be ambiguous in some apps.