TabLift is a lightweight macOS utility that restores minimized apps instantly when switching with ⌘+Tab
or ⌘+`
.
By default, macOS ignores minimized windows unless you hold the Option
key.
TabLift fixes this behavior, making app switching intuitive and seamless — no extra keys needed.
⌘ + Tab
or ⌘ + `
TabLift uses public Apple APIs to monitor when you activate a different app (via NSWorkspace
notifications).
As soon as an app is activated, TabLift checks for minimized windows via the Accessibility API (AXUIElement
).
If a minimized window is found, it is instantly restored for you, either restoring all or just the most recently minimized window (configurable).
Technical flow:
AppMonitor.swift
listens for app activation events.WindowManager.swift
inspects the app's window list. If any window is minimized, it sets the AXMinimized
attribute to false
. The behavior (restore all or just the latest) is determined by a global toggle.MenuBarManager.swift
provides a menu bar icon and popover with a quick settings toggle, open settings, and quit.PermissionsService.swift
prompts you to grant Accessibility permissions, which are required for window management.SettingsView.swift
(tabbed, includes About tab) provides quick links and info, including clickable version and license links, and toggles for behavior and launch at login.git clone https://github.com/turtle-key/TabLift.git
cd TabLift
open TabLift.xcodeproj
Then build and run in Xcode.
You'll be prompted to grant Accessibility permission.
The website sources are in the website/
folder, powered by SvelteKit.
To run locally:
cd website
npm install
npm run dev
TabLift needs Accessibility Access to restore minimized windows.
You'll be prompted on first launch, or you can enable it manually:
System Settings → Privacy & Security → Accessibility → Enable TabLift
TabLift has a simple, modern Settings/About window with helpful links:
Know more about TabLift • Buy me a coffee • Source code on GitHub • Email support
TabLift/
├── Sources/
│ ├── TabLiftApp.swift // Main app entry point and delegate
│ ├── AppMonitor.swift // Listens for app switch events
│ ├── WindowManager.swift // Restores minimized windows (all or last, toggleable)
│ ├── MenuBarManager.swift // Manages menu bar icon, popover, and quick toggles
│ ├── PermissionsService.swift // Handles Accessibility permissions
│ ├── SettingsView.swift // Tabbed Settings & About window (SwiftUI)
│ ├── AccessibilityPermissionWindow.swift // UI for requesting permissions
│ └── ... // Other supporting Swift files
├── website/ // SvelteKit-powered website
│ ├── src/
│ ├── static/
│ ├── package.json
│ └── ... (SvelteKit structure)
├── Images/
│ ├── banner.png
│ ├── banner-wbg.png
│ └── app-screenshot.png
├── Assets.xcassets/
├── Info.plist
├── Sparkle/ // Update framework
└── TabLift.xcodeproj
Component | Technology |
---|---|
macOS App Language | Swift |
macOS UI Frameworks | SwiftUI (Settings/About window), AppKit (core) |
macOS APIs Used | Accessibility API (AXUIElement ), NSWorkspace |
Platform | macOS 13.0 Ventura and later |
macOS Packaging | .app bundle (no kernel extensions) |
Website Framework | SvelteKit (Svelte, TypeScript, Vite) |
Website Styling | CSS, HTML5 |
Website Hosting | Static (exportable, deploy anywhere) |
Other | Open Graph, Twitter Cards, SEO meta, robots.txt |
Pull requests are welcome!
If you have suggestions, bug reports, or want to help improve TabLift:
git checkout -b feature/your-feature-name
MIT License
© Mihai-Eduard Ghețu – See LICENSE
for details.
Built for macOS power users frustrated with Apple's default app switching.
Thanks to the accessibility community and everyone who contributed feedback(the voices in my head).
TabLift – Lift your windows. Free your workflow.