Skip to content

Releases: RobertasTa/smart-duplicate-finder

v1.5.2 - the AI consultant finds its briefing

Choose a tag to compare

@RobertasTa RobertasTa released this 28 Aug 08:06

What changed

The "?" → "No answer here? Ask the AI" button now hands the AI assistant a direct link to its briefing file.

Until now the assistant was asked to find AI_CONSULTANT_BRIEF.md in the repository by name. Live testing showed that this sometimes failed: one assistant guessed the wrong branch name, another stumbled on GitHub's web pages and then confidently declared that the briefing does not exist - and answered from guesswork instead. With the direct link, every assistant we tested read the briefing and answered correctly.

The README also gained one line near the top with the same link. That repairs the path for copies of the app that are already installed: their prompt leads to the repository, and the repository now points straight to the briefing.

Nothing else changed - scanning, the report and all four languages are exactly as in v1.5.1.

SHA256

SmartDuplicateFinder.exe
6026f19370c85599de171acd11ded0572e46b097881f70efe0571f11d33b923c

SmartDuplicateFinder-macOS.zip
54246ef2e1bb6bfcee964d6c9816497a17ce6cdbbe6fefb48d4c4c7cf9ff484c

v1.5.1 - the results are readable on a dark desktop

Choose a tag to compare

@RobertasTa RobertasTa released this 26 Aug 14:56

What changed

If your system uses a dark theme, some rows in the results table were hard to
read - our light row colour with the system's white text on top of it - and you
had to click a cell to see what it said. Section headers had the same mistake in
reverse: a colour for the text, none for the background.

Fixed the same way throughout: wherever the program sets one colour, it now sets
both. The small grey labels no longer use a fixed grey either - they take their
colour from your system's palette, so they stay readable whichever theme you use.

This was never a macOS-only problem. The same thing happens on Windows with
the dark app theme; we had simply never looked, because the machine this is built
on runs dark system chrome with light apps. It was reported by a photographer
running the Mac build, and found on Windows the same evening.

The English README now also explains why the report is a spreadsheet: it is your
file, not our database. Switch on the filters, sort by any column, add your own
columns - "keep", "check later", a note to yourself - and filter by those too.
The program remembers nothing about your decisions; the spreadsheet is where they
live, and it will still open in ten years.

Nothing else changed - same scanning, same reports, same files, same results.

Downloads

  • Windows: SmartDuplicateFinder.exe - portable, no installation.
  • macOS: SmartDuplicateFinder-macOS.zip - unzip and see the README for the
    steps macOS asks for on first run.

Thanks to the reader who took the time to run this on a Mac and write down what
was wrong. That is how this one got found.

v1.5 — pictures turned on their side, and copies in every language

Choose a tag to compare

@RobertasTa RobertasTa released this 26 Aug 11:04

What's new

Pictures turned on their side are found again.

Until now a copy counted as the same picture only if it stood upright. The
camera's own orientation tag was handled, but once the pixels themselves are
rewritten — by an editor, a chat app or a scanner — that tag is gone and the
fingerprint changes completely. Measured before the change: one picture saved
three ways (upright, turned 90 degrees without any tag, mirrored) produced no
group at all.

Every picture now carries eight fingerprints instead of one — four turns and
their mirrors — and only an upright fingerprint is compared against turned
ones, never turned against turned. That last detail matters: turning a
fingerprint loses detail, and comparing two turned ones pulls unrelated
pictures together. On a real 800-photo sample, 25 of the resulting groups
contain a turned or mirrored variant.

The report says how a copy differs, not just that it exists. Two new
notes, which can appear together:

a lower resolution than the rest; a different orientation from the rest

Where a group has a clear majority — three upright copies and one turned —
only the odd one out is named. Where there is no majority, every picture is
named and you decide which one is wrong, because the program will not guess.
A picture lying on its side is often not a copy at all but a mistake: turned
once for a reason and never turned back. Better seen before a batch goes out
to someone.

Copies are recognised in every language the program speaks. Windows names
a copy after its own language — - kopija, - копия, - Kopie — and macOS
writes Copy of …. Only the English and Lithuanian forms were recognised
before: three pairs out of five slipped past unnoticed.

A year in brackets is no longer read as a copy number. Report (2024).pdf
and Budget (2026).xlsx used to confess to being copies of something. Copy
numbers are short — browsers and Explorer count 1, 2, 3 — while four digits at
the end are almost always a year. This one was shipped in v1.4 and affected
the "which one is the original" column.

Pictures that cannot be opened are counted out loud. Damaged files,
unknown formats and images too large for the imaging library were caught and
forgotten. Two real archives held 240 and 285 of them. The scan now says how
many, instead of quietly looking at fewer pictures than it was given.

Where the search reaches — and where it stops

Measured on a real 3437×2409 photograph:

Half size, quarter size found
Turned, mirrored, turned and shrunk found
Cropped by about 2 % found
Cropped by 10 % not found
Darkened by 30 % not found

The last two were never found in earlier versions either — that is the
fingerprint's own boundary, not something that broke. Saying so plainly
seems more useful than letting you discover it on your own photographs.

Honesty notes

  • Adding turned copies briefly broke the commonest case of all: a picture
    shrunk by half stopped being found, because the ordinary fingerprint had
    been routed through the same machinery the rotations use. It is now
    computed exactly as before, bit for bit, with a test that compares against
    the old recipe so it cannot drift again.
  • Verified on 1,500 real photographs: 183 groups against 199 for the old
    upright-only search, largest group unchanged, and exactly as many large
    groups as before — turned copies join their originals without dragging
    strangers along. Speed is unchanged at about 77 pictures per second.
  • Checked on a live 30,122-file scan across five folders including a NAS
    share, in German as well as Lithuanian.

A Mac build — untested by human eyes

There is a macOS build in this release, and it comes with a warning that is
not boilerplate: neither of us owns a Mac. It was compiled on GitHub's own
machines, all 51 tests pass there, and an automated screenshot shows the window
rendering correctly — fonts, buttons, colours. But no person has ever seen it
running on a real Apple computer.

Two things were fixed for it: "open file" and "show in folder" were
Windows-only calls and would have thrown on a Mac. The scan, the report and the
export share the same code on both systems.

macOS will warn you when you open it, because the app is not signed by Apple —
right-click it and choose Open. If that feels wrong to you, don't do it. Czkawka
and dupeGuru ship unsigned the same way, but you are not obliged to trust
anyone's word for that.

If you run it and something is broken, saying so is genuinely useful — that is
the only way we will find out.

Checksums

SmartDuplicateFinder.exe (Windows)

MD5:    d52207d8a723749e3c5365288a97f999
SHA256: A8FBFCD667B33D31B29A18C3F22176AAED97D9497183F1EF419E0273283D7F28

SmartDuplicateFinder-macOS.zip

MD5:    d6cadebd2c83b783d93fbe8218e75701
SHA256: E1D0C081C7F440CA7DB6EFD5A7022FA4631CE5ABEF541F6A2407E2CF5F7349C2

VirusTotal: an unsigned PyInstaller executable always collects a few
generic machine-learning flags — v1.3 was flagged by 4 engines out of 67, all
of them heuristics, while Avast, Avira, BitDefender, ClamAV, Kaspersky, ESET
and Microsoft Defender reported it clean. You do not have to take our word for
it: paste the SHA256 above into virustotal.com
and look for yourself.

🤖 Built together with Claude (Anthropic AI).

v1.4.1 — large photo libraries were losing similar pictures

Choose a tag to compare

@RobertasTa RobertasTa released this 26 Aug 07:52

What's fixed

Large photo collections were quietly losing similar pictures.

Visually similar photos are found through a fingerprint: each picture is
reduced to 64 bits, and pictures whose fingerprints nearly match are grouped
together. To compare them quickly the fingerprints are sorted into groups by
a shared slice, and only pictures inside the same group are compared with
each other.

That grouping had a ceiling of 300. Anything above it was skipped — and
skipped without a word. The result was worse than a slow scan: a larger
photo library could return fewer similar pictures than a smaller one.
Reduced to its clearest form:

Pictures scanned Similar groups found
200 1 group, 200 pictures
320 none at all

Adding pictures did not add results; it made them disappear.

How it was found. Not in tests — by measuring three real archives with
about 180,000 photographs in them:

Archive Pictures Distinct fingerprints Largest group
Home NAS share 54,200 13,341 217
NAS (five shares) 66,537 19,621 334 — over the ceiling
External drive 60,066 28,226 284

The ceiling was not a distant edge case. It was already being crossed on an
ordinary home collection, and the pictures it dropped were never mentioned
to anyone.

One assumption died along the way, and it is worth passing on: collection
size is not what fills a group. The archive with the most fingerprints
had a smaller group than the middle one. What fills a group is how many
near-identical pictures a collection holds — dark frames, scanned documents,
screenshots. A small, uniform archive can cross the ceiling sooner than a
large, varied one.

What changed. The ceiling is a workload limit, not part of the algorithm:
how many pictures count as similar does not depend on it. It now sits at
10,000, which is about 15 seconds of work in the worst case — measured, not
guessed, at 3.3 million comparisons per second. And if it is ever reached,
the scan says so in plain words, in all four languages, instead of leaving
pictures uncompared in silence:

1234 pictures were left uncompared — too many look-alikes in one place
(narrow the folders)

Two new tests cover both halves: that nothing disappears below the ceiling,
and that reaching it is always reported. Both were checked with the fix
switched off first — a test that does not fail without the fix is theatre.

Honesty notes

  • This was our own defect, not a rare edge case, and it had been shipping
    since visual comparison existed. If you scanned a large photo library with
    an earlier version and it reported few or no similar pictures, that answer
    may have been wrong. It is worth scanning again.
  • The fix raises a limit and adds a warning. It does not change which
    pictures are considered similar — the matching rule is untouched.
  • A second, related weakness is known and not fixed yet: pictures far
    above 89 million pixels can be skipped silently by the imaging library.
    It has not yet been confirmed on real files, and it will be treated the
    same way — measured first, then reported to you rather than hidden.

Checksums

MD5:    392c1e4c22beaed322742f1fcad7b1e6
SHA256: 6F2D34B7A7CA562EF817516E21BC03F7BC73805F44785F629C8A542CFB193E95

VirusTotal: an unsigned PyInstaller executable always collects a few
generic machine-learning flags — v1.3 was flagged by 4 engines out of 67,
all of them heuristics, while Avast, Avira, BitDefender, ClamAV, Kaspersky,
ESET and Microsoft Defender reported it clean. Czkawka, a 32,000-star Rust
project, documents the same thing about its own binaries. You do not have to
take our word for it: paste the SHA256 above into
virustotal.com and look for yourself.

🤖 Built together with Claude (Anthropic AI).

v1.4 — which copy is the original, and why

Choose a tag to compare

@RobertasTa RobertasTa released this 25 Aug 17:39

What's new

The report now says which copy looks like the original — and why.
Two new columns in the Duplicates sheet: Most likely the original
and Why. The program reads what the files say about themselves
through their names and locations: the others are named as copies,
the others sit in copy folders, the others sit in temporary folders,
the others sit deeper in folders, the others were created later.

Where nothing tells them apart, the column says "unclear — nothing
tells them apart"
. An honest "don't know" beats a confident-looking
guess, and this program would rather say less than mislead you.

Nothing is marked for deletion and nothing is deleted — this is
information, and the decision stays yours. Other duplicate finders will
happily tick 57 kinds of files for removal without ever telling you why
they picked them. The reason column is the whole point of ours.

A side effect worth mentioning: on a Python .venv the rule reliably
picks the real package over pip's vendored copy of it — requests\
wins over pip\_vendor\requests\. Nobody taught it that; vendored
copies simply always sit deeper.

"Is there a newer version?" — a new panel under the ? menu. The
program never checks for updates by itself, because it has no network
access at all. Instead the panel shows your version and the three ways
to find out: the releases page, a one-click copy of the winget upgrade
command, and asking an AI assistant to check for you. It tells you how
to look
rather than pretending to know.

Each gift now keeps its working files in its own folder. Before
v1.4 Smart Duplicate Finder and Temp Cleaner shared one _darbal
folder on a USB stick, so one could carry off the other's data. Old data
is moved across automatically on first start; service files also got
international names (last_scan.json, activity.log, language.txt).

Smaller things found by hand on a live machine:

  • the junk button now says Clean OS junk files and its tooltip lists
    exactly what it touches — next to a promise that nothing else is ever
    deleted, "junk" alone could be read as your files;
  • the button bar measures itself, so German labels are no longer clipped;
  • counts no longer break grammar in Lithuanian, Russian or German
    ("1 folders" was wrong in every language but English, where it was
    merely hidden behind "folder(s)");
  • the "Why" column no longer falls off the edge of the sheet.

Honesty notes

  • The rules read names, folders and dates — nothing else. They do
    not know your history: if you once moved or renamed a file, the clues
    can point the wrong way. That is why the last word is yours.
  • Two rules were caught accusing the innocent during review and fixed
    before release: files ending in "copy" (Photocopy.jpg) and folders
    merely containing the letters (Copyright materials, Mikroskopija)
    are no longer read as copies.
  • Verified on a live scan of 30,060 real files in four languages,
    including the packed exe — not only in tests.

Checksums

MD5:    e64ebde1ed3dadc193a821e445d76839
SHA256: 583fbe3e06c9412bf9ba6f70de67018ed3584e4d41d76a2458ae5ebb09541a70

VirusTotal: an unsigned PyInstaller executable always collects a few
generic machine-learning flags — v1.3 was flagged by 4 engines out of 67,
all of them heuristics (Wacatac.C!ml, grayware_confidence_60%), while
Avast, Avira, BitDefender, ClamAV, Kaspersky, ESET and Microsoft Defender
reported it clean. You do not have to take our word for it: paste the
SHA256 above into virustotal.com and look
for yourself.

🤖 Built together with Claude (Anthropic AI).

v1.3 — right-click menu, 4 UI languages, HEIC

Choose a tag to compare

@RobertasTa RobertasTa released this 22 Aug 12:56

Smart Duplicate Finder v1.3

What's new

Right-click menu in the results table. Open file / open folder /
copy path. Opening executables (.exe, .bat, .py, …) is
deliberately disabled — this program never launches an unknown program
with one click. Open the folder instead and decide with your own hands.
Same DNA as "never deletes", now applied to launching.

Two new UI languages: Russian and German. Four languages total
(EN / LT / RU / DE), switched inside the app; the built-in user guide
now comes in all four too. And Lithuanian finally reads like real
Lithuanian — proper diacritics throughout the UI.

HEIC/AVIF in the visual similarity scan. An original iPhone .HEIC
now pairs with its resized .jpg copy — even on a Windows machine that
cannot open HEIC itself. Verified live with a real iPhone 13 photo.
This was the top-voted wish (17 👍) in a competing project's tracker.

Updated built-in guides — the honest "why this program deletes
nothing" story, crash-surviving scan memory, and the full format list.

Honesty notes

  • The RU/DE dictionaries were drafted by the author's local AI
    assistant and reviewed line-by-line by Claude; a handful of invented
    German words were caught and fixed in review. If you spot awkward
    wording — please open an issue, it will be fixed with thanks.
  • The exe grew from 44.8 MB to 51.6 MB — that is the price of HEIC
    support (bundled libheif codec DLLs). We measured trimming it and
    documented why it is not possible (BUILD.md).

Every feature in this release was verified by hand on a live machine
by Robertas, including the packed exe.

Checksums

MD5:    3b45c0b547a8d77b31e150dfdb561410
SHA256: 3af1c299a4e842d6fe9367956e7ee5d88d97cd9922a73c1ab7549ea3bef34763

VirusTotal: 4/67 engines flag it - all four
are generic machine-learning heuristics (Wacatac.C!ml, grayware_confidence_60%
and similar), the standard fate of an unsigned PyInstaller exe; the major engines
(Avast, Avira, BitDefender, ClamAV, Kaspersky, ESET) report it clean. False-positive
reports are being filed with the flagging vendors. Don't take our word for it:
the source is public - build the exe yourself with BUILD.md and compare checksums.

🤖 Built together with Claude (Anthropic AI).

v1.2 - Accuracy wave

Choose a tag to compare

@RobertasTa RobertasTa released this 20 Aug 06:02

v1.2 — Accuracy wave

The theme of this release is honesty of numbers and the packaged exe behaving exactly like the source.

Fixed

  • Extension catalog now works in the packaged exe. pletiniai.json was silently unavailable in frozen builds — the most important fix of this release. If you run from source, you were never affected.
  • Rotated photo copies are now found: the visual comparison respects EXIF orientation.
  • Three Lithuanian UI typos (caught during the live pre-release test).
  • File permissions are restored if a junk-file deletion fails halfway.

Improved

  • Honest space math: "can be freed" now counts size × (n−1) per duplicate group and excludes hardlinks — the number you see is the number you can actually reclaim. The UI shows both totals: what duplicates occupy and what deleting the copies would free.
  • Faster deep scan on large files: a 64 KB prefix pre-filter runs before full MD5 for files over 4 MB.
  • Suspects list truncation is now visible in the UI instead of silent.
  • Visual similarity threshold tightened (VIS_DIST 4 → 3) to match the hash-band guarantee — fewer false "similar" pairs.
  • Exe slimmed from 54 MB to 43 MB (unused libraries removed from the bundle).

New

  • ? menu — "About", "User guide", and "No answer here? Ask the AI": step-by-step instructions for a live consultation with the author (the AI that wrote this code) at claude.ai.
  • Portable mode marker migrated to SDF_portable.txt (old portable.txt still recognized).
  • Public test suite in tests/ + CI on every commit.

Integrity

v1.1 — One exe, your language, zero traces

Choose a tag to compare

@RobertasTa RobertasTa released this 06 Aug 13:21

One exe, your language, zero traces

Highlights

  • 🌍 One exe for all languages. The UI language (English / Lithuanian) is
    now switched inside the app — no more separate -en build. First run
    follows your Windows language; after changing, the app offers to restart
    itself. Your choice is remembered.
  • 🔌 Portable mode. A new checkbox keeps all working files (scan cache,
    activity log) next to the exe — perfect for a USB stick. The app leaves no
    traces on the computer and even removes its previously created
    %LOCALAPPDATA% folder. The mode travels with your stick
    (a portable.txt marker, the Notepad++ convention). By default, working
    files now live in %LOCALAPPDATA%\SmartDuplicateFinder (previously
    %TEMP%, where temp cleaners kept eating the scan cache).
  • 📊 Localized Excel report. Sheet names, headers and group labels now
    follow the UI language — the report reads like a document, not a printout
    of internals. The file name stays technical (English).
  • 🛣️ Long paths readable again. Full-path cells now elide in the middle
    (C:\Users\…\photo.jpg) instead of collapsing to C:....

Fixes

  • Fixed a PyInstaller restart trap that could show "Failed to start embedded
    python interpreter"
    after switching the language twice.

Thanks

Every issue in this release was found by live testing on real machines by
Robertas — the human half of this gift. 🐾


SHA-256 (SmartDuplicateFinder.exe):
2879C086FF08DE7BE5E11349F1B8C175A92361574C2D2A26CA87BDD5AFD6D8E7

The exe is unsigned — SmartScreen may warn on first run (More info → Run
anyway
). Requires Windows 10 or newer, 64-bit.

Smart Duplicate Finder v1.0

Choose a tag to compare

@RobertasTa RobertasTa released this 05 Aug 17:40

First public release.

Downloads:

  • SmartDuplicateFinder-en.exe — English UI
  • SmartDuplicateFinder.exe — Lithuanian UI

Portable single-file exe — no installation, no Python required. Runs from a USB stick.

Note: the exe is unsigned (homemade), so Windows SmartScreen may warn on first run — click "More info" → "Run anyway". First start takes a few extra seconds while it self-extracts.

Built with care by Claude (Anthropic AI) together with Robertas. Enjoy the gift!