v2.1.0
Universal binary (Intel + Apple Silicon).
Security hardening
Five reported vulnerabilities closed - all exploitable with a prior same-UID foothold, no admin/root required.
- Allow-list bypass via
hasPrefixwithout trailing separator (#47) - sibling paths like/tmpfoo/victim.secretcould pass the whole-subtree check for/tmp. Fixed with separator-anchored prefix match inCleaningEngine.isSafeToDeleteandOrphanSafetyPolicy.isSafeCandidate. - Zero-click cache deletion via
HOMEBREW_CACHE+ pre-seededScheduleConfig(#48).scanBrewCachenow stripsHOMEBREW_*from the child env and validatesbrew --cacheoutput against a known-roots allow-list.Downloads,Documents, andDesktopremoved from the whole-subtree allow-list (still deletable as per-file large-file items).SchedulerService.initdiscards a stalenextRunDate;AppState.initgatesscheduler.start()onOnboardingComplete. - TOCTOU between symlink check and
removeItem(#49).CleaningEngine.cleanItemsnow deletes through the resolved URL and re-resolves + re-verifies the resolved path immediately before theunlink. - App-uninstaller short-name bomb + unchecked
removeItem(#50). Minimum 5-char token length enforced on app-name / path-component / letters-only / bundle-last-two / base-bundle / stripped-name / company / team-ID matches. Bundle-ID condition matching is now anchored (==,hasPrefix(cond + "."), orhasSuffix("." + cond)) instead of an unanchoredcontains- stopscom.evil.jetbrainsappfrom hijacking thejetbrainsrule.AppState.removeSelectedFilesandOrphanSafetyPolicyrefuse any high-risk home dotpath. - Removing Claude.ai webapp deleted
~/.claude(#51).Locations.appSearch.pathsno longer includes bare$HOME, so top-level home dotfiles are not scanned as app artifacts. A newhighRiskHomeDotPathslist inConditions.swift(~/.claude,~/.ssh,~/.aws,~/.kube,~/.docker,~/.gnupg,~/.config, cloud/CLI-tool configs, shell histories) is unconditionally skipped by the scanner and the uninstaller selection guard.
UI fixes
- Home page lost after redirecting to side tabs (#69). Smart Scan is now pinned to a dedicated
Homesection at the top of the sidebar, so it is always reachable. - Installed Apps sort not working (#59).
ApplicationandSizecolumns are sortable viaKeyPathComparator. - Sidebar expands indefinitely in Installed Apps (#60). Left pane of the internal
HSplitViewcapped atmaxWidth: 600. - About-box version mismatch (#44, #46, #57, #64).
Info.plistnow uses$(MARKETING_VERSION)/$(CURRENT_PROJECT_VERSION)macros instead of hardcoded1.0.1/3. The shipped bundle now reports 2.1.0 (5).
Other landed work
- Data-race fix in
AppPathFinder.shouldSkipItem(#67) - CLI dispatch only enters CLI mode for known commands - Xcode's
-NSDocumentRevisionsDebugModeand LaunchServices-psn_<pid>no longer hijack launch (#68) - New Docker Cache cleaning category (#36, closes #1)
- Spanish (es) localization + multilingual README (#65)
Install
brew tap momenbasel/tap
brew install --cask puremac
Or download PureMac-2.1.0.dmg below.