A lightweight, native macOS utility built with Swift & SwiftUI that lists every running user-facing app, lets you multi-select the ones you want gone, and force-quits them — or nukes everything except itself in a single click.
macOS's built-in Force Quit Applications panel (⌥⌘⎋) only quits one app at a time. When you have eight apps open and want to free up RAM quickly, you end up repeatedly opening the panel, picking, clicking "Force Quit", reopening, picking again...
SimpleManager fixes that. One window. Multi-select. One button. Done.
Stop closing apps one-by-one. Select. Quit. Move on.
| ✨ | Feature | What it does |
|---|---|---|
| ☑️ | Multi-select list | Check any number of running apps, then force-quit them all at once. |
| 💥 | Force Quit All | One click quits every running app except SimpleManager itself. |
| 🟢 | Live, auto-refreshing list | Watches NSWorkspace notifications — launch or quit an app and the list updates instantly. No manual refresh needed. |
| 🪶 | Graceful-then-force semantics | Each target gets a 2s graceful terminate() window (so apps can save work), then SIGKILL forces the rest. Best of both worlds. |
| 🚀 | Open / switch to an app | Click the inline open button on any row to activate that app without quitting it. |
| 🎯 | User-facing apps only | Shows the apps you actually think of as "running" — Dock / Command-Tab visible apps — never background daemons or login items. |
| 🛡️ | Self-protecting | SimpleManager never quits itself, even via "Force Quit All". |
| 🧬 | Brings-your-own-icon | Drop a 1024+px PNG at Sources/Assets/AppIcon.png; the build script auto-generates all 10 sizes and an .icns. |
List of running apps with the checkbox multi-select, live status pill, and progress bar at the top.
Add your own screenshots to
docs/screenshots/and link them here.
- macOS 14 (Sonoma) or newer
- Xcode 26 / Swift 6.2 toolchain
- No third-party dependencies — pure Swift Package
git clone https://github.com/aredtech/simple-manager.git
cd simple-manager
./Scripts/build_app.sh && open .build/app/SimpleManager.appThe first build compiles the release binary and assembles a real .app bundle at .build/app/SimpleManager.app. The icon is generated automatically from Sources/Assets/AppIcon.png.
swift run SimpleManager
⚠️ When run viaswift run, the bundle identifier is the test runner's, so self-exclusion won't kick in — SimpleManager may appear in its own list. Use the.appbundle (./Scripts/build_app.sh) for the real experience.
swift testTests cover the quit pipeline (graceful-then-force logic) and the self-exclusion helper.
./Scripts/release.sh 1.0.0Outputs a distributable DMG (with an /Applications symlink for drag-to-install) and a SHA-256 checksum to .build/dist/:
SimpleManager-v1.0.0.dmg
SimpleManager-v1.0.0.dmg.sha256
Only apps whose activationPolicy == .regular — the ones that show up in the Dock and the ⌘⇥ Application Switcher. Background daemons, login items, and menu-bar-only helpers are intentionally hidden, matching what users think of as "running apps."
For each selected app, SimpleManager runs a small pipeline:
terminate() ──wait 2s──▶ isTerminated?
├── yes → done (graceful)
└── no → forceTerminate() (SIGKILL)
Up to all selections run concurrently with a short overall timeout, and the UI shows a per-row "quitting…" spinner while each is in progress.
ProcessManager.runningApps() filters out any app whose bundleIdentifier matches Bundle.main.bundleIdentifier. In the bundle, that's com.novatra.simplemanager — so the nuke button can't nuke itself.
simple-manager/
├── Package.swift
├── Sources/
│ ├── Assets/
│ │ └── AppIcon.png # 1024+px source icon — replace with your own
│ └── SimpleManager/
│ ├── SimpleManagerApp.swift # @main SwiftUI app entry
│ ├── ContentView.swift # status bar + list + action bar
│ ├── AppRow.swift # single row: checkbox, icon, name, Open button
│ ├── AppViewModel.swift # ObservableObject, observers, selection state
│ ├── AppItem.swift # value type describing a running app
│ ├── ProcessManager.swift # wraps NSWorkspace for enumeration + quitting
│ ├── QuitPipeline.swift # graceful-then-force logic (testable)
│ └── SelfExclusion.swift # bundle-id self-exclusion helper
├── Tests/
│ └── SimpleManagerTests/
│ ├── SelfExclusionTests.swift
│ └── QuitPipelineTests.swift
├── Scripts/
│ ├── build_app.sh # swift build -c release + assemble .app bundle
│ └── make_icon_from_png.sh # PNG → iconset → .icns
└── docs/plans/ # design doc + implementation plan
SimpleManager uses a bring-your-own-icon workflow:
- Replace
Sources/Assets/AppIcon.pngwith any 1024×1024 (or larger) PNG. - Re-run
./Scripts/build_app.sh. - The script regenerates the
.iconset, buildsAppIcon.icns, and copies it into the bundle.
To force the Dock to refresh the icon cache:
killall Dock- Search / filter by app name
- Sort options (by name, by memory usage, by CPU)
- Menu-bar-only mode (
LSUIElement = true) - Confirmation dialog before "Force Quit All"
- Per-app memory footprint badge
- Saved quick-quit presets
Contributions welcome — see CONTRIBUTING below.
PRs are welcome. For anything larger than a typo fix:
- Open an issue describing the change first
- Fork the repo, branch from
main - Keep the design goals: single-window, no dependencies, no overreach (we don't quit background processes the user didn't launch)
- Add or update tests for any logic change
- Make sure
swift testand./Scripts/build_app.shboth succeed - Open a PR
Released under the MIT License. See LICENSE for the full text.
Built with SwiftUI on macOS. Not affiliated with Apple.
If SimpleManager saves you time, a ⭐ on GitHub is appreciated.