-
v26.06.04.0
StableCI / lint (push) Successful in 2sCI / backend-lint-and-test (push) Successful in 12sCI / frontend-build (push) Successful in 19sCI / integration (push) Successful in 3m2sBuild images / sign-extension (push) Has been skippedBuild images / build-ml (push) Successful in 6sBuild images / build-web (push) Successful in 6sreleased this
2026-06-04 23:21:01 -04:00 | 356 commits to dev since this releaseEverything 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_datesort 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+ denormalizedartist_id; retired sidecar synthetics.
Downloads
-
Extension 1.0.7 (signed XPI cache)
StableCI / lint (push) Successful in 3sCI / frontend-build (push) Successful in 20sCI / backend-lint-and-test (push) Successful in 32sextension / lint (push) Successful in 14sBuild images / sign-extension (push) Successful in 3m17sBuild images / build-ml (push) Successful in 3m28sCI / intimp (push) Successful in 4m26sBuild images / build-web (push) Successful in 3m42sCI / intapi (push) Successful in 9m32sCI / intcore (push) Successful in 10m18sreleased this
2026-06-03 14:21:00 -04:00 | 613 commits to main since this releaseInternal 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)
StableCI / lint (push) Successful in 2sBuild images / build-ml (push) Failing after 2sCI / frontend-build (push) Successful in 19sCI / backend-lint-and-test (push) Successful in 22sextension / lint (push) Successful in 8sBuild images / sign-extension (push) Successful in 1m51sBuild images / build-web (push) Failing after 4sCI / intimp (push) Successful in 3m38sCI / intapi (push) Successful in 7m20sCI / intcore (push) Successful in 7m45sreleased this
2026-06-01 01:45:55 -04:00 | 673 commits to main since this releaseInternal 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
StableCI / lint (push) Successful in 5sCI / frontend-build (push) Successful in 22sCI / backend-lint-and-test (push) Successful in 28sCI / intimp (push) Successful in 3m54sBuild images / sign-extension (push) Has been skippedBuild images / build-web (push) Successful in 1m1sBuild images / build-ml (push) Successful in 1m21sCI / intapi (push) Successful in 7m31sCI / intcore (push) Successful in 8m0sreleased this
2026-06-01 00:20:24 -04:00 | 471 commits to dev since this releaseWhat's in
PR #39 (merge commit
856e910).Sidecar synthetic anchor cleanup (
6fc8ae3)SourceService.list()hidesurl LIKE 'sidecar:%'anchors from/api/sourcesby default — no more phantom subscriptions in the Subscriptions hub.importer._source_for_sidecarprefers 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 Nnow classifies as TIER_LIMITED regardless of return code (was gated on1, 4, fell through to UNKNOWN_ERROR when gallery-dl set other exit bits). Paywalled-post syncs stop bumpingconsecutive_failures.- Gallery-dl subprocess timeout dropped from 900s → 870s — wins the race against Celery's 900s soft_time_limit so
TimeoutExpiredalways captures partial output. Empty-log "stranded by recovery sweep" events become rare. yt-dlp>=2025.1added 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
released this
2026-05-28 00:45:19 -04:00 | 529 commits to dev since this releaseDownloads-tab dashboard pass + a deep backend task-resilience overhaul. PR #31 → merge commit
319e8c1(parent[1] = dev HEADdcfe55dverified).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_embedvideo 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_countcaps stuck-task re-queues; a repeatedly-crashing row is failed with a diagnostic + its file path. - L3 subprocess isolation —
safe_proberuns 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.0alembic 0026 applies automatically. No extension change this release (still ext-1.0.5). Optional: set
FC_AUTO_REFETCH_CORRUPT=1in the worker env to enable automatic one-shot re-download of poison-pill files that have a re-pollable source.Downloads
- ml
-
released this
2026-05-27 21:36:11 -04:00 | 742 commits to main since this releaseInternal 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
released this
2026-05-27 21:34:28 -04:00 | 537 commits to dev since this releaseSubscribeStar + 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 HEADdf6d89cverified).Highlights
SubscribeStar source checks work again. gallery-dl was aborting on
HTTP redirect to /age_confirmation_warningbecause the_personalization_idage 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 injects18_plus_agreement_generic=truewhen 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")withrequests' 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=1fallback. Backend now injects host-only PHPSESSID/CSRF duplicates at cookies-file materialization. Extension v1.0.5 also respectsc.hostOnlynatively for fresh captures.Platforms package refactor.
services/platforms.pyis nowservices/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, declareINFO = PlatformInfo(...), add the import. Sidecar parsing, cookie materialization, and/api/platformspick it up automatically.Showcase IR-parity restored. Press
Ranywhere on/showcaseto reshuffle. Stagger fade-in entry animation on initial load and shuffle (12px translateY, 0.25s, 60ms per item). Honorsprefers-reduced-motion. Infinite-scroll appends are silent.Secure-Context audit + fixes. The Cleanup → Min-Dimensions Delete button was silently no-op'ing because
crypto.subtleis undefined on plain-HTTP origins (homelab posture). Audited the wholefrontend/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; newexpectedTokenOverrideprop onDestructiveConfirmModaldecouples UI label from wire-format token. Bankedfeedback_no_secure_context_apis.mdso future agents catch the pattern in design.Migrations
None.
Deploy
docker compose pull && docker compose up -d --force-recreate app worker ml-worker scheduler webOr pin:
image: git.fabledsword.com/bvandeusen/fabledcurator:v26.05.27.2No 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
hostOnlynatively); reinstall is optional.Downloads
-
v26.05.27.1 Stable
released this
2026-05-27 17:13:52 -04:00 | 545 commits to dev since this releaseSubscriptions hub + post-card merge + sidecar audit. PR #29 → merge commit
88e53e5(parent[1] = dev HEADaa28bddverified).Highlights
Subscriptions hub —
/credentialsand/downloadscollapsed into a single/subscriptionsparent 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 ofSettings → Importinto the hub's Settings subtab. Legacy/credentialsand/downloadskeep working as bookmark-safety redirects. NewGET /api/downloads/statsendpoint 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.
usePostModalStoreand the modal mount deleted.Sidecar audit fixes across all non-Patreon platforms (after the operator's sample dump):
- SubscribeStar
id/post_idconfusion → 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_urlwas a file CDN URL → new_derive_post_url(platform, data)synthesizes proper post permalinks per platform. - Discord
messagebody field added to description fallback chain. - SubscribeStar
titlealways 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 overwritesexternal_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 Pixivpost_urlbackfill 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.ymlrace fix — tag-push's "Download signed XPI" step now pollsreleases/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.1Alembic 0024 + 0025 will apply automatically. Watch the worker log for the per-platform migration counts (
0025: subscribestar — read N sidecars, updated N Posts, ...).Downloads
- SubscribeStar
-
released this
2026-05-27 11:36:17 -04:00 | 759 commits to main since this releaseInternal 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
released this
2026-05-27 11:32:11 -04:00 | 554 commits to dev since this releasePostCard 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), masonryPostImageGrid, empty-thumb placeholder.ArtistPostsTabwidened to 1600px.get_postreturns uncapped thumbnails for the modal grid. - IR-style tag-suffix input —
TagAutocompletedrops the kind dropdown. Typecharacter:Saberand the prefix is parsed at the API boundary (parse_kind_prefixutil, KNOWN_KINDS = character/fandom/series). Explicitkind=argument still wins. - Drop
meta+ratingtag kinds — alembic 0023 deletes existing meta/rating rows (CASCADE clears related image_tag/alias/allowlist/suggestion_rejection/reference_embedding/series_page) and recreates thetag_kindENUM without them. - Extension v1.0.4 — MV3 CSP override omitting
upgrade-insecure-requestsso 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.0Then reinstall the extension from the new
ext-1.0.4XPI on the release page.Downloads
- PostCard redesign — container-query responsive layout, full-post