Skip to content

aredtech/simple-manager

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SimpleManager icon

SimpleManager

Force-quit multiple macOS apps in one click

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.

Swift macOS License Build


Why SimpleManager

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.


Features

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.

Screenshots

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.


Build & Run

Prerequisites

  • macOS 14 (Sonoma) or newer
  • Xcode 26 / Swift 6.2 toolchain
  • No third-party dependencies — pure Swift Package

Quick start

git clone https://github.com/aredtech/simple-manager.git
cd simple-manager
./Scripts/build_app.sh && open .build/app/SimpleManager.app

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

Run from source (no bundle)

swift run SimpleManager

⚠️ When run via swift 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 .app bundle (./Scripts/build_app.sh) for the real experience.

Run the tests

swift test

Tests cover the quit pipeline (graceful-then-force logic) and the self-exclusion helper.

Build a release DMG

./Scripts/release.sh 1.0.0

Outputs 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

How it works

What gets listed

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

Quit semantics

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.

Self-protection

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.


Project structure

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

Customizing the app icon

SimpleManager uses a bring-your-own-icon workflow:

  1. Replace Sources/Assets/AppIcon.png with any 1024×1024 (or larger) PNG.
  2. Re-run ./Scripts/build_app.sh.
  3. The script regenerates the .iconset, builds AppIcon.icns, and copies it into the bundle.

To force the Dock to refresh the icon cache:

killall Dock

Roadmap

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


Contributing

PRs are welcome. For anything larger than a typo fix:

  1. Open an issue describing the change first
  2. Fork the repo, branch from main
  3. Keep the design goals: single-window, no dependencies, no overreach (we don't quit background processes the user didn't launch)
  4. Add or update tests for any logic change
  5. Make sure swift test and ./Scripts/build_app.sh both succeed
  6. Open a PR

License

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.

About

A native macOS SwiftUI utility to force-quit multiple running apps in one click. Multi-select apps, force-quit them together, or nuke everything except itself. Graceful-then-force quit semantics with live auto-refresh.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Contributors