How to Uninstall Apps on Mac Completely (Including All Leftover Files)
The Silo Team · 7 min read · Updated September 27, 2026
Dragging to Trash Is Not Enough
When you drag an app from Applications to Trash, you delete only the .app bundle. Every other file the app created — preference files, Application Support data, launch agents, crash logs, containers — remains on your disk indefinitely.
For a large app like Slack or Docker Desktop, this leftover can be 2–5 GB. For a suite like Adobe Creative Cloud, it can exceed 20 GB.
The 14 Locations MacPilot Scans
MacPilot's Symlink-Safe Remnant Hunter checks all these locations for files matching the app's bundle ID:
~/Library/Application Support/~/Library/Preferences/~/Library/Caches/~/Library/Containers/(sandboxed apps)~/Library/Group Containers/~/Library/Logs/~/Library/Saved Application State/~/Library/LaunchAgents/~/Library/WebKit//Library/Application Support/(system-level)/Library/LaunchAgents//Library/LaunchDaemons//Library/Receipts//Library/PrivilegedHelperTools/
The Symlink Problem (Why Other Tools Freeze)
~/Library/Containers/ contains symbolic links — directory entries that point to other locations. Apps like Electron tools create deep symlink trees. Naively traversing this directory with find or a recursive file enumerator will follow symlinks indefinitely, causing the scan to hang for minutes or freeze entirely.
MacPilot solves this using URLResourceKey.isSymbolicLinkKey to detect symlinks before traversal. When a symlink is found, it calls enumerator.skipDescendants() immediately — completing the full scan in under 200 milliseconds.
Before Deletion: Terminate the App and Its Helpers
Some apps (particularly commercial software with license managers) run background helper processes even when the main app is closed. MacPilot's pre-flight process guard:
- Checks
NSRunningApplication.runningApplications(withBundleIdentifier:) - Checks for background helpers via
pgrep - Sends graceful
terminate()notifications - Escalates to
SIGKILLonly if needed after a timeout
Manual Uninstall Without MacPilot
# Replace com.example.MyApp with the actual bundle ID
BUNDLE_ID="com.example.MyApp"
# Find all related files
find ~/Library -name "*${BUNDLE_ID}*" -type f 2>/dev/null
find /Library -name "*${BUNDLE_ID}*" -type f 2>/dev/null
# Unload and remove LaunchAgents
launchctl unload ~/Library/LaunchAgents/${BUNDLE_ID}.plist 2>/dev/null
rm ~/Library/LaunchAgents/${BUNDLE_ID}.plist 2>/dev/null