• v26.06.04.0
    CI / lint (push) Successful in 2s
    CI / backend-lint-and-test (push) Successful in 12s
    CI / frontend-build (push) Successful in 19s
    CI / integration (push) Successful in 3m2s
    Build images / sign-extension (push) Has been skipped
    Build images / build-ml (push) Successful in 6s
    Build images / build-web (push) Successful in 6s
    Stable

    bvandeusen released this 2026-06-04 23:21:01 -04:00 | 356 commits to dev since this release

    Everything on dev since v26.06.01.0. Main CI green at 2a8f7cd (CI #550 + build #549).

    Gallery — in-view search & filtering

    • Phase 1: pinned, deep-linkable filter bar + composable scroll filter (multi-tag AND, artist, media, sort).
    • Phase 2: faceted refine panel with live counts (platform / curation flags / date range).
    • Phase 3: visual "more like this" similarity search over SigLIP embeddings — modal Related strip + gallery takeover.
    • Perf: reveal-tiles-on-decode cascade, single initial fetch, materialized indexed effective_date sort key (HNSW index for similarity).

    Tags

    • Edit a character tag's fandom (tags directory + modal) with collision/merge handling.
    • Create a character with no fandom.
    • "Reset content tagging" admin maintenance action.
    • ML: human-readable Camie suggestion names; preserve digit-only (year) tags.

    Image modal

    • Tag-chip + suggestion kebab menus now open reliably (explicit v-model control).
    • Autofocus tag input; arrow nav from empty input; Esc closes; post-title primary click.

    Subscriptions / downloads

    • Tick/backfill modes + partial-success classifier; soft-time-limit salvage + corrected timeout ladder.
    • Release DB connections across the gallery-dl subprocess; Patreon Mux video fix.

    Other

    • Mobile responsiveness pass (nav hamburger, card layouts, filter bars).
    • Scheduled + manual DB VACUUM ANALYZE with bloat readout.
    • Browser extension 1.0.7 (in-browser cookie verification + probe-and-add).
    • CI perf: integration shards collapsed to one job, Postgres durability relaxed.
    • 2026-06-02 audit batches (g1–g5): race-poisoning, async state leaks, recovery sweeps/retention/timeouts, status-enum fixes.
    • Posts model: nullable source_id + denormalized artist_id; retired sidecar synthetics.
    Downloads
  • Extension 1.0.7 (signed XPI cache)
    CI / lint (push) Successful in 3s
    CI / frontend-build (push) Successful in 20s
    CI / backend-lint-and-test (push) Successful in 32s
    extension / lint (push) Successful in 14s
    Build images / sign-extension (push) Successful in 3m17s
    Build images / build-ml (push) Successful in 3m28s
    CI / intimp (push) Successful in 4m26s
    Build images / build-web (push) Successful in 3m42s
    CI / intapi (push) Successful in 9m32s
    CI / intcore (push) Successful in 10m18s
    Stable

    bvandeusen released this 2026-06-03 14:21:00 -04:00 | 613 commits to main since this release

    Internal cache for the signed XPI consumed by build.yml's build-web job. Not a user-facing FC release.

    Downloads
  • Extension 1.0.6 (signed XPI cache)
    CI / lint (push) Successful in 2s
    Build images / build-ml (push) Failing after 2s
    CI / frontend-build (push) Successful in 19s
    CI / backend-lint-and-test (push) Successful in 22s
    extension / lint (push) Successful in 8s
    Build images / sign-extension (push) Successful in 1m51s
    Build images / build-web (push) Failing after 4s
    CI / intimp (push) Successful in 3m38s
    CI / intapi (push) Successful in 7m20s
    CI / intcore (push) Successful in 7m45s
    Stable

    bvandeusen released this 2026-06-01 01:45:55 -04:00 | 673 commits to main since this release

    Internal cache for the signed XPI consumed by build.yml's build-web job. Not a user-facing FC release.

    Downloads
  • v26.06.01.0 — sidecar synthetic cleanup + tier-gated reclassification
    CI / lint (push) Successful in 5s
    CI / frontend-build (push) Successful in 22s
    CI / backend-lint-and-test (push) Successful in 28s
    CI / intimp (push) Successful in 3m54s
    Build images / sign-extension (push) Has been skipped
    Build images / build-web (push) Successful in 1m1s
    Build images / build-ml (push) Successful in 1m21s
    CI / intapi (push) Successful in 7m31s
    CI / intcore (push) Successful in 8m0s
    Stable

    bvandeusen released this 2026-06-01 00:20:24 -04:00 | 471 commits to dev since this release

    What's in

    PR #39 (merge commit 856e910).

    Sidecar synthetic anchor cleanup (6fc8ae3)

    • SourceService.list() hides url LIKE 'sidecar:%' anchors from /api/sources by default — no more phantom subscriptions in the Subscriptions hub.
    • importer._source_for_sidecar prefers real (non-sidecar) Sources over synthetic anchors when both exist for the same (artist, platform). Fixes silent attachment of gallery-dl Posts to the wrong row.
    • alembic 0028 collapses the synth+real coexisting case on deploy — repoints Posts / ImageProvenance / DownloadEvent.source_id onto the real Source, deletes the synthetic. Lone synthetics (no real twin) intentionally stay; they anchor imported content.

    Download event classifier + missing dep (66f19d6)

    • [patreon][warning] Not allowed to view post N now classifies as TIER_LIMITED regardless of return code (was gated on 1, 4, fell through to UNKNOWN_ERROR when gallery-dl set other exit bits). Paywalled-post syncs stop bumping consecutive_failures.
    • Gallery-dl subprocess timeout dropped from 900s → 870s — wins the race against Celery's 900s soft_time_limit so TimeoutExpired always captures partial output. Empty-log "stranded by recovery sweep" events become rare.
    • yt-dlp>=2025.1 added to requirements.txt — video posts download cleanly.

    Deploy

    Run alembic upgrade — 0028 is included. Existing DPMaker-shape rows collapse to one row; phantoms disappear from the UI; tier-gated Patreon syncs render as 'ok'.

    Downloads
  • v26.05.28.0 Stable

    bvandeusen released this 2026-05-28 00:45:19 -04:00 | 529 commits to dev since this release

    Downloads-tab dashboard pass + a deep backend task-resilience overhaul. PR #31 → merge commit 319e8c1 (parent[1] = dev HEAD dcfe55d verified).

    Highlights

    Downloads dashboard. Row restyle (colored status chips + labels, status-keyed left edge, color-coded platform chips, file-count chips, error pills, per-row Retry/Details/Open-artist). Date-grouped collapsible sections — Today / Yesterday / Last 7 days / Earlier — with failed runs pinned to the top of each section.

    Task timeouts, sized per workload. No more healthy long-running tasks getting marked failed:

    • ml tag_and_embed video branch: 15min/20min limits; recovery sweep per-queue (ml=25min).
    • Archive imports split into import_archive_file (30min/35min) — they run the per-member pipeline inline. Both recovery sweeps are archive-aware (40min) so a running archive isn't preempted.

    Three-layer poison-pill defense (a corrupt/oversized input that crashes the worker can no longer loop forever):

    • L1 circuit breaker — recovery_count caps stuck-task re-queues; a repeatedly-crashing row is failed with a diagnostic + its file path.
    • L3 subprocess isolation — safe_probe runs video (ffprobe) and archive (bomb guard + integrity test) decode in a separate process; a crash is contained and returns a clean failure.
    • L2 one-shot re-download — a failed downloaded file that resolves to a pollable Source gets its corrupt copy deleted and one source re-check queued (manual button + env-gated auto). Filesystem-only imports report no re-fetchable source.

    Migrations

    alembic 0026_import_task_recovery_count_refetched — additive (recovery_count int default 0, refetched bool default false), no backfill.

    Deploy

    docker compose pull && docker compose up -d --force-recreate app worker ml-worker scheduler web
    Or pin: image: git.fabledsword.com/bvandeusen/fabledcurator:v26.05.28.0

    alembic 0026 applies automatically. No extension change this release (still ext-1.0.5). Optional: set FC_AUTO_REFETCH_CORRUPT=1 in the worker env to enable automatic one-shot re-download of poison-pill files that have a re-pollable source.

    Downloads
  • bvandeusen released this 2026-05-27 21:36:11 -04:00 | 742 commits to main since this release

    Internal cache for the signed XPI consumed by build.yml's build-web job. Not a user-facing FC release.

    Downloads
  • v26.05.27.2 Stable

    bvandeusen released this 2026-05-27 21:34:28 -04:00 | 537 commits to dev since this release

    SubscribeStar + HentaiFoundry cookie quirks fixed, platforms package refactor, Showcase IR-parity (R-key reshuffle + stagger entry animation), full Secure-Context API audit. PR #30 → merge commit 9075d8e (parent[1] = dev HEAD df6d89c verified).

    Highlights

    SubscribeStar source checks work again. gallery-dl was aborting on HTTP redirect to /age_confirmation_warning because the _personalization_id age cookie expires annually and can't be refreshed from a logged-in browser session (SubscribeStar's frontend JS suppresses the popup via localStorage). Backend now injects 18_plus_agreement_generic=true when materializing subscribestar cookies for gallery-dl — mirrors gallery-dl's own login-flow workaround.

    HentaiFoundry source checks work again. gallery-dl uses cookies.get("PHPSESSID", domain="www.hentai-foundry.com") with requests' EXACT domain matching, but the extension was rewriting host-only cookies to subdomain-wide form. The lookup missed, gallery-dl fell into a 401'ing ?enterAgree=1 fallback. Backend now injects host-only PHPSESSID/CSRF duplicates at cookies-file materialization. Extension v1.0.5 also respects c.hostOnly natively for fresh captures.

    Platforms package refactor. services/platforms.py is now services/platforms/, one module per platform. Each module owns ALL its quirks (cookie augmentation, post-URL derivation, sidecar-key chain overrides). Adding a new source is a three-step recipe: drop the module, declare INFO = PlatformInfo(...), add the import. Sidecar parsing, cookie materialization, and /api/platforms pick it up automatically.

    Showcase IR-parity restored. Press R anywhere on /showcase to reshuffle. Stagger fade-in entry animation on initial load and shuffle (12px translateY, 0.25s, 60ms per item). Honors prefers-reduced-motion. Infinite-scroll appends are silent.

    Secure-Context audit + fixes. The Cleanup → Min-Dimensions Delete button was silently no-op'ing because crypto.subtle is undefined on plain-HTTP origins (homelab posture). Audited the whole frontend/src/ for the same shape — found a second site (BulkEditorPanel.vue) with the same bug plus a latent kind-vs-token mismatch that would have failed even on HTTPS. Both fixed by having the backend hand the canonical confirm token back in the dry-run/preview response; new expectedTokenOverride prop on DestructiveConfirmModal decouples UI label from wire-format token. Banked feedback_no_secure_context_apis.md so future agents catch the pattern in design.

    Migrations

    None.

    Deploy

    docker compose pull && docker compose up -d --force-recreate app worker ml-worker scheduler web

    Or pin: image: git.fabledsword.com/bvandeusen/fabledcurator:v26.05.27.2

    No browser-side re-export needed — both SubscribeStar and HentaiFoundry fixes work with your already-stored cookies. The extension v1.0.5 update is forward-compat only (fresh captures preserve hostOnly natively); reinstall is optional.

    Downloads
  • v26.05.27.1 Stable

    bvandeusen released this 2026-05-27 17:13:52 -04:00 | 545 commits to dev since this release

    Subscriptions hub + post-card merge + sidecar audit. PR #29 → merge commit 88e53e5 (parent[1] = dev HEAD aa28bdd verified).

    Highlights

    Subscriptions hub/credentials and /downloads collapsed into a single /subscriptions parent with three internal subtabs (Subscriptions default | Downloads | Settings). ?tab= query-param routing mirrors ArtistView. GS-style visuals across all three: color-coded platform chips, stat-chip downloads dashboard with popover filters + maintenance menu + per-row retry, credentials card grid in Settings. Download + schedule settings moved out of Settings → Import into the hub's Settings subtab. Legacy /credentials and /downloads keep working as bookmark-safety redirects. New GET /api/downloads/stats endpoint pinned by two integration tests.

    PostCard absorbs PostModal — the wider PostCard layout had enough real estate to be the canonical post surface. Compact state unchanged; click-to-expand inline yields full title, mosaic of ALL post images (uncapped, lazy-loaded), full sanitized-HTML description, attachment download pills. Mosaic image clicks still open ImageViewer scoped to the post. usePostModalStore and the modal mount deleted.

    Sidecar audit fixes across all non-Patreon platforms (after the operator's sample dump):

    • SubscribeStar id/post_id confusion → external_post_id chain reordered to (post_id, id, index, message_id). Stops multi-image SubscribeStar posts from fragmenting into N Post rows in the DB going forward.
    • SubscribeStar/Pixiv/HF/Discord post_url was a file CDN URL → new _derive_post_url(platform, data) synthesizes proper post permalinks per platform.
    • Discord message body field added to description fallback chain.
    • SubscribeStar title always empty → synthesized from content first line (already in v26.05.27.0 with alembic 0024 backfill).

    Migrations

    • alembic 0024_backfill_post_title_from_description (idempotent) — synthesized titles for any Post with NULL/empty title and a non-empty description.
    • alembic 0025_fix_subscribestar_post_ids (idempotent) — for SubscribeStar/HF/Discord, walks each Post's sidecar from disk and overwrites external_post_id (subscribestar) + post_url (all three). Then merges SubscribeStar fragments grouped under one source by their new shared external_post_id (same ImageProvenance pre-delete + repoint dance as alembic 0022). Pure-SQL Pixiv post_url backfill in the same migration. Posts whose ImageRecord.path doesn't resolve on disk are reported per-platform in the migration output for a future deep-scan.

    Infrastructure

    build.yml race fix — tag-push's "Download signed XPI" step now polls releases/tags/ext-<version> every 30s for up to 10 min before failing. main-push's sign-extension takes 1–5 min for AMO; tag-push used to race past it and 404. This release will exercise the fix in production.

    Deploy

    docker compose pull && docker compose up -d --force-recreate app worker ml-worker scheduler web
    Or pin: image: git.fabledsword.com/bvandeusen/fabledcurator:v26.05.27.1

    Alembic 0024 + 0025 will apply automatically. Watch the worker log for the per-platform migration counts (0025: subscribestar — read N sidecars, updated N Posts, ...).

    Downloads
  • bvandeusen released this 2026-05-27 11:36:17 -04:00 | 759 commits to main since this release

    Internal cache for the signed XPI consumed by build.yml's build-web job. Not a user-facing FC release.

    Downloads
  • v26.05.27.0 Stable

    bvandeusen released this 2026-05-27 11:32:11 -04:00 | 554 commits to dev since this release

    PostCard redesign + IR-style tag suffix + drop meta/rating tag kinds + extension v1.0.4 CSP fix.

    Highlights

    • PostCard redesign — container-query responsive layout, full-post PostModal (Patreon-style, stays in-curator), masonry PostImageGrid, empty-thumb placeholder. ArtistPostsTab widened to 1600px. get_post returns uncapped thumbnails for the modal grid.
    • IR-style tag-suffix inputTagAutocomplete drops the kind dropdown. Type character:Saber and the prefix is parsed at the API boundary (parse_kind_prefix util, KNOWN_KINDS = character/fandom/series). Explicit kind= argument still wins.
    • Drop meta + rating tag kinds — alembic 0023 deletes existing meta/rating rows (CASCADE clears related image_tag/alias/allowlist/suggestion_rejection/reference_embedding/series_page) and recreates the tag_kind ENUM without them.
    • Extension v1.0.4 — MV3 CSP override omitting upgrade-insecure-requests so plain-HTTP self-hosted curator backends are reachable (the default MV3 CSP was silently upgrading every fetch to https).

    Migrations

    alembic 0023_drop_meta_rating_tag_kinds — destructive: DELETEs existing meta/rating tag rows.

    Deploy

    docker compose pull && docker compose up -d --force-recreate app worker ml-worker scheduler web
    Or pin: image: git.fabledsword.com/bvandeusen/fabledcurator:v26.05.27.0

    Then reinstall the extension from the new ext-1.0.4 XPI on the release page.

    Downloads