-
released this
2026-05-23 12:19:31 -04:00 | 755 commits to dev since this releasePatch release rolling up two post-migration fixes.
Fixes
- Serve
/images/<path>from disk: without this route, the SPA catch-all swallowed every thumbnail/original URL and returnedindex.html, causing the aspect-ratio-shaped grey placeholders in Showcase and Gallery. Added a guardedsend_from_directoryroute registered before the SPA fallback.
Features
/api/migrate/cleanupmigrator: targeted destructive cleanup — deletes everyimage_recordattributed to one artist (CASCADE handlesimage_tag,image_provenance,series_page,tag_suggestion_rejection), unlinks originals + thumbnails on disk, optionally sweepsimport_taskrows under a givensource_path_prefix, removes emptyimport_batchrows, and finally deletes the artist row. Built for the IR-migration rescue case where the scan derived a bogusimagerepoartist from a mismatched bind-mount layout. Honorsdry_runfor a safe preview; requiresforce: trueto bypass the pre-migration backup guard.
Operator workflow for the IR re-do
After pulling this image and force-updating services:
# 1. Dry-run to verify scope (no writes) curl -sX POST http://curator.traefik.internal/api/migrate/cleanup \ -H 'Content-Type: application/json' \ -d '{"slug":"imagerepo","dry_run":true,"force":true}' # 2. Actually wipe the IR import curl -sX POST http://curator.traefik.internal/api/migrate/cleanup \ -H 'Content-Type: application/json' \ -d '{"slug":"imagerepo","force":true,"source_path_prefix":"/import/imagerepo"}' # 3. Poll until complete curl -s http://curator.traefik.internal/api/migrate/runs/<id> | jqThen change the IR bind mount in
docker-compose.ymlfrom/var/lib/imagerepo/images:/import/imagerepo:ro→/var/lib/imagerepo/images:/import:roso the scan sees<artist>/<file>as the top level. Re-trigger scan, then re-runtag_apply(the manifest at/images/_migration_state/ir_tag_manifest.jsonsurvives the cleanup).Downloads
- Serve