Skip to content

feat: add app uninstaller#32

Closed
zeck00 wants to merge 2 commits intomomenbasel:mainfrom
zeck00:feat/app-uninstaller
Closed

feat: add app uninstaller#32
zeck00 wants to merge 2 commits intomomenbasel:mainfrom
zeck00:feat/app-uninstaller

Conversation

@zeck00
Copy link
Copy Markdown

@zeck00 zeck00 commented Apr 14, 2026

Summary

Adds an App Uninstaller feature that lets users remove apps along with all their stray data in one click. I always found it annoying that macOS leaves behind prefs, caches, and containers when you drag an app to trash — this fixes that.

  • Scans /Applications and ~/Applications for installed apps
  • For each app, finds associated files by bundle identifier across ~/Library (Preferences, Caches, Application Support, Containers, Saved State, Logs, WebKit, Group Containers, etc.)
  • Shows app icon, name, bundle ID, total size, and expandable list of associated files
  • Search/filter apps by name or bundle ID
  • Hover-to-reveal uninstall button with confirmation dialog
  • Reveal-in-Finder for individual associated files
  • System apps (Safari, Finder, App Store, Terminal, Xcode) are protected and excluded

Note: This PR builds on #31 (UI overhaul) since it uses the redesigned sidebar and button components. Can be reviewed independently but merges cleanly after #31.

Test plan

  • Click "App Uninstaller" in sidebar — verify app list loads
  • Search for an app by name — verify filtering works
  • Expand an app row — verify associated files are listed with correct paths
  • Click reveal-in-Finder on an associated file — verify it opens in Finder
  • Uninstall a test app — verify app + associated files are removed
  • Verify system apps don't appear in the list

zeck00 and others added 2 commits April 15, 2026 00:50
- Add adaptive color system with light/dark mode support using NSColor appearance callbacks
- Add appearance picker (System/Light/Dark) in Settings
- Redesign sidebar with selection indicator bars, tinted icon backgrounds, and Smart Scan card
- Redesign SmartScanView with thicker progress rings, staggered live results, and junk breakdown bar
- Redesign Settings with native grouped Form layout and section icons
- Replace heavy gradients with solid colors and subtle borders throughout
- Add custom app icon from logo.png with proper rounded-rect background
- Add SidebarLogo image asset for branding
- Reduce glow and shadow intensity for a cleaner look
- Bump version to 1.1.0 (build 4)
- Update localization strings for zh-Hans and zh-Hant

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add InstalledApp and AssociatedFile models for app metadata
- Add scanInstalledApps() in ScanEngine to discover apps in /Applications
- Find associated files across ~/Library (Preferences, Caches, Application Support, Containers, Saved State, Logs, WebKit, HTTPStorages, Group Containers)
- Add AppUninstallerView with search, expandable associated files, reveal-in-Finder, and confirmation dialog
- Add uninstallApp() in AppViewModel with progress tracking
- Protected system apps (Safari, Finder, App Store, etc.) are excluded
- Integrated into sidebar under Cleaning section

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@zeck00 zeck00 force-pushed the feat/app-uninstaller branch from 8869c63 to fb9e5c3 Compare April 14, 2026 20:53
@zeck00
Copy link
Copy Markdown
Author

zeck00 commented Apr 14, 2026

App Uninstaller Sidebar icon:
image
App Uninstaller Tab:
image

@momenbasel
Copy link
Copy Markdown
Owner

Hey @zeck00, another great PR! The app uninstaller was definitely the most-requested feature.

v2.0 shipped with an app uninstaller that uses a more advanced heuristic matching engine (AppPathFinder) with 10-level matching - bundle ID, company name extraction, entitlements, team identifier, Spotlight supplemental search, container discovery, etc. It also has 25 per-app condition rules for edge cases (Xcode, Chrome, VS Code, Firefox, etc.).

Your system app protection idea was excellent though - we adopted your protectedBundleIDs approach and expanded the list to cover more Apple apps. Great thinking on that safety feature.

The hover-to-reveal uninstall UX from your PR is a nice touch too. If you'd like to contribute that interaction pattern to the v2 AppFilesView, we'd welcome it.

Thanks for all the work you've put into these PRs!

momenbasel added a commit that referenced this pull request Apr 14, 2026
Inspired by community PRs #29, #30, #32, #33:

- Onboarding: 3-page welcome flow (Welcome, FDA setup, Ready)
  Shows only on first launch via @AppStorage
  Polls FDA status every second with live UI update
- Search: .searchable() in CategoryDetailView for filtering files
- Confirmation: .confirmationDialog before all destructive operations
- Protection: 27 Apple system apps excluded from uninstaller
  (Safari, Finder, Mail, Calendar, Photos, etc.)
  Also skips /System paths entirely
@momenbasel
Copy link
Copy Markdown
Owner

Hey @zeck00! Closing this - v2.0 shipped with an app uninstaller that uses a 10-level heuristic matching engine (AppPathFinder) with bundle ID, company name, entitlements, team identifier, Spotlight search, and container discovery. We also adopted your protectedBundleIDs idea and expanded it to 27 Apple system apps.

The v2.0 rewrite changed the entire codebase to native SwiftUI, so the v1 structure doesn't exist anymore - sorry about that! Your hover-to-reveal uninstall UX is a really nice interaction pattern though. If you'd like to bring that to the v2 AppFilesView, would love to see it.

Please take a look at the new codebase when you get a chance - would really value your feedback! Thanks again for all the work.

@momenbasel momenbasel closed this Apr 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants