Duplicate + Photo Cleanup

PhotoSweep

Finds the same photo saved twice at different sizes, which an exact-match tool never will.

Free right now — no account, no card

Get PhotoSweep free Windows & Mac · one file, nothing to install

Preview

1 interface design, then a screenshot of it running. Drag, scroll or use the arrows.

Interface design PhotoSweep, 1 of 1
Screenshot PhotoSweep running on Windows today

Free while we’re in preview

Get PhotoSweep

Finds the same photo saved twice at different sizes, which an exact-match tool never will.

The Mac button is for Apple Silicon. On an older Intel Mac, get this one instead.

One file, both ways. Double-click it for the window. Run the same file from a command prompt with arguments and it behaves as the command-line tool, because the engine is inside it. Nothing else to download and nothing to keep beside it.

Early preview. The window has been built and run, but not yet on a real Windows PC or Mac, so expect rough edges. The engine underneath it is fully tested.

  • One file — no installer
  • Runs on your machine, offline
  • Source code published below

Free while in preview. It isn’t signed yet, so Windows or macOS will ask you to confirm the first time you open it. At launch, PhotoSweep is included in every plan along with the rest of the range.

Same picture, different bytes

Your phone kept the full-resolution shot and the shrunk copy it sent to a group chat. The same photo exported from two apps. Five frames of one burst. None of those are byte-identical, so an exact-duplicate finder walks straight past all of them.

PhotoSweep shrinks each image to an 8x8 grid, turns each cell into a brightness value, and sets one bit per cell for whether it’s above the image’s average. That 64-bit fingerprint survives resizing, re-compression and format changes. Two photos count as near-duplicates when their fingerprints differ by fewer than --threshold bits, default 5. Lower is stricter.

Every group prints each member with its distance from the reference image, its pixel dimensions and its file size, so you can judge the grouping before acting on it.

Cleanup keeps one and quarantines the rest

clean treats the first member of each group as the keeper and moves the others into --quarantine, preserving their paths relative to the root they came from. Moved, never deleted, and nothing at all happens without --apply.

Average-hash is a basic perceptual hash. It won’t handle rotation or heavy crops the way a DCT-based hash does, and comparison is pairwise, which suits a few thousand photos rather than a hundred thousand. DupePilot covers byte-identical files.

Reading on the job itself

Advanced & technical details Command-line builds, source code, checksums and a recorded session — for developers and IT teams

A working CLI prototype of the near-duplicate engine: perceptual average-hashing (aHash) with Hamming-distance grouping catches resized/recompressed/re-exported near-duplicates that exact-hash tools like the sibling DupePilot miss entirely, with the same safe quarantine-based cleanup. More advanced pHash/DCT or ML-based similarity is on the roadmap.

Naming status

Working name only — brand verdict **AVOID** (Very High). Collision: PhotoSweep. Rename completely.

What it draws on

Existing paid software whose best ideas shaped this program: Duplicate Cleaner Pro, Easy Duplicate Finder, TreeSize Professional, Advanced Renamer Commercial.

Command line

There is nothing extra to install. The program you download is the command-line tool as well: give it arguments instead of double-clicking it and it runs as one, with its output on your terminal. The standalone builds below are the same engine on its own, for machines where you would rather not ship a window at all.

PhotoSweep - near-duplicate photo detector (perceptual aHash)

Usage:
  photosweep scan <dir> [<dir> ...] [--threshold 5] [--min-size 10KB] [--json]
  photosweep clean <dir> [<dir> ...] --quarantine <qdir> [--threshold 5] [--min-size 10KB] [--apply]
  photosweep help

scan
  Walks the given directories, computes a 64-bit average-hash (aHash) for
  every recognized image (.jpg, .jpeg, .png, .gif), and groups images whose
  Hamming distance is <= --threshold into near-duplicate sets. Only groups
  with 2+ members are reported.

    --threshold N   max Hamming distance (0-64) to count as near-duplicate (default 5)
    --min-size S    skip files smaller than S, e.g. 10KB, 2MB (default: no minimum)
    --json          emit machine-readable JSON instead of text

clean
  Same grouping as scan. For each near-duplicate group, the FIRST member
  found (by scan order) is KEPT; every other member is a cleanup candidate.
  Without --apply this is a dry run that only prints the plan. With --apply,
  every non-kept file is MOVED (never deleted) into --quarantine, preserving
  its path relative to the scanned root directory it was found under.

    --quarantine D  destination directory for quarantined files (required)
    --threshold N   max Hamming distance to count as near-duplicate (default 5)
    --min-size S    skip files smaller than S, e.g. 10KB, 2MB (default: no minimum)
    --apply         actually move files (default: dry run, no changes made)

Examples:
  photosweep scan ~/Pictures --threshold 8
  photosweep clean ~/Pictures --quarantine ~/PhotoSweepQuarantine --apply

Recorded from the shipped binary, not written by hand.

Source

Every file the program is built from:

console.go · console_test.go · guided.go · main.go

SHA-256 checksums · build instructions & scope notes · full build plan