tocmo f9164b4fa0 Add Debian package and Gitea APT repository support
debian/control, postinst, prerm, postrm — standard dpkg package lifecycle
debian/files/opt/dupfinder/dupfinder-setup.sh — interactive setup:
  checks Docker, detects NVIDIA GPU, prompts for photos/data paths,
  writes docker-compose.override.yml with GPU reservation if present,
  pulls image from registry (builds from source as fallback)
debian/files/usr/local/bin/dupfinder — CLI wrapper:
  setup / start / stop / restart / status / logs / open / update
debian/files/etc/systemd/system/dupfinder.service — systemd unit,
  guards against starting before setup has run
debian/build-deb.sh — builds .deb and uploads to Gitea package registry;
  prints the exact apt sources.list line on success

Install on any Debian/Ubuntu machine:
  echo "deb [trusted=yes] http://192.168.1.64:3000/api/packages/tocmo0nlord/debian bookworm main" \
    | sudo tee /etc/apt/sources.list.d/dupfinder.list
  sudo apt update && sudo apt install dupfinder
  sudo dupfinder setup

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 01:42:45 -04:00
2026-04-04 23:55:42 -04:00

Duplicate Finder

A self-hosted Docker web app that scans a photo/video library, detects duplicates using four methods, and lets you review them in a gallery UI. No files are ever moved, renamed, or deleted — all decisions are recorded in SQLite only.

Quick start

# 1. Edit docker-compose.yml — set your photos volume path
# 2. Build and run
docker compose up -d --build
# 3. Open http://localhost:8765
# 4. Enter folder path in UI and click Scan

Volume mounts

Container path Purpose
/photos Your photo library — mounted read-only
/data SQLite database persistence

Edit docker-compose.yml to point these at your NAS paths.

Detection methods

Method Color Description
SHA-256 Blue Byte-identical files
Perceptual hash Purple Visually similar photos (hamming ≤ 10)
EXIF timestamp + device Amber Same camera, same moment
File size + dimensions Gray Same size and resolution (low confidence)

Scan modes

Mode Description
Incremental Only re-hashes changed/new files. Prior decisions preserved.
New files only Indexes newly added files. Existing decisions untouched.
Rebuild groups Re-runs detection on existing index. No re-hashing.
Full reset Wipes everything and scans from scratch.

Google Takeout

The scanner automatically detects Google Takeout folder structures and reads .json sidecar files to restore correct capture timestamps and original filenames. Takeout files are flagged in the UI.

What "redundant" means

Marking a file redundant only writes to the database. Nothing is moved, renamed, or deleted. This tool produces a decision record only. A separate tool handles file actions.

Tech stack

  • Python 3.12, FastAPI, Uvicorn
  • SQLite (stdlib sqlite3)
  • Pillow, imagehash, pillow-heif
  • Vanilla JS single-page frontend
  • Docker / docker-compose
Description
No description provided
Readme 507 KiB
Languages
Python 53.5%
HTML 34%
PowerShell 12.2%
Dockerfile 0.3%