immich-culler LIVE — deletions are real
e53954f6dfa1

Settings

Status ready

Immich
v3.1.0 http://ix-immich-server-1:30041
Database
Postgres 18.2 read-only, vchord 0.5.3
Mode
live deletions are real
Build
e53954f6dfa1 · /health
Deletions are currently real.

Libraries and API keys

Each key resolves to its own account. The owner UUID is never configured — it comes from the key, so a mislabelled key is caught here rather than after it has trashed the wrong library.

LibraryKeyResolves toReplace
Beck …Ttww from .env ✓ beckgoodloe@gmail.com
deb99775-cc33-4fca-a5f8-7422b2f3c6c2
locked — edit IMMICH_API_KEY_BECK in .env
Kenzie …TAwE from .env ✓ mackenzie.g.roan@gmail.com
d0791a46-6a82-43c7-a36f-ff4d3d9e3c47
locked — edit IMMICH_API_KEY_KENZIE in .env

Keys are issued per account in Immich → avatar → Account Settings → API Keys, with these permissions: asset.read · asset.view · asset.delete · user.read · stack.read · stack.create · stack.delete. Stored in /config/config.json, which never leaves the NAS.

The three stack.* permissions are what let a stack be taken apart — dissolved before the deletion, and rebuilt afterwards from whatever survived. Without them a group containing stacked photos refuses to confirm rather than deleting half of it.

Library — Beck

Photos
13,406 on the timeline
Videos
798
To review
1,857 photo groups (8,987 photos)
Last scan
2026-08-13T12:13:30 — done
Stacked, reviewable
120 Assets that sit in an Immich stack. Every one of them is reviewed individually — each is its own tile and its own decision, and members of a stack are grouped together on screen. On confirm the stack is dissolved, the unticked members are trashed, and whatever survives is re-stacked, or left as a standalone photo if only one is kept. Counts change only after a scan — the queue is stored, so a stack split by a code change stays collapsed until you rescan.

What can be grouped at all

Every signal has a precondition. A photo meeting none of them can only ever be offered on its own, however obvious its duplicate — so this is the first thing to read when grouping looks like it is missing things.

SignalCoversNeeds
Burst 11,840 of 13,406 EXIF make and model. Exports frequently strip both.
Visual similarity 13,406 of 13,406 A CLIP embedding. Missing ones are Immich's Smart Search job, not this app.
Immich duplicates 55 Immich's own duplicate detection having run.
Stacks 108 Stacked in Immich, by you or by auto-stacking.
No signal at all 0 Can never be grouped. These reach single review only.

Last scan

Photos considered 39,716 already-decided ones are skipped
Grouped 15,882 into 6,090 groups
Left as singles 23,834
Links by signal burst 27,120 · stack 1,636 · duplicate 0 · similarity 0
No camera identity 9,479 invisible to burst linking

A scan finds groups of similar photos — burst-captured, already stacked in Immich, or visually alike. It never deletes anything, and it skips whatever you have already decided about.

The review queue is stored, not recomputed per page. Until a scan runs, Review keeps serving the groups the last one built — so after any change to how grouping works, nothing on the Review screen changes until you press this.

Grouping and recommendations

Similarity threshold

How alike two photos must be to land in the same group. Lower is stricter. There is no universally correct value — it depends on the library — so this re-groups over cached distances and answers instantly instead of needing a rescan to evaluate.

0.12

Set the value you settle on in Similarity threshold below, then Save and scan again.

Burst window (s) shots from one camera this close together are one moment
Similarity threshold
Similarity window (days) without this, every beach photo ever taken becomes one group
Max group size
Hide groups smaller than Groups below this size are served as single photos instead. Nothing is ever hidden by it.

What makes a keeper

Weights for the pre-ticked recommendation. Album membership is deliberately absent — 78% of the library is in an album, so it separates nothing.

Sharpness
Resolution
File size
Favorited
Faces in shot

Performance

Preview cache (MB) 189 MB used
Fetch workers 533 photos scored

Cleanup

Video clips left behind when the photo half of a Live Photo was deleted. They are invisible everywhere in Immich, so nothing else will ever surface them.

Orphaned clips
5, 9 MB — review them

Start over

Clears every decision — kept, trashed and skipped alike — for all 2 libraries, then rescans. Every photo becomes reviewable again as though this app had never been run.

Not an undo. Photos already trashed in Immich stay trashed — this clears the record of decisions, it does not reverse them. To bring deleted photos back, use Immich's own trash screen while they are still inside its 30-day window.

Kept: the deletion audit trail, and the sharpness and CLIP caches. Those hold no decisions, and discarding them would only mean recomputing hours of identical work.

Advanced

Test the delete path on one asset — shows the database state before and after, and the exact request sent. This is how the delete path was proven before the review screen existed; use it after any change to how deletion works.

Progress and the action log. To check the app's account of itself against the database, run verify.sh on the NAS — the app must not be the only witness to its own behaviour.