navig-dedupe
A free, standalone perceptual duplicate finder for photos, video, audio & any file. Non-destructive (quarantine, never delete). Installs without navig; also wired into
navig dedupe.
Works on its own — its own CLI, no navig required · v0.1.2 · PyPI
On its own (no navig needed)
pip install navig-dedupe
ndup --help # no navig needed
With navig
pip install "navig[dedupe]"
navig dedupe --help
Commands
| Command | What it does |
|---|---|
navig dedupe |
Find, quarantine & restore duplicate photos, video, audio & files — non-destructive. |
navig dedupe restore |
Undo a quarantine — move files back to where they came from. |
navig dedupe scan |
Find near-duplicate photos/video/audio and exact-duplicate files. |
A free, standalone perceptual duplicate finder for photos, video, audio, and any file — that installs without navig, and also lights up inside it as
navig dedupe. Non-destructive by design: extras are quarantined (moved), never deleted.
Four engines, all lifted out of navig-core so there is one source of truth
(navig-core/navig/media/*_dedupe.py is now a thin re-export shim — the same
voice/ → navig-audio pattern):
| Mode | What it catches | Needs |
|---|---|---|
| images | Re-saved / resized / re-encoded photo copies (256-bit dHash) + redundant X_thumb thumbnails |
numpy, Pillow |
| files | Exact byte duplicates of any file type (SHA-256, size/head pre-sieved) | — (stdlib) |
| audio | The same track re-encoded across formats (Chromaprint acoustic fingerprint) | fpcalc binary |
| video | Re-uploaded / re-encoded clips (evenly-spaced keyframe dHash) | ffmpeg / ffprobe |
Install & use (standalone)
pip install navig-dedupe # numpy + Pillow come with it
navig-dedupe scan ~/Pictures # dry run: report duplicate groups (nothing touched)
navig-dedupe scan ~/Pictures --near --move ~/dupes # quarantine resized copies
navig-dedupe restore ~/dupes # changed your mind? move everything back
ndup scan ./downloads --all --json # all four modes, machine-readable output
# also: python -m navig_dedupe --help
Default (no mode flags) scans images + files — the two that need no external binaries. The largest / highest-resolution file in each group is always the one kept. A file caught
It will not re-flag its own quarantine
--move writes copies into a quarantine dir, and every one of them is byte-identical to
the original it was quarantined for. A later scan of the parent would report the whole
quarantine as fresh duplicates. Quarantine-shaped folder names (.trash, _dupes,
_quarantine, …) are therefore skipped when they sit inside the scanned tree — point
the root at one directly and it is scanned normally. Add your own with --exclude NAME.
How files mode stays fast on a big library
A file whose size is unique cannot have a byte-identical twin, so it is never opened.
Two sieves run before any hashing — size (stat, no read at all), then the first 64 KB —
and only what survives both is hashed in full. Both sieves are exact, not heuristic:
identical files always share a size and a head, so no duplicate is ever missed.
On a real 29,055-file / 193 GB music library this took the full-hash pass from 193 GB to 2.1 GB read — 93× less — and produced byte-for-byte the same clusters.
by more than one mode (e.g. an exact-duplicate photo) is counted and moved once, not per
mode. Add -v to list the actual duplicate filenames per group, and --fail-on-dupes
to make a dry run exit non-zero (drop navig-dedupe scan assets/ --fail-on-dupes into CI to
fail a build that ships duplicate assets). Tip: keep the --move dir outside the scanned folder, or run the same --move
consistently — either way an already-quarantined file is never re-scanned.
Undo is always available
scan --move writes a .dedupe-restore.json manifest into the quarantine dir, so nothing is
ever a one-way trip:
navig-dedupe restore ~/dupes # move every quarantined file back where it came from
navig-dedupe restore ~/dupes --to ~/Pics # …or into a different root
A file whose original path has since been re-occupied is left safely in quarantine and reported —
restore never overwrites.
Inside navig
The same command surface is navig dedupe scan <folder> …. It ships as the optional
navig[dedupe] extra and registers a free Dedupe module tile. The agent can invoke it
from natural language ("clean up duplicate photos in this folder") via the bundled skill.
Develop
cd navig-dedupe
python -m pip install -e ".[dev]"
navig-dedupe --help
pytest -q
Relationship to navig
navig-dedupe owns the code; navig-core re-exports it, so the two never fork. Inside navig it
is navig dedupe; the legacy navig media dedupe-* commands keep working via the shim.
Apache-2.0.
Metadata
Release files for navig-dedupe 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| navig_dedupe-0.1.2.tar.gz | 33.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| navig_dedupe-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 62.0 kB
Security for navig-dedupe 0.1.2
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
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.