- Lightbox now fetches /image?path=<encoded> from review server
- Removes full-res base64 embedding from HTML (much smaller page)
- Thumbnails still embedded as base64 for fast initial load
- Added urlencode/urldecode helpers
- Removed make_fullres_data_uri function
- New ignore_db module with SQLite-backed dismissal storage
- Groups flagged as not-a-dupe are persisted to ~/.config/deduper/ignores.db
- Fingerprint based on sorted SHA256 hashes (content-stable)
- Ignored groups filtered out on subsequent runs
- Review UI: green "Not a dupe" button per group
- Dismissed groups fade out immediately in browser
- DEDUPER_DB_DIR env var to override DB location
- 4 new unit tests for ignore_db
- 29 tests passing
- Thumbnails vs originals no longer grouped as similar
- Added file_size to ImageEntry
- find_duplicate_groups now checks min size ratio for similar pairs
- New API: find_duplicate_groups_with_size_ratio for custom ratio
- New test: similar_groups_filtered_by_size_ratio
- 24 tests passing
- Launches local HTTP server with dark-themed review UI
- Side-by-side image comparison per duplicate group
- Checkbox selection + delete confirmation
- Shows file size and path per image
- Exact/similar badges per group
- Shutdown endpoint for clean exit
- Magic byte format detection (fixes misnamed screenshots)
- 23 tests passing
- Fixes misnamed files (e.g. JPEG saved as .png) being skipped
- Uses image::ImageReader with guessed format from content
- Fixes Android screenshots with wrong extension being skipped
- New test: misnamed_jpeg_as_png_still_scanned
- 22 tests passing