This tool lets you create an index of your local storage (e.g. NAS) and checks if local files are duplicates or need to be backed up.
No bloat. No cloud. No hash scanning. Just filename, extension, size and date — fast and deliberate.
Coming soon
1. Add an INDEX via "+ New" (supports one or multiple source paths)
2. Select an INDEX from the dropdown
3. Hit "Rescan" to build or refresh the index
4. Pick a local SCAN folder to compare
5. Optionally enable "Include subfolders"
6. Hit "Compare" — results appear instantly
7. Use filters, checkboxes and action buttons to clean up
| Symbol | Color | Default | Meaning |
|---|---|---|---|
| NEW | Yellow | #f6f787 |
File not found in INDEX — keep it or back it up |
| MAYBE | Pink | #f4b4f2 |
Same name+ext found, but size differs >1% — check manually |
| DUPE | Green | #d4e9da |
Same name+ext+size — very likely a duplicate |
- Multi-path INDEX — each index can span multiple source folders (e.g. "All Movies" =
A:\moviez+A:\gopro) - Subfolder overlap detection — adding a subfolder of an already-listed path is blocked with a clear message
- Path list sorted alphabetically — always tidy, regardless of add order
- Fast scanning — SQLite with indexed lookup, no hashing, no network thrashing
- ESC to cancel scan — abort a running index build at any time; partial count is shown
- Subfolder option — SCAN folder can optionally include subfolders (checkbox)
- Filter bar — All / NEW / MAYBE / NEW & MAYBE / DUPLICATE with one click
- Persistent filter — active filter is remembered across sessions
- Persistent index selection — last selected index is restored on next launch
- Local file info in result — MAYBE and DUPE rows show local size + date in the filename column
- File Info dialog — right-click -> Info shows LOCAL vs INDEX file details side by side (resizable)
- Checkboxes — select individual files or use Select All / Deselect All (filter-aware)
- Move to Recycle Bin — safe delete, recoverable
- Permanent Delete — with confirmation dialog
- Copy to clipboard — right-click -> Copy puts the file into the Windows clipboard, paste it anywhere in Explorer (Ctrl+V)
- Copy selected — action bar "Copy" button copies all checked files to clipboard at once (multi-file paste supported)
- Explore Local — right-click -> opens Explorer with the local file selected
- Explore Index — right-click -> opens Explorer with the INDEX match selected (disabled for NEW files)
- Right-click context menu — Explore Local / Explore Index / Copy / Info / Move to Recycle Bin per single row
- Tab-aware Reset in Settings — Reset button resets only the active tab (Colors or Exclude Patterns) to defaults
- Exclude patterns — skip files like
desktop.ini,*.tmp,thumbs.db - Customizable colors — pick your own background colors for each status
- App icon — custom
.icoincluded - Window position memory — saves on move/resize, skips maximized state
- Last SCAN folder — restored automatically on next launch
- ESC to cancel compare — abort a running comparison at any time
| Button | Action |
|---|---|
New |
Create a new index (one or multiple paths) |
Edit |
Add or remove paths from the selected index |
Rescan |
Rebuild the index for the selected entry |
Rename |
Rename the selected index entry |
Delete |
Remove the index entry and its database (no confirmation) |
Gear |
Open settings (colors, exclude patterns) |
Running from source:
pip install send2trash pywin32
python SimpleDuplicateChecker.pyRunning as .exe: no Python, no extra installation needed — everything is bundled.
pyinstaller --onefile --windowed --icon=icon.ico --name SimpleDuplicateChecker SimpleDuplicateChecker.pyThe .exe will be in the dist/ folder. Copy it anywhere together with icon.ico — it creates
SimpleDuplicateChecker.config and an indexes/ folder next to itself on first run.
SimpleDuplicateChecker.exe <- the app (after building)
icon.ico <- app icon (copy next to exe)
SimpleDuplicateChecker.config <- settings + index registry (JSON)
indexes/
a1b2c3d4e5f6.db <- index database (one per entry)
9f8e7d6c5b4a.db
{
"indexes": [
{
"uuid": "a1b2c3d4e5f6",
"label": "NAS Complete",
"paths": ["A:\\"],
"last_scan": "03.04.2026 18:12",
"file_count": 727495
},
{
"uuid": "9f8e7d6c5b4a",
"label": "All Movies",
"paths": ["A:\\moviez", "A:\\gopro", "A:\\drohnen"],
"last_scan": "03.04.2026 19:00",
"file_count": 12483
}
],
"last_scan_folder": "C:\\Users\\Me\\Downloads",
"last_index": "NAS Complete",
"last_filter": "green",
"window": { "width": 1200, "height": 750, "x": 100, "y": 80 },
"colors": {
"green_bg": "#f6f787",
"yellow_bg": "#f4b4f2",
"red_bg": "#d4e9da"
},
"exclude_patterns": ["desktop.ini", "thumbs.db", ".DS_Store"]
}Note on config key names:
green_bg,yellow_bg,red_bgreflect the original traffic-light logic, not the actual display colors. Current defaults: NEW=yellow, MAYBE=pink, DUPE=green. These keys are intentionally unchanged for backwards compatibility.
| Field | Used |
|---|---|
| Filename (without extension) | yes |
| Extension | yes |
| File size | yes - tolerance +-1% |
| Date modified | displayed only, not used for classification |
| Hash | not used - by design |
INDEX: always recursive - indexes the full subtree of all configured paths.
SCAN folder: flat by default - enable "Include subfolders" for recursive scan.
- Build an INDEX for your NAS share (once, then rescan every few days)
- Pick a local folder to clean up as SCAN folder
- Set filter to NEW - copy those files to NAS in the background
- Hit Compare again - filter stays on NEW, showing only what's left
- Filter to DUPLICATE - select all -> Move to Recycle Bin
- Filter to MAYBE - use right-click -> Info to compare details
- v1.0 - Scan & compare, traffic light, filter, checkboxes, delete actions
- v1.1 - Include subfolders option, app icon, version number
- v1.2 - Multi-path INDEX entries, NEW & MAYBE filter, persistent filter state
- v1.3 - File Info dialog, local size/date in filename column
- v1.3.1 - Info window resizable, remove horizontal scrollbar
- v1.3.2 - Remember selected index across sessions
- v1.3.3 - Fix: filter no longer resets after Compare
- v1.3.4 - Save window geometry on move/resize, skip maximized state
- v1.3.5 - Edit button for index entries
- v1.3.6 - Delete index button (removes entry + .db file)
- v1.3.7 - Fix NameDialog size/cancel, auto-scan non-root paths
- v1.4 - Unified index type (multi-path only), simplified UI
- v1.4.1 - Fix Edit button visibility after delete or cancelled scan
- v1.4.2 - Subfolder overlap detection, version shown in dialog
- v1.4.3 - ESC cancels index scan, Rescan removed from Edit dialog
- v1.4.4 - Path list sorted alphabetically on add
- v1.4.5 - Rename button for index entries
- v1.5 - Copy to clipboard (single via right-click, multiple via action bar); file sizes shown with 3 decimal places; button order New → Edit → Rescan → Rename
- v1.6 - Explore Local / Explore Index in right-click menu (opens Explorer with file selected; Explore Index disabled for NEW files)
- v1.6.1 - Tab-aware Reset button in Settings; *.tmp added to exclude pattern examples; note added that patterns only affect SCAN comparison
| Package | Purpose | License |
|---|---|---|
send2trash |
Move files to OS Recycle Bin | BSD |
pywin32 |
Copy files to Windows clipboard (CF_HDROP) | PSF |
pyinstaller |
Build standalone .exe (optional) | GPL |
All other functionality uses Python stdlib only (tkinter, sqlite3, json, threading, fnmatch).
MIT - see LICENSE