All notable changes to ClearDisk are documented here.
- Go build cache (
~/Library/Caches/go-build). This isGOCACHE, and it is usually several times larger than the module download cache that was already listed. Cleared bygo clean -cache; the next build is slower, then it is fast again. - Android System Images and NDK (
~/Library/Android/sdk/system-images,.../ndk). The existing Android entry covered~/.android/avd, which is often empty while the SDK beside it holds several gigabytes. Both are listed per subdirectory and never as the whole SDK: deleting~/Library/Android/sdkwould takeplatform-toolswith it, and there is noadbwithout it. The three Android entries now share a group. - VS Code updater cache (
~/Library/Caches/com.microsoft.VSCode.ShipIt), a sibling of the VS Code cache directory that was already listed. Squirrel parks downloaded update payloads there and never prunes them. - pnpm cache (
~/Library/Caches/pnpm). Separate from the package store:pnpm store pathresolves to~/Library/pnpm/store, while registry metadata and the dlx cache live under Caches. Neither covers the other. - rustup toolchains (
~/.rustup/toolchains), grouped with the other version managers rather than with Rust Cargo — these are the compilers themselves, and removing one uninstalls that toolchain. - node-gyp headers (
~/Library/Caches/node-gyp) and TypeScript type acquisition (~/Library/Caches/typescript), both of which keep one copy per version indefinitely.
-
Repositories kept directly in the home directory were never scanned for project artifacts. Every scan root was a subdirectory of
~, and none of them reached its siblings, so a project in~/my-projectwas invisible while the identical project in~/Documents/my-projectwas found.The home directory is scanned one level down, and deliberately never as a project itself. Handing
~to the scanner directly would have been worse than the bug: several tools leave a stray~/package.jsonbehind, which makes the whole home directory match the Node.js type — and.cacheand.expoare on that type's artifact list.~/.cacheis the shared cache for uv, Puppeteer, Prisma, Bazel and HuggingFace, not a build directory, and it would have been offered for deletion. Matching at~would also have stopped the walk there, so the projects this is meant to find would never have been reached. -
Artifacts reachable from more than one scan root are listed once. A duplicate row double-counted its size in the totals and made the second clean fail on an already-trashed path.
- Total cache paths: 74.
- Risk levels for the AI tools now describe what deleting actually costs, rather than which app owns the directory.
- Cursor and Windsurf are marked risky and no longer called caches. Both entries cover the whole
~/Library/Application Support/<app>directory, which for an AI editor is where chat history, workspace state and settings live. - Ollama models are marked caution instead of risky. They are downloads that
ollama pullrestores, and treating them as risky hid the largest entry in the list from the default view.
- Claude Code and Claude Desktop data was listed as a deletable cache (#27). Both entries covered
~/.claudeand~/Library/Application Support/Claudein full, where session transcripts, job state, file history, plugins and settings live, and claimed the contents would be re-created. They are now marked risky and their descriptions state that the deletion is permanent. - Clean Safe Caches emptied caution entries as well as safe ones, so a single click reached Xcode Archives, Android emulators, editor workspace state and every language-version manager. It now cleans only the entries marked safe.
- Universal binary for Apple Silicon and Intel.
- Added signed app produced pipeline to avoid
xattr -cr ...quirk - Updated version derivation from scripts
- No menu bar icon; the app appears to do nothing (#22, #16).
NSApplication.delegateis a weak reference, and nothing else in the app retainedAppDelegate— every other reference to it capturedselfweakly. Held only by a local inmain(), ARC was free to release it after its last use, before or duringapp.run(), taking the status item and the popover with it. The process kept running (some users still saw notification banners) but there was no menu bar icon and clicks went nowhere. Whether it happened at all depended on the optimiser, which is why it reproduced on some Macs and not others. The delegate is now held for the life of the process.
- Project scanner expanded from 11 to 23 project types — Python, CocoaPods, Carthage, Xcode, .NET/C#, Godot, Unity, Unreal, Haskell, Elixir, Zig, Crystal, plus the modern JS caches (
.next,.nuxt,.svelte-kit,.angular,.turbo,.vite,.yarn/cache). A project now lists each of its caches as a separate row. - Cleanup history — every cleaned project cache is logged (what, where, how big, when) and can be reviewed or cleared from the Projects tab.
- Failed cleans are now reported. If a directory cannot be moved to the Trash, the app says so — and offers to open Full Disk Access settings when the cause is permissions.
- Phantom savings: a clean whose
trashItemfailed still reported "Recovered X!", credited the savings and wrote a history entry, while the files were untouched on disk. Only bytes that actually reach the Trash are counted now, measured from disk rather than assumed. - Unclickable UI after reopening the popover: presenting a
.sheetfrom inside a.transientNSPopover strands SwiftUI's presentation state when the popover auto-closes on focus loss. The project sheets are drawn inside the popover now, and every modal is torn down when the popover closes. - Duplicate artifact rows: a directory matching two project types (a Unity project is also a .NET project; a JS+Python monorepo shares
dist/,build/,coverage/) was listed once per type, double-counting its size and failing the second clean. Each directory is surfaced once. - Data-loss guards:
env/,venv/,.venv/are only ever offered when a real virtualenv is proven (pyvenv.cfg/bin/activate), and Crystal'slib/only when ashard.lockprovesshards installran. UnityBuilds/and UnrealSaved/are no longer touched — those are user output, not caches. - The large-file scanner no longer looks inside media library packages (
.photoslibrary,.fcpbundle,.imovielibrary, …), where deleting a single file corrupts the whole library.
- The version is declared once, in
CHANGELOG.md, baked into the bundle byscripts/build_app.sh, and read back at runtime. - Project cache actions use the same trash icon as the Developer tab — they perform the same destructive action.
- Game Engines: Unity Cache (Asset Store), Unity Hub Cache, Godot Export Templates, Godot Cache
- Version Managers: nvm Node Versions, pyenv Versions (with
cautionrisk — reinstall withpyenv install), mise Installs - Python Ecosystem: Poetry Cache (
~/Library/Caches/pypoetry), pipenv Virtualenvs — merged from PR #13 by @IT-HONGREAT - JVM/Build Tools: SBT/Ivy Cache (
~/.ivy2/cache), Gradle Wrapper distributions (~/.gradle/wrapper/dists), Bazel Cache (~/.cache/bazel) - Cloud CLIs: AWS CLI SSO cache (
~/.aws/sso/cache) - Total cache paths increased from 44 to 63
- Terraform/OpenTofu cache support - Monitor
~/.terraform.dplugin cache and per-project.terraformartifact directories (Issue #10, PR #11) - Terraform added as project type for artifact scanning (
main.tfmarker,.terraformartifacts) - Total cache paths increased from 43 to 44
- AI tools cache support - Claude Desktop, Claude Code, Ollama Models, ChatGPT Desktop, Cursor, Windsurf
- VS Code cache support - VS Code Cache, CachedData, CachedExtensionVSIXs, Chromium Cache, Logs
- Total cache paths increased from 32 to 43
- Refactored cache path definitions into single source of truth (no more duplication between devCachePaths and scanDevCaches)
- Menu bar icon/text visibility on macOS Tahoe (always use template mode)
- Tray shows free space instead of cleanable amount (was confusing on high usage)
- Stale tray values fixed with Combine observer
- Expand view title centered using ZStack overlay
- Ruby ecosystem cache support - rbenv versions, mise rubies, RVM, Bundler cache (PR #6 by @benoittgt)
- Expand/collapse view - expand button next to tab bar hides header and summary card for full-height content list (Issue #8)
- Total cache paths increased from 28 to 32
- Popover height increased from 540 to 700px for better content visibility
- Premium dark app icon — Custom-designed icon with dark gradient, disk symbol, emerald progress arc, and sparkle effect
- Screenshot showcase — Professional card-deck style showcase with labeled screenshots in README
- Animated HD banner — Added to GitHub README header
- Removed "path not readable — sizes may be incomplete" warning from UI (silently handled)
- SEO-optimized GitHub topics (20 tags for better discoverability)
- Updated repo description for better attention capture
- QA.md purged from repository history
- Clean Caches Screen — Dedicated sub-screen with Safe Only / All (Including Risky) mode toggle. Shows full cache list, risky warning details, and one-tap clean button
- Clean Projects Screen — Dedicated sub-screen with checkbox selection, Select All / Deselect All, filter by staleness (>30 days), and "Remove Selected" with total size
- Project Sort Options — Sort project artifacts by Size (default), Date, or Name in the Projects tab
- Hero Card Redesign — Now shows total reclaimable space (caches + projects + risky + trash) with a color-coded segmented breakdown bar. Two action buttons: "Clean Caches" and "Clean Projects"
- Developer tab simplified — buttons removed from header (moved to hero card sub-screens)
- DMG now includes Applications shortcut for drag-to-install
- Project Artifacts Scanner — New "Projects" tab finds stale
node_modules,target/,.build/,build/,vendor/directories inside your project folders. Inspired by kondo (2,200⭐) and npkill (9,100⭐) - 11 Project Types Detected: Node.js, Rust, Swift PM, Go, Gradle, Gradle (Kotlin), Maven, PHP/Composer, Ruby, Flutter/Dart, CMake
- Stale Detection: Projects not modified for 30+ days are flagged with an orange warning
- Individual Cleanup: Trash any project's build artifacts with one click
- Hub Card: Hero card now shows project artifact total alongside dev caches and trash
- Tab bar now has 4 tabs: Developer, Projects, Overview, Large Files
- Clean confirmation dialog shows project type and path details
- Cache Descriptions: Every cache item now shows a human-readable description explaining what it is and whether it's safe to delete (inspired by npkill's 301-line description file)
- DerivedData Project Breakdown: Xcode DerivedData entry now shows which projects are inside (e.g. "MyApp: 2.3 GB, OtherApp: 1.1 GB") by reading each subfolder's
info.plist → WorkspacePath(technique from DevCleaner) - Xcode Running Check: When cleaning Xcode-related caches, a warning appears if Xcode is currently running ("Close Xcode first for best results")
- Competitor Analysis: 5 open-source competitors analyzed (DevCleaner, XcodeCleaner-SwiftUI, kondo, npkill, mac-cleanup-py) — insights applied to ClearDisk
- Each cache row now has a subtle description line below the path
- Confirmation dialogs now include Xcode running warning when applicable
- Tooltips on path line show full cache description on hover
- Hero Dashboard: Big, bold cleanable space display (28pt font) with dev cache + trash breakdown
- Quick Action Bar: "Clean X safe caches (Y GB)" one-click button in hero card
- Visual Category Bars: Color-coded proportional bars in Overview tab (each category gets unique color)
- Recovery Banner: Green "Recovered X GB!" banner appears for 5 seconds after any cleanup
- Cumulative Savings: Persistent "Total saved: X GB" counter in footer (survives app restart)
- Onboarding Screen: First-launch welcome overlay with feature list and notification permission status
- Permission Checking: Tracks notification permission state and inaccessible cache paths
- Permission Banner: Warning banner when notifications are denied or paths unreadable
- Bundle Guard: App no longer crashes when run via
swift run(gracefully disables notifications)
- Overview tab: categories now show proportional color bars instead of plain text rows
- Hero card replaced the small "X cleanable" row with a prominent dashboard
- Footer shows "Total saved" when user has cleaned anything, version number otherwise
build_app.shnow uses relative path (works from any directory)
- Safe Delete (Trash): All cache cleaning now moves files to Trash instead of permanent delete
- Users can recover files for 30 days before Trash is emptied
- Fallback to removeItem only if trashItem fails (permission issue)
- "Empty Trash" still permanently deletes (as expected)
- Risk Levels: Each developer cache now has a risk indicator
- 🟢 Safe — can be rebuilt with a single command (DerivedData, npm, pip, brew, etc.)
- 🟡 Caution — may need large re-download (Xcode Archives, Simulators)
- 🔴 Risky — may contain irreplaceable data (Docker data)
- Risk emoji shown next to each cache name in UI
- Confirmation dialogs now show risk description
- "Clean All" dialog warns about risky caches
- MIT License added
- README.md with feature comparison, installation, privacy statement
- QA.md rewritten from 10 professional perspectives (551 lines of research-backed analysis)
- Binary size: 590KB
- Storage Forecast: Tracks disk usage over time and predicts "disk full in X days" using linear regression
- Snapshots stored in UserDefaults (max 90 days, one per hour)
- Shows forecast in header: red warning ≤7 days, orange ≤30 days, info >30 days
- Shows "collecting data..." message while building initial dataset
- Daily growth rate displayed (bytes/day)
- Smart Suggestions: Age-based cleanup recommendations for each dev cache
- "Not used for X days" badge on each cache entry
⚠️ red suggestion for caches >90 days old and >1GB- 💡 yellow suggestion for caches >60 days old
- Suggestions only appear when actionable
- Binary size: 585KB
- Smart menu bar icon: Color changes based on disk usage (normal=template, ≥80%=orange, ≥90%=red)
- Smart menu bar text: Shows free space normally, shows cleanable amount with ♻️ when disk ≥80%
- macOS notifications: Alert when disk reaches 80% or 90%, with cleanable amount in notification
- "Total Cleanable" summary card: Green card showing total cleanable space (dev caches + trash) at top of popover
- "Clean All" button: One-click button to clean all developer caches at once (with confirmation dialog)
- Large file threshold lowered to 100MB (was 500MB) — catches more files
- Event monitor memory leak — global monitor now properly removed when popover closes
- Notification spam prevention — only notifies once per threshold crossing, resets when usage drops below 75%
- Popover height increased to 540px (from 520px) to accommodate cleanable summary
- Binary size: 503KB (was 450KB due to UserNotifications framework)
- Menu bar app with storage percentage icon
- Disk space overview with category breakdown (10 directories)
- Developer cache scanner (15 paths: Xcode DerivedData, Simulators, Archives, CocoaPods, Carthage, Homebrew, npm, Yarn, pip, Gradle, Docker, Composer, Go modules, Rust Cargo)
- Large file finder (>500MB in Downloads/Documents/Desktop/Movies)
- Quick cleanup actions: clean dev cache, empty trash, reveal in Finder
- 3 tabs: Overview, Developer, Large Files
- Color-coded storage bar (blue/orange/red by usage level)
- Confirmation alerts before destructive actions
- Version: 450KB binary, macOS 14+, LSUIElement=true (menu bar only)
- No smart alerts or notifications (fixed in v1.0)
- No total cleanable summary (fixed in v1.0)
- No "clean all" option (fixed in v1.0)
- Large file threshold too high at 500MB (fixed in v1.0)
- Event monitor memory leak (fixed in v1.0)
- v1.1: Storage forecast (disk full prediction), smart suggestions based on file age
- NOT planned: Sunburst/treemap (DaisyDisk niche), auto scheduler (trust issue), duplicate finder (crowded space)