Kick

See what holds your disk. Then eject it safely.

"The disk wasn't ejected because one or more programs may be using it." macOS says this and stops. Kick keeps asking: which app, which file, which folder. Then one button asks those apps to quit, checks the disk again, and ejects it. No force unmount, no instant kill. Free and open source.

macOS 14+ · Apple Silicon and Intel · Developer ID signed + notarized · MIT license · Türkçe

Kick
KickExternal disks, explained.
345-BACKUP2 TB · ExFAT
✓
!
2 apps or services are using this diskReview what Kick can quit before you continue.
P
PreviewIt has one item open on this disk.→ Kick will ask this app to quit.
>_
zshStarted from TerminalIts current folder is on this disk.! Change the terminal folder or close its window.Show TerminalStop…
SafelyKick
Check Again

Two blockers: Kick asks Preview to quit and tells you to change the Terminal folder. Stop is the last resort.

It names the cause

Not "a program", but which program, which file, which folder. App name and icon, the app that started it ("Started from Terminal"), PID, and the open paths. APFS and exFAT volumes on the same drive show as one disk.

It asks politely

Safely Kick asks normal Mac apps to quit, and only when they read from the disk. It is the same as Quit in the app menu. The app can still show its save dialog. Then Kick checks the disk again and ejects it when it is clear.

Clear, not forceful

Writers, backups, sync tools, virtual machines, terminals, and macOS processes are never touched on their own. Kick tells you the step to take. For a stubborn one there is Stop: you choose, you confirm, Kick sends one polite stop request.

Free, open, honest

MIT license. No ads, no account, no "Pro". Developer ID signed and notarized by Apple. What it does is below and in the source code.

How it works

Kick first sends the normal macOS eject command, the same as the ⏏ button in Finder. A clean disk ejects right away. When macOS returns a "busy" error, Kick runs lsof and finds every process with an open file or current folder on that disk. It matches each one with its app name, the app that started it, its PID, and its start time.

Safely Kick sends a normal quit request only to eligible apps, waits a few seconds, scans the disk again, and retries the eject only when nothing remains. Before each eject it checks the physical identity of the disk again (IOKit registry entry, media and volume UUIDs, mount paths). A different disk at the same path is never ejected by mistake.

Stop is a separate button and the last stage. You pick one process, Kick shows what will happen and any risk, and you confirm. Kick takes a fresh snapshot, confirms that the same process still holds the disk, and sends one request: a normal quit for an app, or one SIGTERM for a command-line tool. If the process ignores it, the disk stays mounted and Kick shows what is still open.

Details: README — How it works

Plain rules

Release notes

v1.0.0current

  • First release: lists external disks, tries the normal eject, shows each blocking process with its name, icon, owning app, PID, and open paths.
  • Safely Kick: polite quit requests to eligible apps, recheck, safe eject. Disk and process identity checks.
  • Show: brings the owning app (for example Terminal) to the front. Stop: last resort, confirmed, one request, never SIGKILL.
  • Universal binary (Apple Silicon + Intel), macOS 14+. Developer ID signed, notarized by Apple.

Install

  1. Download Kick-1.0.0-macOS.zip (mirror: site copy), unzip, move Kick.app to Applications.
  2. Open it. The app is notarized by Apple and opens without warnings.
  3. Pick your disk, press Eject. If macOS refuses, Kick shows the reason and the next step.

Build from source:

git clone https://github.com/ofbakirci/kick
cd kick
swift test --disable-sandbox
./script/build_and_run.sh        # dist/Kick.app

SHA-256 checksums: SHA256SUMS