Skip to main content

findupe

PyPI version Python versions License: MIT Platform: macOS

See your duplicate photos side by side, pick what goes, and nothing disappears without your OK.

findupe finds exact duplicates (any file type, zero false positives) and same-photo-different-format duplicates (HEIC / JPEG / RAW, re-encodes, resized exports) on your Mac, then lets you review everything visually in an HTML report before anything moves — to the real macOS Trash, never deleted outright.

Built for photographers: keeping X.CR3 + X.jpg side by side is intentional and is never flagged. Only surplus copies within a format (X copy.jpg, X_2.jpg, a re-imported CR3) become deletion candidates.

findupe's HTML report showing exact, strong-visual, and cross-format duplicate groups with thumbnails

Quickstart

pipx install findupe
findupe --demo     # scans a small bundled sample and opens the report — no setup needed

--demo gives you a real report to click through immediately. When you're ready to point it at your own photos, the flow is the same one shown below:

Terminal recording of scan, review, export, apply --dry-run, apply, and undo

  1. findupe scan ~/Pictures/inbox "/Volumes/Extreme SSD/photos" — writes an HTML report.
  2. Open the report, check the boxes you agree with (sensible ones are pre-checked), click Export selection.
  3. findupe apply <selection>.json --dry-run to preview, then without --dry-run to move the checked files to the Trash (typed confirmation required).
  4. findupe undo any time — restores from the Trash by content, not by guessing names.

Nothing is deleted outright: checked files go to the real Trash (recoverable, "Put Back" works), and the last copy of anything always survives — enforced independently of what the report UI shows you.

Install

Requires macOS.

pipx install findupe
# or
uv tool install findupe

Then findupe --help. Running on a non-macOS platform refuses immediately with a clear error — the Trash integration (Finder/AppleScript) and clone-detection notes are macOS/APFS-specific.

Workflow

scan writes two reports — one for images (exact + perceptual matching), one for everything else (PDFs, text, archives, ... — exact-hash matches only, since perceptual matching never applies to non-images). Review and apply each independently.

1. findupe scan ~/Pictures/inbox "/Volumes/Extreme SSD/photos"
2. open report-images.html   # photo/image duplicates — thumbnails, adjust checkboxes
   open report-other.html    # everything else — plain checkbox + path + size rows
3.                           # click "Export selection" on each ->
                              #   findupe-selection-<id>-images.json
                              #   findupe-selection-<id>-other.json
4. findupe apply findupe-selection-<id>-images.json --dry-run   # preview
   findupe apply findupe-selection-<id>-other.json  --dry-run   # preview
5. findupe apply findupe-selection-<id>-images.json            # typed confirmation
   findupe apply findupe-selection-<id>-other.json             # typed confirmation
6. findupe undo                                             # list restore points
   findupe undo <manifest>                                  # put everything back

How it works

findupe flags two kinds of duplicates: files that are byte-for-byte identical, and photos that look like the same shot even across formats or exports (HEIC, JPEG, RAW). It's tuned to leave burst shots and RAW+JPEG pairs alone — those are usually intentional, not duplicates — and everything is re-checked right before anything actually moves, not just at scan time.

Matching tiers, calibration numbers, and the full safety model live in docs/architecture.md.

Documentation

  • Reading your report — sections, badges, and flags explained
  • Architecture — matching tiers and the full safety model
  • FAQ — common questions
  • How-to — recipes: multi-root scans, excluding paths, history, stats, undo
  • CONTRIBUTING.md — dev setup, commit conventions, release pipeline

Metadata

Release files for findupe 0.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for findupe 0.7.0
File Size Uploaded Provenance Actions
findupe-0.7.0.tar.gz 1.3 MB With provenance Details for findupe-0.7.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for findupe 0.7.0
File Interpreter ABI Platform Actions
findupe-0.7.0-py3-none-any.whl Python 3 none any Details for findupe-0.7.0-py3-none-any.whl

Total release size: 1.5 MB

Release files / findupe-0.7.0.tar.gz

Download URL findupe-0.7.0.tar.gz
Size 1.3 MB
Tags Source
SHA-256 checksum
How to use checksums
f822e5e2bb6bd6ab413df0acb7eb81183b9e449aa04af835c86d6b00e87a9424
BLAKE2b-256 checksum
How to use checksums
8d711afbaf28c4e83ac516c1a4c249a83255efbe5bb7bc90187fdd1639013663
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 19, 2026.

Transparency log

Release files / findupe-0.7.0-py3-none-any.whl

Download URL findupe-0.7.0-py3-none-any.whl
Size 122.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d6bd5368fc0e9fcefed73245eccd9e1539cade6587a46f17ebd45039f26110c5
BLAKE2b-256 checksum
How to use checksums
c02d720e0795aa84ab675e1fd61b89bdca7c604bb05bcc3d1fa6b10c7387e128
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 19, 2026.

Transparency log

Security for findupe 0.7.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for findupe-0.7.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 19, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page