Local-first duplicate and similar file finder for macOS with a Swift engine and Electron desktop shell.
- Exact duplicate detection with staged hashing (
size -> sample hash -> full SHA-256). - Similarity detection for images, videos, and audio.
- Local review UI with cluster filtering, suppression, previews, and quick cleanup actions.
- SQLite-backed scan history, cache, and ignore rules.
- CLI and desktop shell powered by the same core engine.
- macOS (Apple Silicon or Intel)
- Swift toolchain (Xcode Command Line Tools or Xcode)
- Node.js 20+ and npm (desktop shell packaging and dev mode)
MediaFingerprint: media fingerprinting and similarity scoring.ScanCore: orchestration, clustering, review suppression, HTML export, trash flow.ScanStore: SQLite persistence for scans, cache, and ignore rules.ScanCLI: CLI surface and local review server.electron/: native desktop shell over the local Swift backend.
swift build
swift testswift run duplicate-me scan --location ~/Downloadsswift run duplicate-me serveswift run duplicate-me helpCommon commands:
swift run duplicate-me scan --location ~/Downloads --similar-images --similar-videos --similar-audio
swift run duplicate-me rescan
swift run duplicate-me export-json --run-id <RUN_ID> --output report.json
swift run duplicate-me export-html --run-id <RUN_ID> --output report.html
swift run duplicate-me ignore add --path ~/Downloads/cache --scope folder
swift run duplicate-me ignore list
swift run duplicate-me trash --run-id <RUN_ID> --cluster <CLUSTER_ID> --member <FILE_ID>Run desktop dev mode:
npm install
npm run desktop:devBuild distributables:
npm run desktop:dir
npm run desktop:dmgBuild outputs:
- app bundle:
dist/electron/mac-arm64/DuplicateMe.app - disk image:
dist/electron/DuplicateMe-0.1.0-arm64.dmg
Launch packaged app:
open dist/electron/mac-arm64/DuplicateMe.appnpm run desktop:dmg attempts notarization automatically if credentials are configured.
Credential options:
- Keychain profile
export APPLE_NOTARY_PROFILE="DuplicateMeNotary"- Apple ID + app-specific password
export APPLE_ID="you@example.com"
export APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"
export APPLE_TEAM_ID="TEAMID1234"Manual commands:
npm run desktop:notarize:app
npm run desktop:notarize:dmg- Scan database and cache live in
~/.duplicate-me/store.sqlite. - Review actions are local and operate on your filesystem.
servebinds to localhost for local review sessions.
Contributions are welcome. See CONTRIBUTING.md for setup, workflow, and pull request guidance.
Please report security issues responsibly. See SECURITY.md.
MIT. See LICENSE.
