Getting the most out of Dupe.

Dupe finds byte-identical duplicate files on your Mac and helps you reclaim disk space — safely. This guide covers every option, what's compared, what's never deleted, and how the safety nets work.

Step 1

Picking what to scan #

When Dupe opens, a settings panel sits on the right with everything that goes into a scan: where to look, what kind of files to surface, and a couple of advanced toggles. Sensible defaults mean you can usually just hit Return and let it run — but every knob is there if you want it.

Selected scan roots show as removable chips along the top; the body of the window is one big drop target.

Everywhere — the default

Out of the box Dupe scans your whole home folder — Documents, Desktop, Downloads, Pictures, Movies, Music, and anything else you've created under ~/. The scan button reads Scan Everywhere, and the right panel shows a friendly "Your home folder" callout so you know what's being swept.

This is the right starting point for almost everyone. The deny-lists and exclusion rules described later mean Everywhere mode won't show you system files, IDE artefacts, or anything else you didn't put there yourself — even though the scanner technically walked past them.

Specific folders

Flip the toggle to Select Location and the panel grows a list. Click Add folder… and the standard macOS picker opens — pick one or many folders, and they show up as removable chips in the list. The scan button updates to reflect what you've chosen: "Scan Pictures", "Scan 3 Folders", and so on.

Multiple roots are supported. If you've got duplicates spread across, say, ~/Pictures, an external drive, and a folder on the Desktop, add all three — Dupe enumerates each in turn and treats the combined set as one pool when looking for matches.

You can also drop folders into Dupe from Finder to add them in this mode. If you leave the list empty Dupe falls back to your home folder rather than running a no-op scan.

Looking for…

The first section of the settings panel is a five-way picker that narrows what kinds of files get considered at all:

  • Everything (default) — the broadest scan. Everything except system files, source code, build artefacts, and a curated deny-list of things you wouldn't recognise as yours. This is what most people want.
  • Documents — PDFs, Office files, Pages/Numbers/Keynote, text/markdown/CSV, EPUB, ODT/ODS/ODP.
  • Photos — JPEG, PNG, HEIC/HEIF, TIFF, GIF, BMP, WebP, RAW formats (CR2, NEF, ARW, DNG, ORF), plus SVG, EPS, AI and PSD.
  • Videos — MP4, MOV, M4V, AVI, MKV, WMV, FLV, WebM, MPEG/MPG, 3GP.
  • Audio — MP3, M4A, AAC, WAV, AIFF, FLAC, OGG, Opus, WMA, ALAC.

When you pick a specific kind, Dupe uses a strict allow-list of extensions — only those file types are even hashed. Choosing Photos on a 200,000-file Pictures library is dramatically faster than Everything, because the scanner skips past anything that isn't an image as soon as it sees the extension.

Note that .ts is deliberately not in the Videos list. For most Mac users it's a TypeScript source file, not an MPEG transport stream — and in Everything mode it's filtered out as source code anyway.

Step 2

How Dupe compares files #

Dupe only ever calls two files duplicates if they are byte-for-byte identical. Same name, same modification date, same EXIF, even same visual content — none of that matters. The contents have to match to the bit, every bit, every time.

Reading every byte of every file on disk would be glacial, so Dupe uses a three-pass strategy. Each pass throws out files that can't possibly have a twin, so by the time the slow check runs, it's only looking at the small fraction that survived the cheap ones.

Each pass throws out files that can't have a twin, so the expensive full-file hash only runs on the survivors.

Pass 1 — group by file size

The scanner walks every chosen folder, stats each file, and groups them by size in bytes. This is essentially free — no file is opened, let alone read. Two files of different sizes cannot be byte-identical, so any size group that ends up with a single file is discarded right here.

Files smaller than the minimum file size (default 4 KB) are skipped before they even reach this pass — duplicates of tiny files rarely amount to anything worth surfacing. You can change the floor in Scan settings (Any size, 4 KB, 100 KB, 1 MB, or 10 MB).

Pass 2 — quick hash of the first 4 KB

For each size bucket with more than one file, Dupe reads the first 4 KB of each and SHA-256 hashes that head. Files whose 4 KB head hash is unique within their bucket can't possibly be duplicates — the first 4 KB already differ. They're discarded and never read further.

This pass kills off almost every false collision. Two files of the same size that aren't actually the same will, in practice, differ in their first few kilobytes — and we don't have to touch the rest of the file to find out.

Pass 3 — full-file SHA-256

Whatever's left — files of identical size with identical first 4 KB — gets a full SHA-256 hash, streamed 1 MB at a time so even multi-gigabyte video files don't blow up memory. Two files with the same full-file hash are byte-identical with overwhelming, cryptographic certainty.

The matching files are bundled into a group, sorted by creation date (oldest first), and surfaced in the results. Anything that didn't match anyone is discarded for good.

Why SHA-256, not just a byte compare? Hashing lets the scanner compare every file in a bucket in one pass — read each once, key by hash, done. A pairwise byte-compare would be quadratic in bucket size and would need every file open at once. SHA-256 collisions on real files don't happen; the chance is smaller than your Mac being hit by a meteorite mid-scan.

Safety

What Dupe never touches #

The whole point of a duplicate finder is to remove files — so it matters a great deal that the only things you're ever asked to make decisions about are your own content. Dupe filters out anything that could conceivably belong to macOS, an app, or the tooling on your machine.

System locations are always excluded

The scanner refuses to enumerate any of the following, full stop — they're not in the exclusion list because the user added them, they're baked in and can't be removed:

  • ~/Library — every Mac app's preferences, caches, and saved state.
  • ~/.Trash — files already on their way out.
  • ~/.cache — local caches.
  • /System, /Library, /private — macOS itself.
  • /Applications — every installed app.
  • /usr, /bin, /sbin, /var, /cores, /dev — Unix system trees.

Trashing a file in any of these places could plausibly brick an app or the OS itself, so it's a hard line. They appear in the Skip these folders section of the settings panel with a lock icon — visible, so you know they're there, but greyed out and non-removable.

Everything-mode filters

When you scan in Everything mode (the default), Dupe runs a five-layer filter on every file it sees before it'll consider it a candidate:

  1. No extension — Makefiles, LICENSE, COPYING, and friends. If macOS can't tell us what it is, we don't ask you to make decisions about it.
  2. Bogus-shape extension — anything longer than 8 characters or containing non-alphanumeric characters. This catches precompiled-header artefacts like NSPageController.h-3ERL2UTBZJF9C and similar generated names.
  3. Anything containing "swift".swift, .swiftmodule, .swiftdoc, .swiftinterface, .swiftdeps, and so on. Swift build output is voluminous, duplicated by design, and not your content.
  4. Curated deny-list — about 150 extensions covering source code (.ts, .py, .go, .rs…), config files (.json, .yml, .toml…), build artefacts (.o, .dylib, .xcodeproj…), databases (.sqlite, .db…), and OS metadata (.plist, .DS_Store, .icns…).
  5. UTType conformance — Dupe asks macOS itself whether the file is source code, an executable, a Unix executable, or a symlink, regardless of how the extension is spelled. This catches the long tail your deny-list missed.

Anything that survives all five is presumed to be content you'd recognise as your own — photos, documents, archives, downloads, whatever you actually put there.

Package contents and symlinks

macOS app bundles, .framework folders, document packages (.pages, .numbers, .key) are all really folders pretending to be files. Dupe respects that — the enumerator uses .skipsPackageDescendants, so it never descends inside them. A .pages file gets compared as a single document, not as the dozens of XML and image parts that live inside.

Symbolic links are skipped by default. Following them can produce loops, double-counting, or accidental escapes outside the tree you asked to scan. You can flip Follow symlinks on in Scan settings if you have a specific reason to.

Hidden files and dotfiles are also skipped by default, via .skipsHiddenFiles. Flip Include hidden files on if you need to clean up something like an old .Trashes on an external drive.

Step 3

Reading the results #

When the scan finishes, the window switches into the results view. Either you'll see an "All clean" hero (nothing was duplicated — your Mac is tidy) or a list of duplicate groups.

Groups sorted by reclaimable bytes — one suggested keeper per group, the rest queued for the Trash.

Groups

A group is a set of files with identical contents. Each group row shows the file kind icon, a representative filename, the number of copies, the per-file size, and the wasted bytes — how much you'd reclaim by trashing all but one copy.

Inside a group, individual copies are listed by their full path (with ~ abbreviated for your home folder), creation date, and modification date. Photos, videos, documents, audio, archives, and fonts each get a kind-appropriate icon so you can scan the list visually.

Reclaimable totals

The brand bar at the top of the window updates live with two numbers: how many duplicate groups were found, and how many bytes you could reclaim if you trashed every duplicate copy (keeping one of each). The byte total updates as you action groups, so you can watch your reclaimable headroom shrink in real time.

Sort order

Groups arrive sorted by biggest reclaim firstwasted bytes, which is the per-file size times the number of extra copies. A group of three 2 GB videos (4 GB of waste) ranks above twenty duplicated 200 KB images (3.8 MB of waste). Working top-down means each click reclaims the most space possible.

Step 4

Picking which copy to keep #

A duplicate group is only useful if you decide which copy stays. Dupe gives you three ways to do that: a single-click suggestion, bulk auto-pick strategies, and a full review screen.

The suggested keeper

Every group has a built-in suggestion: the file with the earliest creation date, with ties broken by the shortest path. The intuition is that the oldest copy closest to the root is usually the original — the later, more deeply nested ones are usually the duplicates.

The suggestion is highlighted in the results row with a small indicator so you can see what Dupe would pick. You're never forced to go with it — every copy in the group is selectable on its own.

Auto-pick strategies

For bulk actions, Dupe offers four strategies — each is a simple, pure rule applied to every group at once:

  • Keep oldest, trash newer copies. Often the "real" original — newer ones are usually copies. The default.
  • Keep newest, trash older copies. When you've been editing in place and the latest version is what you want.
  • Keep file closest to root. Trash deeply-nested duplicates first; useful when you've ended up with copies inside copies inside Downloads.
  • Keep simplest filename. Trash files like foo (2).jpg and keep foo.jpg. macOS's auto-rename collision behaviour generates a lot of these.

Strategies decide which file stays in every group; everything else goes to the Trash. You can always preview the picks before actioning them.

Reviewing a group by hand

Click into any group and the review sheet opens — a side-by-side of every copy with a thumbnail, full path, size, and creation date. Click the keeper, hit Keep this, trash the rest, and the group disappears with a tidy animation. Or press S to skip the group entirely and come back to it later.

Files keep their identity throughout — once a copy is trashed, whatever's left in the group continues to be matched. If only one file remains after an action, the group is automatically removed (it isn't a duplicate any more).

Safety

Deleting safely #

Trash, never permanent

Dupe only moves files to the macOS Trash. It never uses unlink, never bypasses the recycle bin, never offers a "delete permanently" option. Even after a 500-file bulk action you've still got the OS Trash as a safety net.

Under the hood, every action is routed through NSWorkspace.recycle — the same system call Finder uses when you press ⌘⌫ on a file. The result is identical: the file moves to ~/.Trash (or the .Trashes folder of the volume it lives on, for external drives), and from there it stays around until you empty it.

Undo from Finder

If you change your mind about a file you trashed, just open Finder's Trash, right-click the file, and choose Put Back. macOS restores it to its original location. Dupe doesn't track this — the file simply reappears where it was, and the next scan will pick it up again if it's still a duplicate.

If a file has moved or been deleted between the scan and the action — say you cleaned up in Finder while reviewing in Dupe — the action is silently skipped. The lifetime counter only ticks up for files that were actually trashed.

Reference

Ignored folders & exclusions #

The Skip these folders section of the scan settings panel has two layers: a non-removable system layer and an editable user layer.

System excludes

The system layer is the lock-icon row labelled System Resources. Expanding it reveals the eleven always-on system paths described in What Dupe never touches. You can collapse the row to keep the panel tidy, but you can't remove the paths — they're computed at runtime and always re-applied.

Your own excludes

Below the system row you can add any number of your own paths to skip. Click Add folder to skip…, pick one or more folders, and they appear as removable chips. Common reasons to use this:

  • A code project in your home folder that's full of intentional duplicates (lockfiles, vendored dependencies, node_modules).
  • A backup folder that's supposed to mirror another folder.
  • A media library managed by another app — Photos.app, Music.app — where you want the app, not Dupe, to be the source of truth.
  • An external drive you don't want included when scanning Everywhere.

Excluded paths skip both the folder itself and everything inside it. If you exclude ~/Projects, no file anywhere under that tree is even enumerated, let alone hashed.

You can also reset all your scan paths — both the scan roots and the exclusions — back to defaults from the Scan settings tab. That sets you back to "Everywhere" with no user excludes (the system excludes are always there).

Reference

Keyboard shortcuts #

Start scan R
Start scan (from intro)
Cancel scan .
Choose scan folders… O
Skip group in review S
Confirm action / proceed
Cancel sheet / close review
Settings ,
Search this guide K
Preferences

Settings #

⌘, opens Settings. There are five tabs.

General

  • Theme. System, Light, or Dark. Default System — follows whatever your Mac is set to.
  • Lifetime — Duplicates removed. The total number of duplicate files you've trashed with Dupe on this Mac, ever. Read-only.
  • Lifetime — Storage reclaimed. The total bytes reclaimed from those duplicates. Also read-only.

Scan

  • Looking for. The default file-kind filter for new scans. Default Everything.
  • Min file size. Files smaller than this are never even stat'd. Options: Any size, 4 KB, 100 KB, 1 MB, 10 MB. Default 4 KB.
  • Include hidden files. Descend into hidden directories and consider dotfiles. Default off.
  • Follow symlinks. Follow symbolic links during enumeration. Default off — avoids loops and double-counting.
  • Reset folder list to defaults. Clears your specific scan roots and user exclusions, returns to "Everywhere".

License

Where you enter your license key, see remaining free actions, and deactivate this Mac if you're moving Dupe to another machine. Hosts the activation card when unlicensed, and the deactivate button when licensed. See the next section for what the free tier looks like.

Updates

  • Check for updates automatically. Periodic background check, on by default.
  • Download updates in the background. Pre-fetches the installer when an update is available so you can apply it instantly.
  • Check for Updates Now. Force a check immediately. Shows the date of the last successful check next to it.

Dupe updates itself in place — no App Store involved.

About

Version & build number, a link to re-show the welcome window for the current version, and a "Find and reclaim duplicate files" tagline so you remember what app you opened.

Trial

Free trial & licence #

Dupe is free to scan and review forever — every feature in this guide that finds duplicates is unlocked from day one. What's gated by the free tier is actioning them.

You get 25 lifetime free actions on this Mac — that is, 25 individual files you can trash through Dupe before you need a licence. The brand bar starts showing a small "X free actions left" pill once you're down to ten or fewer. Once you hit zero, the activation window appears the next time you action a duplicate, and it stays until you either buy a licence or activate one you already have.

Buy a licence once for $14.99 and it's yours forever on this Mac — no subscription. Or pick up Unlimited and you get Dupe plus every other General Software app for one monthly fee.

The 25-action counter is lifetime, on this Mac. Reinstalling Dupe doesn't reset it — that's by design. Buying a licence wipes the counter and unlocks unlimited cleanup forever.

Activated Macs can be moved between machines: hit Deactivate license on this Mac in Settings → License, then activate the key on the new Mac. The slot is released server-side immediately.

Dupe revalidates licences against our server every six hours while it's running, and once on launch. If you've been offline for more than seven days it'll prompt you to reconnect — but a brief outage never locks you out.

Tips

Things worth knowing #

My scan is taking forever — what can I do?

Dupe gets dramatically faster when it has less to look at. Three easy wins: switch Looking for from Everything to a specific kind (Photos, Videos, etc.); raise the Min file size from 4 KB to 1 MB or 10 MB; or narrow the Search in list to a specific folder rather than your whole home directory. You can also cancel any scan with ⌘. and tweak the settings without losing anything.

Two files look identical but Dupe didn't match them.

They aren't byte-identical. The most common reason for two "obviously the same" files to differ is metadata — a JPEG re-exported from Photos gets a fresh thumbnail, EXIF, and colour profile, so the bytes differ even if the pixels don't. Dupe is intentionally strict here; lossy "visually similar" matching gets things wrong in ways you can't recover from.

I trashed something I needed back. Can I get it?

Yes — open Finder's Trash, right-click the file, and choose Put Back. macOS restores it to its original location. Dupe never empties the Trash, and never deletes permanently.

Will Dupe work on an external drive?

Yes — switch to Select Location and add the drive as a scan root. The first scan will be slower than internal storage because of drive throughput, but every later pass benefits from the OS's file cache. Trashed files go to the drive's own .Trashes folder, not your home Trash.

Does anything leave my Mac?

No. File names, paths, hashes — none of it is transmitted. The only network calls Dupe makes are licence validation (the key, not the filenames) and update checks. The scan itself is 100% local.

Can I trust SHA-256 for this?

SHA-256 produces a 256-bit fingerprint. For two files to share one, they have to be byte-identical or you'd have to win an astronomical lottery — the kind cryptography depends on never happening. Every commercial duplicate-file finder worth its salt uses the same approach.

That's everything Dupe does.

navigate open close