# Uninstally: a native macOS uninstaller that traces leftover files by bundle identifier

> Uninstally is a SwiftUI macOS app and Finder extension that removes applications together with the caches, preferences, containers and logs they leave behind. It is MIT licensed, installs from a Homebrew cask or a DMG, and stores its history locally with SwiftData.

**gostonx/uninstally** — A clean, native macOS uninstaller. Completely removes apps and every file they leave behind using smart bundle-identifier detection. SwiftUI + Finder extension.

- Repository: https://github.com/gostonx/uninstally
- Stars: 730 · Forks: 26
- Language: Swift
- License: MIT
- Published: 2026-09-17 · Updated: 2026-09-17 · Language: en
- Canonical page: https://hysenlabs.com/projects/gostonx-uninstally

## The problem Uninstally targets on macOS

Dragging an application to the Trash removes the bundle and nothing else. The README lists where the rest goes: preferences under ~/Library/Preferences, caches under ~/Library/Caches, plus containers, logs and saved state. None of those directories are indexed by application name in a way Finder exposes, so the leftovers sit there until someone goes looking.

Uninstally is aimed at that gap. It is a native SwiftUI app for macOS 14 or later, distributed as a Homebrew cask or a DMG, with a Finder extension that adds an Uninstall with Uninstally item to the context menu of any .app bundle. The audience is a single Mac user who installs and removes a lot of software and wants to see what is about to be deleted rather than trusting a script. It is not a fleet tool and the README does not present it as one.

The README also documents a second job: listing Homebrew casks and formulae and uninstalling them from the same window. That matters because Homebrew installs live outside /Applications and a Trash-based workflow never touches them.

## How bundle-identifier scanning decides what to delete

The mechanism the README describes is bundle identifier matching. Every macOS application bundle carries a reverse-DNS identifier, and the system uses that same string to name many of the files it creates: a preferences plist, a cache directory, a container folder. Uninstally reads the identifier from the app bundle, then scans known library locations for entries that match it.

The README is explicit that this is a review step, not an automatic purge: "Uninstally scans for every file linked to an application using its bundle identifier, then lets you review what was found before anything is removed." The confirmation screen shows each file with a match reason, and the troubleshooting section tells you to review that reason and deselect anything you want to keep.

That design has a known failure direction, and the README names it: a leftover scan can find too many items. Identifier matching is a heuristic. Apps that share a vendor prefix, or files named after a company rather than a specific product, can be pulled into the candidate list. The mitigation is human, not algorithmic, which is why the review screen exists at all.

Two supporting features sit on the same data. A leftover scanner finds orphaned files from apps deleted manually, and Recently Uninstalled keeps a record so a removal can be reversed. That history is stored locally with SwiftData, and the README states there are no analytics, no accounts and no network calls for scanning.

## Installing Uninstally with Homebrew and running a first uninstall

The README gives Homebrew as the primary install path. The first command pulls the cask from the maintainer's tap:

```bash
brew install --cask gostonx/tap/uninstally
```

Homebrew asks you to trust gostonx/tap the first time. The README notes that tap trust is system-wide, so an untrusted tap anywhere on the machine can make brew ignore all taps and fail without naming the culprit. `brew trust gostonx/tap` resolves it for this tap.

If you prefer not to use Homebrew, the README points to the latest DMG under Releases: open it and drag Uninstally into Applications. The Finder extension is off by default. Enable it in System Settings, then General, then Login Items & Extensions, then Finder Extensions. The README says to restart Finder if the menu item does not appear, using Option-right-click on the Finder icon and Relaunch.

With the extension enabled, right-click any .app bundle and choose Uninstall with Uninstally. The app opens on the confirmation screen with the matched files listed. Deselect anything you want to keep, then confirm. If you want the scan to reach protected locations such as /Library, grant Full Disk Access in System Settings under Privacy & Security first; the README lists that as a requirement for those paths, not a default.

To remove Uninstally itself later, the README offers a zap variant that also clears its own files:

```bash
brew uninstall --cask --zap uninstally
```

## Where Uninstally is the wrong tool

Three limits follow from what the README does and does not describe.

First, it is macOS 14 or later only. There is no Windows or Linux build, and no mention of a version for older macOS releases. If your estate includes machines below that cutoff, this app cannot be part of the answer.

Second, there is no command line interface in the documented surface. The README documents a GUI, a Finder extension, a Homebrew cask for installation, and an Xcode build. Nothing describes a CLI subcommand for scripted removal. A configuration management run or a shell script that needs to uninstall an app unattended has nothing to call here.

Third, the identifier heuristic will occasionally be wrong in both directions. The README's own troubleshooting entry for an over-broad leftover scan is the honest admission: you are expected to read the match reason and deselect. That is fine for one person at one Mac. It is a poor fit when nobody is watching the confirmation screen, because the safety mechanism is the human review, not the matcher.

There is also a build-path caveat for anyone compiling from source. The README states that Sparkle updates require a valid appcast and an EdDSA key, documented in docs/UPDATES.md. A locally built copy will not carry the distribution signing setup by default.

## Uninstally compared with AppCleaner and with brew uninstall

The closest comparison is AppCleaner, a long-standing free macOS app that also searches for related files when you drop an application onto it. The approach is the same idea: find the bundle, look for associated files, show a list. The difference in Uninstally is the integration surface. Uninstally ships a Finder extension so the action starts from the context menu on the bundle itself, and it adds Homebrew package management in the same window, so casks and formulae are handled alongside /Applications bundles. AppCleaner's documented scope is the drag-and-drop cleanup flow; it does not present itself as a Homebrew front end.

The second comparison is Homebrew itself. `brew uninstall --cask` removes what Homebrew installed and tracks, and the README shows Uninstally wrapping that with a zap option for its own cask. The difference is coverage: Homebrew only knows about packages it installed. An app you dragged in from a DMG, or one installed by a vendor installer, is invisible to brew and is exactly the case Uninstally's identifier scan is built for. The reverse also holds: for anything Homebrew manages, brew's own record is more precise than a filename heuristic, and Uninstally's Homebrew tab is a convenience over that record rather than a replacement for it.

## Licence, releases and the cost of keeping up

Uninstally is MIT licensed, per the repository's licence file. That is a permissive licence: you can read the source, build it, and ship modified versions, provided the copyright notice and permission notice are retained. It says nothing about warranty, and the README's Security section directs vulnerability reports to the project's security policy rather than to a commercial support channel. This is not legal advice; if you plan to redistribute a modified build, read the LICENSE file and your own obligations.

The release cadence is visible in the repository: v1.7.1, v1.7.2 and v1.7.3 all landed on 2026-07-10, and the most recent push to main was on 2026-07-13. Three patch releases in one day suggests small fixes rather than a slow-moving project, but it also means version numbers move quickly and a pinned build can age out of the update channel.

Upgrade cost is low if you installed through Homebrew, since the README gives the upgrade command directly:

```bash
brew upgrade --cask uninstally
```

If you built from source instead, you own the update path. The README notes that Sparkle updates require a valid appcast and an EdDSA key, so a self-built copy needs that configuration before automatic updates will work at all. Budget for re-checking the Finder extension after a macOS upgrade, since extensions can be disabled by the system and the README's first troubleshooting entry is exactly that.

## Conclusion

Adopt Uninstally if you are on macOS 14 or later and want a reviewable list of leftover files before deletion, plus Finder right-click removal. Skip it if you need cross-platform cleanup, a CLI, or MDM-scale fleet removal: the README describes a GUI app with a Finder extension, no command line tool. Before trusting it on a work machine, verify that the Finder extension appears under Login Items & Extensions, check whether Full Disk Access is needed for the paths you care about, and read the confirmation screen's match reason for each file.

## FAQ

### What is an uninstaller?

In this context it is a utility that removes an application along with the files it created, rather than only the app bundle. Uninstally does that by scanning for files linked to the app's bundle identifier and letting you review them before removal.

### How do I uninstall and install Uninstally again?

Uninstall the cask with `brew uninstall --cask uninstally`, or use `brew uninstall --cask --zap uninstally` to clear its own leftover files too. Reinstall with `brew install --cask gostonx/tap/uninstally`, or download the latest DMG from Releases and drag Uninstally into Applications.

### How do I stop an uninstallation in Uninstally?

The README describes a confirmation screen that lists every matched file before anything is removed, with a match reason for each item, and says you can deselect anything you want to keep. Declining to confirm at that screen is the documented way to stop the removal.

### Is there an app that deletes apps on macOS?

Uninstally is one: a native SwiftUI app for macOS 14 or later that removes applications and their leftover caches, preferences, containers and logs. It also adds an Uninstall with Uninstally item to the Finder right-click menu once the Finder extension is enabled.

### How do I install and uninstall YouTube apps with Uninstally?

The README does not name YouTube or any specific app. The documented flow is generic: right-click any .app bundle and choose Uninstall with Uninstally, or select the app in the browser view, then review the matched files on the confirmation screen before confirming.

## Sources

- [gostonx/uninstally on GitHub](https://github.com/gostonx/uninstally)
- [Issues](https://github.com/gostonx/uninstally/issues)
- [License: MIT](https://github.com/gostonx/uninstally/blob/main/LICENSE)
- [README](https://github.com/gostonx/uninstally/blob/main/README.md)
- [Releases](https://github.com/gostonx/uninstally/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/gostonx-uninstally
