[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-1927":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":13,"compositeScore":16,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":20,"hasPages":22,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":15,"starSnapshotCount":15,"syncStatus":36,"lastSyncTime":37,"discoverSource":38},1927,"MacSift","Lcharvol\u002FMacSift","Lcharvol","Transparent macOS disk cleaner — groups files by app, moves to Trash (never permanent). SwiftUI + Liquid Glass, built for macOS Tahoe.","https:\u002F\u002Flcharvol.github.io\u002FMacSift\u002F",null,"Swift",250,9,1,0,3,4,100,"MIT License",false,"main",true,[24,25,26,27,28,29,30,31,32],"cleanup","disk-cleaner","liquid-glass","macos","macos-tahoe","mvvm","native-app","swift","swiftui","2026-06-12 02:00:34","\u003Cdiv align=\"center\">\n\n\u003Cimg src=\"docs\u002Fimages\u002Ficon-512.png\" width=\"120\" alt=\"MacSift\">\n\n# MacSift\n\n**A transparent disk cleaner for macOS — Sequoia and Tahoe.**\n\nSee exactly what's taking up space, group it by the app that owns it,\nand move everything to the Trash — never permanent deletion.\n\n**[Website](https:\u002F\u002Flcharvol.github.io\u002FMacSift\u002F) · [Download latest](https:\u002F\u002Fgithub.com\u002FLcharvol\u002FMacSift\u002Freleases\u002Flatest\u002Fdownload\u002FMacSift.zip) · [Release notes](https:\u002F\u002Fgithub.com\u002FLcharvol\u002FMacSift\u002Freleases\u002Flatest)**\n\n\u003C\u002Fdiv>\n\n---\n\n## Why another disk cleaner?\n\nCommercial Mac cleaners all have the same problem: you press a big button\nand they \"clean\" a few gigabytes you never see. You trust them by default.\nIf anything important disappears, it's already gone.\n\nMacSift is the opposite:\n\n- Everything you're about to delete is listed, grouped, and labeled.\n- Selected items go to the **Trash**, not `rm -rf`. Finder restores anything\n  until you empty it.\n- **Dry run is on by default** for first-time users.\n- Destructive actions require an explicit confirmation; deletions above 10&nbsp;GB\n  show an extra warning.\n- Zero network calls. Zero telemetry. 100 tests, all green.\n- Every scan completion and cleanup run is written to\n  `~\u002FLibrary\u002FLogs\u002FMacSift\u002Fmacsift.log` so you can audit what the app did\n  without a debugger.\n\n## Install\n\n### Option A — Homebrew (one command)\n\n```bash\nbrew tap Lcharvol\u002Fmacsift\nbrew install --cask macsift\n```\n\nThe tap lives at [Lcharvol\u002Fhomebrew-macsift](https:\u002F\u002Fgithub.com\u002FLcharvol\u002Fhomebrew-macsift).\nSince MacSift isn't notarized yet, the cask's `postflight` strips the\n`com.apple.quarantine` attribute automatically — you can double-click\nthe installed `MacSift.app` without the right-click → Open dance.\n\nUpgrade later with `brew upgrade --cask macsift`. Uninstall with\n`brew uninstall --cask --zap macsift` to also remove settings and logs.\n\n### Option B — Download the release\n\n1. Download [**MacSift.zip**](https:\u002F\u002Fgithub.com\u002FLcharvol\u002FMacSift\u002Freleases\u002Flatest\u002Fdownload\u002FMacSift.zip) (1.5&nbsp;MB, Apple Silicon).\n2. Unzip and **drag `MacSift.app` into `\u002FApplications`** before opening it.\n   Gatekeeper treats apps inside `~\u002FDownloads` more strictly, so moving it\n   first avoids an extra warning.\n3. **First launch:** right-click (or Control-click) `MacSift.app` in\n   `\u002FApplications` → **Open** → confirm the second dialog.\n\n   On macOS Sequoia (15) and later, the right-click trick no longer\n   bypasses Gatekeeper on its own. If you see *\"Apple could not verify\n   'MacSift.app' is free of malware\"*, open **System Settings → Privacy\n   &amp; Security**, scroll to the bottom, and click **Open Anyway**\n   next to the MacSift entry. Relaunch the app — you'll be prompted\n   once more, then every subsequent launch is silent.\n\n   Gatekeeper asks because the app is ad-hoc signed, not notarized\n   (no paid Apple Developer account). Building from source (Option B)\n   is the workaround if you'd rather not go through this.\n4. Grant **Full Disk Access** in System Settings → Privacy &amp; Security →\n   Full Disk Access.\n\n### Option C — Build from source\n\nSame binary, verified from the source tree.\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FLcharvol\u002FMacSift.git\ncd MacSift\n.\u002Fbuild-app.sh && open MacSift.app\n```\n\nThe build script produces a signed `.app` bundle in one step. macOS 15\n(Sequoia) or later and Apple Silicon are required to run; Xcode 26\ncommand-line tools are required to build (the project uses Swift 6.0 and\nopts into macOS 26 Liquid Glass APIs at runtime, but degrades gracefully\non Sequoia).\n\n## What it does\n\n- **Scans** `~\u002FLibrary\u002FCaches`, `~\u002FLibrary\u002FLogs`, `~\u002FLibrary\u002FApplication Support`,\n  `\u002Ftmp`, `\u002Fprivate\u002Fvar\u002Flog`, and your entire home directory for large files.\n- **Detects** Time Machine local snapshots and iOS device backups (device\n  name + date read from `Info.plist`).\n- **Classifies** every file into one of eleven categories:\n  Caches · Logs · Temporary Files · Unused App Data · Large Files ·\n  Time Machine Snapshots · iOS Backups · **Xcode Junk** · **Dev Caches** ·\n  **Old Downloads** · **Mail Attachments**.\n- **Groups** by owning app. `~\u002FLibrary\u002FCaches\u002Fcom.apple.Safari\u002F*` — 15,000\n  files — shows up as a single **Safari** row. One decision, not fifteen thousand.\n- **Orphan detection** — `Application Support` folders are only flagged as\n  `.appData` if their owning app is no longer installed in `\u002FApplications`.\n- **Inspector panel** with Reveal in Finder, Quick Look, Copy Path, and\n  a live preview of the top 5 largest files in any selected group.\n- **Moves to Trash** via `FileManager.trashItem`. Never a permanent delete.\n\n## Keyboard shortcuts\n\n| Shortcut | Action |\n|----------|--------|\n| `⌘R` | Start \u002F restart scan |\n| `⌘.` | Cancel scan |\n| `⌘A` | Select all safe items |\n| `⌘⇧A` | Deselect all |\n| `Esc` | Dismiss cleaning preview |\n\nDrop any folder on the window to scan just that folder.\n\n## Safety at the engine level\n\n- `\u002FSystem`, `\u002Fusr`, `\u002Fbin`, `\u002Fsbin` are **hard-blocked** in `CleaningEngine`\n  before any delete call — not just hidden in the UI.\n- Application Support folders that belong to still-installed apps are\n  never surfaced.\n- Dry run is **on** by default for new installs (`AppState.init` seeds it\n  to `true`).\n- The cleaning flow can't be triggered without passing through\n  `CleaningPreviewView` and an explicit confirmation alert.\n- Selection is stored as a `Set\u003CString>` of SHA-256 file-id hashes so that\n  a re-scan preserves your selection of files that still exist — and drops\n  selections whose files are gone.\n\nIf you'd rather verify than trust, the engine is ~120 lines:\n[`MacSift\u002FServices\u002FCleaningEngine.swift`](MacSift\u002FServices\u002FCleaningEngine.swift).\n\n## Architecture\n\nStrict MVVM. Pure SwiftPM project — no `.xcodeproj`, no Xcode GUI needed.\n\n```\nMacSift\u002F\n├── App\u002F          # MacSiftApp @main, AppState\n├── Models\u002F       # FileCategory, ScannedFile, ScanResult, FileGroup — all Sendable value types\n├── Services\u002F     # DiskScanner, CategoryClassifier, FileGrouper, CleaningEngine,\n│                   TimeMachineService, ExclusionManager\n├── ViewModels\u002F   # ScanViewModel, CleaningViewModel — @MainActor, @Published\n├── Views\u002F        # SwiftUI views. Prefer plain values over VM observation.\n└── Utilities\u002F    # FileSize+Formatting, FileDescriptions, BundleNames, Permissions\n```\n\nThe detailed conventions, performance rules, and debugging lessons are in\n[`CLAUDE.md`](CLAUDE.md) — read that before touching the file list or the\nscanner.\n\n## Development\n\n```bash\nswift build                              # type-check\nswift test                               # 100 tests across 16 suites\nswift test --filter FileGrouper          # run one suite\n.\u002Fbuild-app.sh                           # build the .app bundle\n.\u002Fbuild-app.sh release                   # release-optimized build\n```\n\nGitHub Actions runs `swift test` on every push to `main` (see\n[`.github\u002Fworkflows\u002Ftest.yml`](.github\u002Fworkflows\u002Ftest.yml)).\n\n## Known limitations\n\n- **Apple Silicon only.** No Intel build in the current release.\n- **Gatekeeper asks once on first launch** because the app is ad-hoc signed\n  rather than notarized — distributing a notarized binary requires a paid\n  Apple Developer account. Building from source (Option B) is the workaround\n  if you'd rather not trust a pre-built binary.\n- **Dock icon** renders slightly smaller than first-party Tahoe apps because\n  legacy `.icns` icons aren't the new Icon Composer asset format.\n- **Time Machine snapshot deletion** can require admin privileges. If\n  `tmutil deletelocalsnapshots` fails, the cleaning report shows the exact\n  `sudo` command to run in Terminal.\n\n## Uninstall\n\nEasiest way: open **Settings → Uninstall MacSift…** inside the app.\nThat single button:\n\n- erases every MacSift preference (mode, dry-run, threshold, exclusions,\n  lifetime counters)\n- deletes the audit log at `~\u002FLibrary\u002FLogs\u002FMacSift`\n- removes any `MacSift-\u003Cversion>.zip` cached update zips and their\n  extracted folders from `~\u002FDownloads`\n- moves `MacSift.app` itself to the Trash\n- quits the app\n\nThe one thing MacSift can't undo for you is the **Full Disk Access\ngrant** — that's managed by macOS's TCC and only you can revoke it, in\nSystem Settings → Privacy & Security → Full Disk Access.\n\nIf you'd rather do it by hand from Terminal:\n\n```bash\n# Quit the app, then:\nrm -rf \u002FApplications\u002FMacSift.app\n\n# Clean up persisted preferences + exclusion list\ndefaults delete com.macsift.app\n\n# Optional: remove the local audit log\nrm -rf ~\u002FLibrary\u002FLogs\u002FMacSift\n\n# Optional: remove any downloaded update zips\nrm -f ~\u002FDownloads\u002FMacSift-*.zip\nrm -rf ~\u002FDownloads\u002FMacSift-*\n```\n\nMacSift writes to exactly three places on disk — its UserDefaults\ndomain, `~\u002FLibrary\u002FLogs\u002FMacSift\u002Fmacsift.log` (capped at ~500 KB), and\nupdate zips in `~\u002FDownloads`. No keychain entries, no LaunchAgents, no\n`~\u002FLibrary\u002FApplication Support\u002FMacSift` folder. Nothing else to clean.\n\n## License\n\nMIT. See [`LICENSE`](LICENSE). Fork it, learn from it, ship your own\nversion — just keep the copyright notice. The cleaning engine in\nparticular is worth reading even if you don't plan to use the app.\n","MacSift 是一款专为 macOS 设计的透明磁盘清理工具，能够按照应用程序归类文件，并将选定的文件移至废纸篓而非永久删除。该工具采用 SwiftUI 和 Liquid Glass 技术构建，界面美观且用户体验良好，特别针对 macOS Tahoe 进行了优化。其核心功能包括列出并分组所有待清理文件、仅将选中项移至废纸篓（支持恢复）、默认开启干运行模式以确保用户安全、以及对超过 10GB 的删除操作提供额外警告等。MacSift 适用于需要细致管理和安全清理磁盘空间的 macOS 用户，尤其适合那些希望在清理过程中保持高度控制和透明度的场景。",2,"2026-06-11 02:46:52","CREATED_QUERY"]