Find and clean duplicate images on Windows. Native desktop app with a browser-style interface.
- Exact matching -- byte-for-byte identical file detection via MD5 checksums
- Visual matching -- finds photos that look the same even if cropped, resized, or re-saved (perceptual hashing)
- Safe workflow -- copies files to a staging area first; originals are never touched until you decide
- Recovery -- removed files go to the Windows Recycle Bin or a local folder, never permanently deleted without your say-so
- OneDrive aware -- detects OneDrive paths and prompts you to pause sync before bulk operations
- HEIC/HEIF support -- handles iPhone photos natively via pillow-heif
- Download or clone this repository
- Run
setup.bat-- it downloads an embedded Python, installs dependencies, and creates a desktop shortcut - Double-click the shortcut or
launch.vbs
No system Python required. Everything runs from the project folder.
- Windows 10 version 1803+ or Windows 11
- Microsoft Edge WebView2 Runtime (included in Windows 11; setup.bat checks for it)
- ~200 MB disk space for the embedded Python + dependencies
PixHerder runs a local web server on 127.0.0.1:8787 and opens a native window via pywebview. All processing happens on your machine -- nothing is uploaded or sent anywhere.
- Migrate -- Import photos from a source folder into a staging area
- Scan -- Run exact and/or perceptual duplicate detection
- Review -- Browse duplicate groups side by side, mark files to keep or remove
- Finalize -- Send cleaned files home and remove the workspace
Four workflow modes (Easy, Autonomous, Hybrid, Manual) let you choose your level of control.
pixherder_app.py Entry point (pywebview native window)
engine/ Core logic
scanner.py File discovery
hasher.py MD5 + perceptual hashing
comparator.py Duplicate group detection
actions.py File move/delete operations
staging.py Safe copy + OneDrive handling
config.py Settings + atomic JSON writes
web/ UI layer
index.html Single-page app (vanilla HTML/CSS/JS)
server.py Internal HTTP server (images + static files)
bridge.py pywebview API bridge
workers.py Background thread management
routes_*.py HTTP route handlers
tests/ Unit + E2E tests
setup.bat One-click installer
Run the app in debug mode with a console:
python pixherder_app.py --support-mode
Run the test suite:
python -m pytest tests/
Run the E2E workflow test:
python tests/test_e2e.py
Apache License 2.0. See LICENSE.