StorageScope v0.3.0 — Scan performance and duplicate review completion
v0.3.0 — Scan performance and duplicate review completion
Two version-worth of work since v0.1.1 was released — the v0.2.0 work (PR #12) was version-bumped but never tagged, so this release covers everything since the last shipped version.
What's new
Scan performance (v0.3.0, PR #13)
- Parallel sibling-directory enumeration. The scanner now recurses into folder children in parallel via
DispatchQueue.concurrentPerform. Wide directory layouts (home folder, mounted volumes) benefit from SSD parallelism. Child item order is preserved deterministically. - Adaptive hash concurrency. Duplicate-verification hashing now scales with available cores up to 8 (was fixed at 4), so SSD hosts with more cores get proportionally more parallel hashing without saturating the disk queue.
Duplicate review completion (v0.3.0, PRs #14, #16)
- Keeper comparison sheet (#14). Verified duplicate groups gain a side-by-side sheet (launched via a new "Compare" button) showing the current keeper at the top and each alternative copy below, with size, modification date, and path. A per-row "Set as Keeper" button instantly reassigns.
- On-demand "Verify Now" for same-size candidate groups (#16). Same-size candidate groups beyond the auto-verification budget now have a "Verify Now" button that hashes the group out-of-band and surfaces real SHA-256-verified duplicate matches, moving them from the speculative same-size list to the verified-duplicate review lane. Uses the persisted hash cache, so cached hits are near-instant.
Cache management (v0.3.0, PR #15)
- Hash cache management in Settings. The Settings window now includes a "Duplicate Hash Cache" section showing stored-entry count and last-write timestamp, plus a destructive "Clear Cache" button guarded by an alert. Useful for forcing a full re-hash after moving many large files.
Trash flow and review UX (v0.2.0, PR #12)
- Async batch trash with progress. Batch trash operations now run on a background
Taskwith anisMovingToTrashprogress state, so the UI never freezes during large folder moves. - Debounced search input. Search input is now debounced ~200ms, so filtering and sorting don't fire per keystroke.
- Unified trash confirmation. Single-item "Move to Trash" actions from table/tree/inspector context menus no longer use a native
NSAlert; they route through the same review sheet batched actions do. - Per-item removal in trash sheet. The trash confirmation sheet gains a "Remove from batch" button per item, so you can prune without dismissing.
- Keeper selection for verified duplicates. Verified duplicate groups now designate a keeper copy (default: first), reassignable via context menu or the new comparison sheet. Keepers are excluded at trash time, and confirming a batch containing only keepers surfaces an informative error.
- Un-ignore affordance. Cleanup candidates can now be ignored and restored without rescanning via a new "Ignored" section in Cleanup Review.
- First-run permission card. First launch shows a dismissible card explaining folder access and Full Disk Access, with a button that deep-links to System Settings → Privacy & Security.
- Settings toolbar entry. Settings now has a visible gear icon in the toolbar — no longer reachable only from the menu bar.
- Stage-based scan progress. The sidebar footer shows
Enumerating → Verifying duplicates → Completeinstead of a generic "Scanning" line. - Recent-scan metadata. Recent scans now display when they ran and how big they were, instead of just the path.
- Persisted SHA-256 hash cache. Verified-duplicate hashing now caches to disk, so rescans skip unchanged files entirely.
- Thread-safe date formatter. Shared
Date.FormatStylereplaces the sharedDateFormatterthat could race on background format paths.
How to upgrade
Existing users on v0.1.1 or v0.2.0 can move directly to v0.3.0. No settings migrations required.
Building from source
bash ./script/build_and_run.sh # build app bundle, sign ad-hoc, launch
./script/export_dmg.sh # export a local DMG (ad-hoc signed)Notes
- This release ships as source — the tag does not include a downloadable DMG. To produce a DMG, run
./script/export_dmg.shlocally andgh release upload v0.3.0 <dmg-path>to attach it. Pre-built DMGs with Developer ID signing + notarization are planned for the 1.0.0 release. - The
v0.2.0tag was intentionally skipped — its work is folded into this release. The sidebar will gov0.1.1 → v0.3.0.
Verification
swift test— 52 tests across 5 suites passplutil -lint Config/StorageScope.entitlements Resources/PrivacyInfo.xcprivacy— cleanbash ./script/build_and_run.sh— builds, signs, launches the app
Contributing
Thanks to everyone who reported issues and tested the v0.2.0/v0.3.0 work. Issues and PRs welcome at https://github.com/RasputinKaiser/StorageScope.