• bvandeusen released this 2026-05-26 16:41:34 -04:00 | 587 commits to dev since this release

    PR #23 → main. Pinned head SHA fb41b90; verified merge commit 88cfb3d second parent matches.

    Features

    • Thumbnail backfill — new backfill_thumbnails Celery task + POST /api/thumbnails/backfill + Pinia store + ThumbnailBackfillCard wired into MaintenancePanel. Three-predicate scan (NULL / missing on disk / corrupt magic bytes) re-enqueues generate_thumbnail for repair candidates.

    • Artist view redesign — sticky frosted ArtistHeader (matches TopNav blur recipe, hosts name + image/post stats + tab strip). Three lazy tabs: Posts (default when post_count > 0), Gallery (fallback), Management. ?tab= URL state, cross-artist store reset, document.title per artist.

    • ErrorDetailModal redesignrow prop carries the failure's task name / queue / target / duration / started / retries / worker / celery-id / args alongside the error message. Pre-block contrast fix (theme background token vs auto-derived surface-variant).

    Fixes

    • psycopg 65535-parameter ceiling, three sitesrecover_interrupted_tasks, /api/import/retry-failed, /api/import/clear-stuck all folded their SELECT ids → UPDATE WHERE id IN (...) patterns into UPDATE … WHERE … RETURNING.

    • ImageProvenance race + alembic 0021 — _apply_sidecar's existence-check + INSERT planted (image_record_id, post_id) duplicates under concurrent workers, breaking .scalar_one_or_none() on every later deep-scan rederive (MultipleResultsFound). Migration dedupes + adds uq_image_provenance_image_post. Importer switched to savepoint + IntegrityError recovery.

    • Source per (artist, platform), not per post + alembic 0022 — filesystem importer was creating one Source row per imported post URL (Atole's artist page had 406 Sources where 1 was right). Migration collapses per-artist-per-platform groups, reparents Posts + ImageProvenance, merges Post collisions. Importer now reuses the existing subscription Source.

    • Extension race-safetyExtensionService._find_or_create_artist + _find_or_create_source switched to the same savepoint + IntegrityError pattern.

    • Copy button on plain HTTPnavigator.clipboard is Secure-Context-gated. New copyText() helper falls back to document.execCommand('copy') via off-screen textarea. Applied to ErrorDetailModal, ExtensionKeyBar, BrowserExtensionCard.

    Migrations

    • 0021_image_provenance_unique — dedupe + UNIQUE(image_record_id, post_id).
    • 0022_source_per_artist_platform — collapse per-post Sources, reparent Posts + ImageProvenance, merge Post collisions.

    Deploy

    Pull :latest, force-update app, worker, ml-worker, scheduler, web. Alembic auto-applies 0021 + 0022.

    Downloads