"pHash found hundreds of re-compressed Instagram screenshots I'd been hoarding for years. Five minutes to scan 12,000 photos."
How It Works
- 1. Pick a FolderSelect any folder. Subfolders included automatically. Or drag & drop.
- 2. Scan RunsEach file gets a fingerprint inside your browser. No data leaves your machine.
- 3. Groups Appear LiveDuplicate groups show up as they're found — no waiting for the full scan.
- 4. Move or DeleteSelect files from any group and move, delete, or compare side-by-side.
📊 Quick Pick — Which Algorithm Should I Use?
Not sure where to start? Here's the short version. Detailed explanations of every algorithm follow below.
| I want to find… | Best algorithm | Why |
|---|---|---|
| Exact or near-exact copies, fastest possible scan | aHash | Simplest algorithm, fastest of all 7, excellent for exact copies and resized versions |
| Same photo in different formats (JPEG → PNG → WebP) | pHash or wHash | Frequency-domain hash is stable across format conversions and minor edits |
| Re-compressed or heavily JPEG-artifacted copies | BlockHash | Block averaging absorbs compression noise better than pixel-level methods |
| Brightness-adjusted or exposure-corrected versions | dHash | Encodes brightness gradients (direction), not absolute values — unaffected by exposure shifts |
| Same scene or colour palette, social media re-uploads | Color Signature | Only algorithm that compares actual colour (YUV) — not just luminance |
| Rotated, cropped, or perspective-warped copies | ORB | Only algorithm that uses local keypoint features — handles geometric transformations |
| Large library, best speed/quality balance | wHash | Wavelet transform gives pHash-quality results at faster speed |
All 7 Algorithms — How They Work
Every algorithm follows the same pipeline: load → normalize → fingerprint → compare. What differs is the fingerprint step. Understanding that step helps you pick the right algorithm and interpret your results.
Color Sig Algorithm
The only algorithm that compares actual colour, not just brightness. It divides each image into a 24×24 regional grid and measures the YUV (luminance + chrominance) values in every cell. Two images match if their colour distribution across all regions is close enough at the current threshold. This means a bright-red photo will never match a bright-green one, even if their brightness patterns are identical — something all hash-based algorithms would get wrong.
aHash Algorithm
The fastest algorithm in Sakarto. Shrinks the image to 16×16, converts to grayscale, and compares each of the 256 pixels against the overall mean brightness. Pixels brighter than average become 1, darker become 0 — producing a 256-bit binary fingerprint. Two files are compared by counting how many bits differ (Hamming distance). The whole process takes under a millisecond per image. Fast Mode makes JPEG scanning 5–10× faster by reading the embedded EXIF thumbnail instead of decoding the full image.
BlockHash Algorithm
Instead of comparing individual pixels, BlockHash divides a 64×64 canvas into 16 equal-sized blocks (4×4 grid, each block is 16×16 pixels) and averages the brightness in each block. The average of all blocks becomes the threshold, and each block above average becomes 1 — producing a 16-bit hash. Block averaging is excellent at absorbing JPEG compression noise and encoding artifacts that would cause pixel-level algorithms to produce false negatives. A heavily re-compressed JPEG that looks nearly identical to the original will still produce matching block hashes.
dHash Algorithm
dHash doesn't compare absolute brightness — it compares the direction of brightness change between adjacent pixels. The image is resized to 17×16 (one extra column), converted to grayscale, then each of the 256 pixel pairs is compared: is the left pixel brighter than the pixel to its right? This encodes horizontal brightness gradients. The key insight: two photos of the same scene taken at different exposures will have the same brightness gradient pattern even though their absolute values are very different. dHash is uniquely robust to exposure and brightness edits.
pHash Algorithm
pHash uses the same mathematical foundation as JPEG compression — the Discrete Cosine Transform (DCT). The image is resized to 32×32, converted to grayscale, and a separable 2D DCT is applied. The result is transformed to the frequency domain. The top-left 8×8 sub-region contains the low-frequency coefficients — the "big picture" structure of the image. These 64 values are compared against their mean to produce a 64-bit hash. Low-frequency encoding is highly stable: JPEG compression, format conversion, mild sharpening, slight colour grading, and minor editing all change high-frequency detail while barely touching the low-frequency structure.
wHash Algorithm
wHash uses the Haar Wavelet Transform instead of DCT. The image is resized to 16×16, then a Haar transform is applied row-wise and then column-wise. This decomposes the image into a multi-scale representation — a 2×2 block in the top-left represents the lowest frequencies (the "thumbnail"), while other blocks capture finer detail at different scales. The top-left 8×8 LL sub-band is extracted and thresholded against its mean to produce a 64-bit hash. Wavelet transforms are computationally cheaper than DCT, making wHash faster than pHash while producing very similar quality. It also handles local edits slightly better because the wavelet representation captures spatial structure at multiple scales.
ORB Algorithm
ORB (Oriented FAST and Rotated BRIEF) uses OpenCV.js loaded as WebAssembly — a completely different approach from all other algorithms. Instead of producing one global hash, ORB finds up to 500 distinctive visual landmarks (keypoints) in each image — corners, blobs, and edges — and computes a compact 32-byte descriptor for each. Two images are compared by matching their keypoints spatially using Hamming distance + Lowe's ratio test, which filters out ambiguous matches. ORB is the only algorithm that handles rotation, cropping, and perspective distortion. The threshold for ORB is inverted: higher = stricter (more matching keypoints required). For videos, 3 frames are extracted and the frame with the most keypoints is used for comparison.
Complete Guide — How to Use Any Image & Video Duplicate Finder
Every algorithm page (Color Signature, aHash, BlockHash, dHash, pHash, wHash, ORB) works identically. This guide applies to all of them. Follow these steps to find, review, and clean up duplicate files safely.
🔒 Privacy First — Your Files Never Leave Your Device
📋 Step-by-Step: Scanning a Folder
Choose the Right Algorithm & Open the Page
Use the Quick Pick table above to select the algorithm that fits your use case. Each algorithm has its own page — click "Find Duplicates" on the card above. If you're unsure, start with Color Signature (colour-rich photos) or aHash (large folders where speed matters).
Configure Scan Options
Before selecting a folder, check the toolbar options:
- Fast Mode (on by default) — reads the embedded EXIF thumbnail instead of the full image for JPEG files. 5–10× faster with near-identical accuracy. Turn off only if your JPEGs lack EXIF thumbnails.
- Scan Images — include JPEGs, PNGs, GIFs, WebPs, BMPs in the scan.
- Scan Videos — include MP4, WebM, MOV, MKV files. Videos take longer (3 frames are sampled per file).
- Queue Mode (on by default) — stages files for review before any move or delete action. Highly recommended.
Select a Folder to Scan
Click 📂 Select Folder to Scan to open a native folder picker (Chrome / Edge). Or drag and drop a folder directly onto the page. All image and video files inside are collected recursively, including all subfolders. Files over 40 MB are silently skipped.
Watch the Scan Run
A progress bar shows how many files have been processed. Duplicate groups appear live as they're found — you don't need to wait for the scan to finish before reviewing early results.
Image hashing runs in a background Web Worker — you can switch tabs freely and images keep scanning. Video scanning pauses when the tab is hidden and resumes automatically when you return. Click Stop Scan at any time — results found so far remain visible.
Adjust the Similarity Threshold
After (or during) the scan, use the Similarity Threshold slider to tune how strict the matching is. Releasing the slider instantly re-clusters all results using the new value — no re-scan needed. For ORB, note that the threshold direction is reversed: higher = stricter.
| Low values (0–5) — Very strict | Only near-identical files match. Use for exact copies, lossless vs lossy exports, same file at different bitrates. Very few false positives. |
| Medium values (6–20) — Balanced (default: 10) | Catches resized copies, different formats, minor adjustments, JPEG artifacts. Good starting point for most libraries. |
| High values (21–50) — Loose | Groups images with broadly similar visual structure. More false positives — always review before deleting. |
Review Duplicate Groups
Results are shown in numbered groups. Each group contains files the algorithm considers duplicates at the current threshold. Use these interactions:
- Click a card to select it (blue border)
- Ctrl+Click (Cmd on Mac) to add it to the compare list (purple border)
- Click the 🔍 icon on hover to open a full-size preview with metadata
- Hover a video card to auto-play the video clip
- Right-click any card for a context menu (Copy / Move / Delete / Compare)
- Click & drag on empty space to box-select multiple cards at once
- Ctrl + drag to add to an existing selection without clearing it
Compare Files Side-by-Side
Ctrl+Click two or more cards, then click ⚖️ Compare in the toolbar. A modal shows each file with its full metadata (dimensions, size, format, path) and a similarity percentage. For 3+ files, a full pairwise similarity matrix is shown. Each file in the modal has Copy Name, Move, and Delete buttons for quick actions.
Use Compare to decide which version to keep — check file size (larger is usually better quality), resolution, and format (lossless PNG or TIFF generally beats compressed JPEG).
Move, Delete, or Copy Files
Select files and use the toolbar buttons. With Queue Mode on (recommended):
Queue Mode — Review Before You Commit
When Queue Mode is on, clicking Move or Delete stages files instead of acting immediately. Switch to the Move Queue or Delete Queue tab in the sidebar. Review staged files, remove any you change your mind about, then click Move All Files or Delete All Files to execute. The default Move destination is Sakarto-Duplicates, created inside the scanned directory — you can rename it before executing.
📊 What Each Algorithm Finds — and Doesn't
| Scenario | Color Sig. | aHash | BlockHash | dHash | pHash | wHash | ORB |
|---|---|---|---|---|---|---|---|
| Exact byte-for-byte copies | ✓ | Best | ✓ | ✓ | ✓ | ✓ | ✓ |
| Resized versions (different resolution) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Re-compressed / different format | ✓ | ✓ | Best | ✓ | ✓ | ✓ | ✓ |
| Brightness / exposure adjusted | — | ⚠ | ⚠ | Best | ✓ | ✓ | ✓ |
| Colour-graded (hue/saturation changed) | — | ⚠ | ⚠ | ✓ | ✓ | ✓ | ✓ |
| Same colour palette / scene | Best | — | — | — | — | — | — |
| Watermarked or lightly edited | ⚠ | ⚠ | ⚠ | ✓ | Best | ✓ | ✓ |
| Rotated or mirrored copies | — | — | — | — | — | — | Best |
| Cropped or perspective-warped | — | — | — | — | — | — | Best |
| Very large folder (speed priority) | — | Best | ✓ | ✓ | ⚠ | ✓ | Avoid |
| Videos as well as images | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ⚠ Best-keypoint |
💡 Tips for Best Results
⚠️ Known Limitations
⌨️ Quick Reference — All Controls
| Button / Action | What it does |
|---|---|
🔄 New Search | Reload and start a fresh scan |
📋 Copy (N) | Copy selected filenames to clipboard. N = count selected. |
📂 Move (N) | Move selected files or stage them in the Move Queue |
🗑️ Delete (N) | Delete selected files or stage them in the Delete Queue |
✕ Deselect All | Remove selection from all cards |
⚖️ Compare (N) | Open compare modal for Ctrl+clicked files. Needs 2+. |
🔇 Videos | Toggle mute/unmute for all video cards on the page |
Queue Mode checkbox | Stage files for review before executing. Recommended on. |
Fast Mode checkbox | Use EXIF thumbnail for JPEG. Much faster. On by default. |
Scan Images / Videos checkboxes | Include or exclude each media type from the scan |
Similarity Threshold slider | Controls matching strictness. Re-clusters instantly on release. ORB: higher = stricter (inverted). |
Click card | Select / deselect the file (blue border) |
Ctrl + Click card | Add / remove from compare list (purple border) |
Click & drag (empty area) | Box-select multiple cards at once |
Ctrl + drag | Add to existing selection without clearing it |
Right-click card | Context menu: Copy / Move / Delete / Compare |
🔍 hover icon on card | Open full-size preview with metadata and action buttons |
Hover video card | Auto-play the video clip |
📥 Download List | Export all duplicate groups as a plain-text report |
⭐ What Users Say
"The ORB algorithm is mind-blowing — found rotated scans I had no idea were duplicates. Nothing else catches those."
"I love that it explains what each algorithm actually does. Finally understand why pHash is better than aHash for my edited photos."
"Color Signature is brilliant for photo collections. It found near-identical colour-palette shots I never would have caught manually."