A macOS menu-bar utility that replaces the native app switcher with a richer overlay showing open windows and their individual browser/editor tabs.
- Global hotkey — Option+Tab (default), Cmd+Tab (opt-in), or any custom shortcut you record
- Quick-switch mode — hold the modifier and press Tab to cycle, release to switch (just like native Cmd+Tab)
- Search mode — tap the hotkey and release immediately to type-filter windows and tabs by name or URL
- Tab expansion — view every open tab inside supported browsers and editors, and switch directly to any tab
- Cross-space windows — lists windows from all desktops/Spaces
- Tab prefetching — tabs are fetched in the background as soon as the switcher opens
- Switcher position — place the panel on the left, center, or right of your screen
- Menu bar icon — choose from several icon styles for the menu bar item
- Launch at login — optionally start TabBuddy automatically on login
- Menu bar only — no Dock icon, lives quietly in your menu bar
| Browser | Tab Method |
|---|---|
| Safari | AppleScript |
| Google Chrome | AppleScript |
| Brave Browser | AppleScript |
| Microsoft Edge | AppleScript |
| Arc | AppleScript |
| Orion | AppleScript |
| Vivaldi | AppleScript |
| Opera | AppleScript |
| Chromium | AppleScript |
| Helium | AppleScript |
| Comet (Perplexity) | AppleScript |
| Dia | AppleScript |
| Firefox | Accessibility API |
| Zen Browser | Accessibility API |
| Editor | Tab Method |
|---|---|
| Xcode | Accessibility API |
| Visual Studio Code | Accessibility API |
| VSCodium | Accessibility API |
| Cursor | Accessibility API |
These apps expose tabs natively and are supported out of the box:
| App | Tab Method |
|---|---|
| Finder | Accessibility API |
| Terminal | Accessibility API |
| Preview | Accessibility API |
| Fork | Accessibility API |
| Figma | Accessibility API |
| Notion | Accessibility API |
| Key | Action |
|---|---|
| Option+Tab (default) / Cmd+Tab / custom | Open or cycle the switcher |
| Tab (modifier held) | Cycle to next window |
| ↑ / ↓ | Navigate window list |
| Return | Activate selected window/tab |
| Escape | Dismiss the switcher |
TabBuddy requires these macOS permissions to function:
| Permission | Purpose |
|---|---|
| Accessibility | Global hotkey interception and window/tab enumeration via the Accessibility API |
| Automation | AppleScript-based tab fetching for Safari and Chromium browsers |
Note: The App Sandbox must be disabled. TabBuddy relies on CGEvent taps and AX APIs that are blocked inside a sandbox.
On first launch, TabBuddy will prompt for Accessibility access. You can also grant it manually in System Settings → Privacy & Security → Accessibility.
Automation permissions are requested per-app the first time TabBuddy reads tabs from a browser via AppleScript.
- Window discovery — combines the Accessibility API (current Space) with CGWindowList (all Spaces) into a merged, deduplicated list
- Tab fetching — Safari and Chromium browsers use in-process
NSAppleScript; Firefox-based browsers and code editors use the macOS Accessibility tree with multi-strategy traversal (AXTabGroup → AXToolbar → AXList → brute-force scan) - Tab scoring — for editors, each candidate tab group is scored by file-extension matches to distinguish the editor tab bar from sidebars/panels
- Activation — AX-based tabs are activated via
AXPressAction; AppleScript tabs viaset current tab/set active tab index
Requires Xcode 26+ and macOS 26.2+.
git clone https://github.com/Yoliani/TabBuddy.git
cd TabBuddy
open TabBuddy.xcodeproj- In Xcode, open TabBuddy → Signing & Capabilities and select your Apple Developer team. Xcode will write your Team ID to
project.pbxprojlocally — do not commit that change. - Make sure App Sandbox is disabled (it already is in this project).
- Build and run the
TabBuddyscheme.
Sparkle is integrated for in-app updates via the menu bar item Check for Updates....
Before shipping updates, set these target build settings for both Debug and Release:
SPARKLE_FEED_URL→ your hosted appcast URL (for examplehttps://your-domain.com/appcast.xml)SPARKLE_PUBLIC_ED_KEY→ your Sparkle EdDSA public key
Until both keys are configured, the app keeps Sparkle disabled and the update menu item is unavailable.
MIT
