Skip to content

v2026.9.0

Choose a tag to compare

@github-actions github-actions released this 04 Sep 03:32
· 17 commits to main since this release
605fc48

πŸš€ Features

  • Add one-off local gallery category migration (8c3a580)
  • Expose {category} in the batch import flow (1fdca7e)
  • Carry {category} through batch scan and batch import (7b8d2d8)
  • Derive gallery category from {category} on first discovery (bcc0944)
  • Add stdlib-only helpers for local gallery category (1e76d6a)
  • Unify root browse session state behind a shared kernel (f9b5e2b)
  • Plot outline convention with structured, chapter-linked nodes (9da48ae)
  • FORMAT.md lint and one-click fix behind the API (380e529)
  • Real chapter character counts and authored summaries (e2f312e)
  • Restore a file to an older revision from the history panel (8b1e53e)
  • Support bundled custom extractors (1fdd24b)
  • Repair partial galleries by fetching only missing pages (bbbbfa3)
  • Improve quality and lifecycle (94ddaf4)
  • Demote page polling to WS-disconnect fallback (775488e)
  • Event-driven SWR invalidation bridge (6ea637d)
  • Configurable SwarmUI and captioner service URLs (6a4e13b)
  • Grant read access via explicit gallery permissions (bef378c)
  • Imgproxy responsive delivery, animated hover previews, and scroll-restore refactor (bd40b1c)
  • SauceNAO batch lookup with access filtering and tag anomaly detection (d8458ad)
  • Duplicate conflict resolution, web-clip capture, and browser extension (31662e4)
  • Sharing, merge, version linking, and reading stats (c2f66e7)
  • Dataset captions/export, LoRA & ComfyUI assets, and remote image processing (ae2461c)
  • Server-synced per-user UI preferences and adaptive library layout (2ee7da9)
  • Shared schema, plumbing, and infra for training & collaboration suite (550e514)
  • Add reversible image filters (b972c34)
  • Add library bulk selection (8f24e7d)
  • Build sets from tag queries (69593b8)
  • Add image curation workspace (7559dd0)
  • Add persistent training image sets (422e4c0)
  • Modernize frontend architecture (32ecd41)
  • Add library workbench (027957e)
  • Localize browse enhancements (185420c)
  • Link gallery versions (5e4accc)
  • Add reverse image search (9441946)
  • Add source resource actions (5db2e14)
  • Show gallery file metadata (eb114ab)
  • Surface watched searches (3814096)
  • Sync cloud favorite state (96bfb02)
  • Add random result navigation (b2ed032)
  • Add uploader search shortcuts (ebe1603)
  • Add language search filter (bbc8a36)
  • Show local browse status (b34b4ab)
  • Preserve saved search filters (3e67ca1)
  • Add tag-aware search suggestions (fe53d49)
  • Show gallery language badges (eaa0483)
  • Allow renaming a subscription after creation (1780680)
  • Add Pixiv author collections (a40d37a)
  • Close translation gaps across all locales (aba7ae5)
  • Custom theme, accent picker, reduced-motion, a11y contrast (e0dc939)
  • Translations tab with full browse/search UI (04faac6)
  • Browse/search endpoint for tag translations (2bab188)
  • Health tab on the tag management page (a558373)
  • Tag health report, ignore list, and safe tag deletion (bc40268)
  • Per-process memory self-sampling for the api container (STAB-011) (86653ed)
  • Add Fanbox download policies (b1c641f)
  • Alert and back off on consecutive check failures (2859904)
  • Restore locale detection and translation coverage (120aa8c)
  • Info.json disaster-recovery sidecar in gallery library dirs (41beaff)
  • Batch image hide/restore with multi-select UX upgrade (d03c951)
  • Category picker in create dialog writing into standard canon folders (cece551)
  • Collapsible canon-category sections on work page and search badges (1da41fb)
  • Work-files API client, category types, i18n keys (f430a97)
  • Category counts on chapters endpoint and /works/{work}/files listing (580555f)
  • Category file listing/counts, work-root setting.md as entity note, categorized search hits (1160ce5)
  • Add classify_path canon-category classifier (47a493b)
  • Derive entity names from Setting note filenames (817ac5b)
  • Link recognized entity names in the reader to their cards (6d784d8)
  • Add structured note query view (8e6690a)
  • Add entity card page with appearance timeline (fb2bcb6)
  • Add knowledge graph view (react-force-graph + Quartz-derived filter) (22d55f0)
  • Add knowledge-index API client + i18n keys (e8df585)
  • Add graph/notes/appearances/reindex endpoints (76bcc2f)
  • Add novel_index_job cron + catalog registration (13a4076)
  • Add reindex_all full-rebuild persistence (1cea63e)
  • Add novel_notes/links/mentions schema (triple-write) (eddb51c)
  • Add pure knowledge-index derivation (notes/links/mentions) (b59f8ff)
  • Separate Setting notes from chapters + tolerant frontmatter parse (cdfb9da)
  • Back FAB climbs the hierarchy instead of browser history (1a322da)
  • Add always-reachable BackButton FAB to novel sub-pages (24379a7)
  • Phase 0.5 web authoring β€” create, inline edit, full markdown (dede6e5)
  • Fail api/worker startup fast when DB is behind the schema head (3df7c73)
  • Gate module behind novel_enabled flag (default off) (c6cc9d6)
  • Add git/ssh to backend image and mount novel repo volume (fb860d4)
  • Add search page, history/diff view, repo status bar, backlinks (194d9f8)
  • Add editor with optimistic-lock conflict hint and draft protection (ebc6fcf)
  • Add reader with font/theme settings, act TOC, progress sync, prev/next (c27269e)
  • Add PWA novel API client, works/chapters pages, nav entry, i18n keys (72b2cf3)
  • Add 15-min git sync cron job and catalog registration (bcd4665)
  • Add write endpoint with optimistic lock, commit+push, audit, event (ffb7ee2)
  • Add read/query/progress/preferences endpoints (089ba23)
  • Add novel_read_progress table and users.novel_prefs (triple-write) (1c57267)
  • Add git subprocess wrapper and sync state machine (09a66c5)
  • Add tree scan, read/write, act parse, backlinks, keyword scan (4727ced)
  • Add path-traversal-safe repo path resolver (e5e290b)
  • Add useEhBrowse hook (loadMore+abort, URL sync, snapshot restore) (fabbc21)
  • Add buildParams, snapshot (300 cap) and URL identity mapping (27210bd)
  • Add e-hentai browse reducer core with queryKey identity reset (195e0af)

πŸ› Bug Fixes

  • Pass dbinit build context to the backend Docker build (bc8dc38)
  • Decouple browse/download concurrency and stop charging cache hits against EH rate budgets (8329d4f)
  • Write gallery_tags alongside tags_array in the progressive path (3497a34)
  • Rebuild missing library dirs for non-link galleries (27b0df6)
  • Report OOM kills and runs that never shut down (c6f1df9)
  • Stream the gallery ZIP instead of buffering it in memory (57225ec)
  • Alert on unreclaimable memory and report the kernel peak (109f697)
  • Give interrupted local imports a terminal status and recovery path (266bead)
  • Dispatch decodes on a dedicated bounded executor (85635bd)
  • Derive thumbnails from a downscaled base to bound decode memory (4bf441f)
  • Recover pages served by weak-DH H@H nodes (1c3f843)
  • Stop an append from dropping a pending scroll capture (4a139f2)
  • Let back step through root Pixiv surfaces (45e1df3)
  • Let back step through E-Hentai tabs instead of out of the section (afdf103)
  • Make the edge-swipe gesture back out the same way the FAB does (a3ab134)
  • Prevent upward virtual-grid scroll jumps (933cd3e)
  • Handle SSR storage and EH proxy timeouts (f54b3e4)
  • Skip existing galleries during discovery (8e4ffeb)
  • Add durable FIFO source admission (dc2e4b8)
  • Stop thumbnail 429 storm on browse pages (56a7ead)
  • Dedupe storage mounts and fix cache memory display (eb3ae2d)
  • Raise memory for large thumbnails (e9b22e1)
  • Allow high-resolution source images (f86f409)
  • Pin per-file identity across a link import (88757b7)
  • Exclude fenced code blocks from FORMAT lint and auto-fix (fc3dd48)
  • Report the local commit when the push leg fails (4c5c162)
  • Keep the git lock held for the whole operation (e53b2d8)
  • Resolve a live blob location for tier-3 comparisons (256f75a)
  • Bound the venv lifecycle lock wait (29ed78f)
  • Collapse duplicate auto-discover enqueues (964fac5)
  • Capture base_sha when the summary editor opens (3f2b2c9)
  • Preserve multiline YAML when replacing a frontmatter key (d0feef4)
  • Bind each image to its own external location (4b29238)
  • Preserve gallery identity across moves (c7f1873)
  • Abort link imports when source moves (a3ab2f7)
  • Bind external paths per image (f6c5c89)
  • Preserve control-plane state under pressure (ec46d1a)
  • Persist authoritative source page totals (1320a74)
  • Prevent fallback source identity collisions (9336965)
  • Lock venv lifecycle against active jobs (2a80d09)
  • Stop video playback from exhausting tab memory (f499142)
  • Align bundled extractor consumers (c6acbee)
  • Apply and clear saved search filters (3b1e51a)
  • Keep E-Hentai favcat names untranslated (3b6f5dc)
  • Give the pre-Reader states their own way back (3a0349c)
  • Flatten images before thumbhash to avoid alpha encoder crash (c4c5c30)
  • Keep the status badge when a gallery has no source_url (eece70d)
  • Judge a failed run by what it fetched, not what it holds (c461ed5)
  • Require the source page list to cover the whole gallery (76bc159)
  • Surface partial galleries and report partial status honestly (b5a5b16)
  • Make review pipeline safe and incremental (5e6e6d6)
  • Make similarity scans context-aware (2d05a7a)
  • Localize remaining PWA surfaces (a0ea0f9)
  • Keep iOS standalone startup off the CacheStorage hot path (c1ab53a)
  • Show current gallery titles (db5995d)
  • Prevent swipes from triggering double-tap zoom (71af186)
  • Center-crop EH sprite thumbnails (ce901ed)
  • Prevent accidental mobile gestures (4239cb5)
  • Preserve browsing position across gallery visits (196230e)
  • Claim gallery URLs that lost their trailing slash (5d2f7f2)
  • Close high-risk lifecycle gaps (f9cdc6a)
  • Restore locale after refresh (2fcad38)
  • Keep shared caches fresh (e021de7)
  • Select only the clicked category from the "all" state (af95c4c)
  • Keep the restored item buffer aligned with its cursor (9a18dff)
  • Restrict image auto-retry to the EH image proxy (77d9974)
  • Fall back to the original image when imgproxy variants fail (7aa9efd)
  • Drop the guessed preview.webm hover request (74de60a)
  • Invalidate collection/dataset/tag caches on their WS events (22559d5)
  • Delay animated hover preview to avoid per-card webm loads (e3b73b0)
  • Stop routing pre-generated thumbnails through imgproxy (83b5591)
  • Drop thumbhash blur-up placeholder from page images (25328ac)
  • Percent-encode external media URLs so '#' filenames load (6beb0ad)
  • Render credential flows from plugin schema (93d311c)
  • Surface invalid API key as 403 instead of generic 502 (9d57b9e)
  • Honor scheduled-task enable/cron controls for the dedup tiers (c3d1d23)
  • Derive the folder picker pattern example from a real mount (73b0402)
  • Drop the baked-in LAN host from the default URL (f7ff0a7)
  • Restore single-user image fast path (1093995)
  • Restore media caching lost to the module-boundary hardening (e91bd03)
  • Harden download and media module boundaries (91af972)
  • Route path-addressed media through URI-aware auth subrequest (fd3df83)
  • Enforce per-gallery authorization for path-addressed media URIs (49939bb)
  • Detect library dir collisions between distinct source_ids (c63a704)
  • Re-download upsert no longer clobbers existing gallery metadata (34b8f14)
  • Carry the full EventBus event on every WS message so translation cannot drop fields (43c533b)
  • Clear service worker media and page caches on logout (b875c82)
  • Shorten auth_request cache to 30s to bound session revocation delay (5a8e3ab)
  • Cancelling a re-download no longer deletes the pre-existing gallery (b1a8ac9)
  • Base64-encode imgproxy source so nginx cannot mangle it (ca423a4)
  • Require gallery write access to add or remove manual tags (b621ad4)
  • Remove unimplemented overwrite conflict option (41486ee)
  • Require gallery write access, not just visibility, to process images (804d5b4)
  • Tolerate partial startup shutdown (7976cfe)
  • Preserve galleries on library outages (637b015)
  • Harden queue timeouts and watcher controls (7b314be)
  • Address regressions from the frontend modernization (32ecd41) (208898f)
  • Gallery-dl staged into shared gallery root, wiping concurrent downloads (2f9a497)
  • Stabilize autocomplete suggestions (6881e44)
  • Correct advanced search flags (f919ebb)
  • Keep Latest tab reachable after visiting Popular (5ca9056)
  • Preserve reader progress on app switch (722067d)
  • Redirect legacy Pixiv collection reader URLs (f0f4452)
  • Route Pixiv author collections to gallery reader (24f3d4b)
  • Resolve missing pToken on demand in image proxy (2ebb3ff)
  • Auto-retry transient image errors before latching failure UI (23f8e7b)
  • Repair broken online upgrade and surface failures (67b5bf5)
  • Retire stale AI tags on retag and add clear-ai endpoint (AIT-006) (ee295fe)
  • Retag endpoints honor runtime ai_tagging_enabled toggle (AIT-005) (3ba0608)
  • Honor runtime ai_tagging_enabled toggle and thresholds (AIT-005) (18c00a9)
  • Build Kohya ZIP off the event loop (AIT-002) (ac3a534)
  • Unique page-prefixed arcnames and ascending page order (AIT-004) (7749942)
  • Exclude non-trainable formats from Kohya ZIP (AIT-003) (8eb0ca4)
  • Normalize Kohya captions to trainer conventions (AIT-001) (5311044)
  • Subscription re-checks refetched the user's entire catalog every run (9bae420)
  • Randomize check pacing and stop SAQ 10s default killing group checks (4a4f52a)
  • 429 backoff was a fixed 60s β€” use exponential backoff per N3 design (47f4287)
  • EH plugin claimed all EH URLs but can only download /g/ galleries (197ef97)
  • Per-site rate_limit leaked into every job's global bandwidth cap (509420c)
  • Cookie writeback never fired β€” cookies-update lacked export path (f02e0ef)
  • Image load failure showed infinite spinner + broken icon (8a207f8)
  • Card overlay buttons were invisible tap-traps on touch devices (b7d2a37)
  • Graph shows all chapters, not only ones with entity mentions (e39cbf6)
  • Enqueue knowledge reindex after tree mutations, closing the 24h staleness gap (21e4253)
  • Write CAS file at canonical extension, not the incoming filename's (79f8e3a)
  • Phase 4 removes stale CAS files with no blobs row (71b2648)
  • Root source list derived from whole-library stats, not first page (8557568)
  • Match Phase 1 gallery keys on sanitized source_id (75796cc)
  • Symlink integrity β€” concurrent write race, basename collisions, orphan symlinks (fe0ac57)
  • Scroll-to-top stalls partway on long virtualized lists (37b9bd8)
  • Guard search category badge against non-work categories, drop unused i18n key (d270661)
  • Chapters are work-root main text only, stopping legacy Old/DEMO/extend and setting.md pollution of the knowledge index (a7cd0d8)
  • Stop novels header toolbar overflowing on mobile (990053c)
  • Decode note route segments so entity cards load (66b8728)
  • Split migration 0005 into single-statement executes for asyncpg (d79fc80)
  • Fail migrate loudly on schema/head mismatch + bake init.sql into image (012ca20)
  • Resolve duplicate alembic revision id 0002 (be8ff23)
  • Harden path validation, search scope, and git timeout cleanup (2f168ac)
  • Close git arg-injection, no-op save 500, and optimistic-lock TOCTOU (b278def)
  • Reset_to_origin defaults to current branch, not hardcoded main (6a5cc50)
  • Stop grid cells stretching so keyboard focus ring hugs the card (469d066)
  • Reserve full card info height so next library row stops covering focus ring (4a33f5e)
  • Stop virtual row paint containment from clipping gallery focus ring (265a995)
  • Detach scroll capture in layout cleanup so the router reset cannot poison it (2280d61)
  • Stop unmount snapshot write banking the router's scroll reset (13c3276)
  • Back from a tab-restored sub-page climbs to the section list (09ae628)
  • Restore e-hentai buffer + scroll across in-page tab switches (91b54b3)
  • Close stateRef race that permanently wedged e-hentai infinite scroll (ea09568)
  • Stop e-hentai infinite scroll wedging on all-duplicate pages (feff8e8)
  • Seed e-hentai scroll list when searching from non-search tab (8589088)

⚑ Performance

  • Rule out reconcile candidates before hashing (66357d6)
  • Read each chapter once and off the event loop (21c3c07)
  • Deduplicate the feature-toggle and profile requests (50aec5c)
  • Defer fetches for panels the user has not opened (2f49237)
  • Skip state updates when a download refresh returns identical data (ef8c4aa)
  • Cap glibc malloc arenas in the api container (STAB-011) (461aa2d)

♻️ Refactoring

  • Drop the AI schema and the last of the AI frontend (1d367e0)
  • Remove the captioner, LoRA library, AI settings and export decode (319e896)
  • Remove SwarmUI and the Processable/Taggable capabilities (40af9a9)
  • Remove the training assets page (cd571e3)
  • Remove the WD14 tagging job and its enqueue sites (664a4b9)
  • Drop exhaustive-deps suppressions with stable mutate deps (0a2156a)
  • Compact subscription cards (aae128c)
  • Dispatch incremental discovery through the plugin registry (7cb373f)
  • Implement the Subscribable discovery contract (8a72ab8)
  • Redefine Subscribable around URL-based incremental discovery (aa221d2)
  • Route metadata check-update through plugin registry refreshers (4a51533)
  • Route URL preview through plugin registry previewers (3e405a2)
  • Implement Previewable/Refreshable on the Pixiv source plugin (7b35e4d)
  • Implement Previewable/Refreshable on the EH source plugin (557c406)
  • Formalize Previewable/Refreshable/Subscribable registry capabilities (bd11916)
  • Add PreviewData and RemoteMetadataResult capability models (cf9a86e)
  • Split the monolithic api.ts into per-feature modules (c4458ff)
  • Route fanbox policy and cookie parsing through services (dbed4c4)
  • Access gallery-dl site metadata through services/site_catalog (ea229a0)
  • Extract credential policy into services/download_policy (73409bd)
  • Extract job serialization into services/download_presenter (c51cde6)
  • Backend type-safety hardening, pyright errors 289 -> 135 (4e11cd7)
  • Phase 0.5 cleanup β€” reuse hook, dedup, decouple create from base_sha (3865eaf)
  • Rewrite e-hentai view on useEhBrowse; fix scroll back-nav memory (8bca1e8)

πŸ“ Documentation

  • Note that git-cliff-action must stay in the Actions allowlist (47baec6)
  • Make the custom extractor guide locally actionable (9c961f5)
  • Use placeholders in the backup-cron setup examples (10fc9ce)
  • Add the security model canon (82c4a37)
  • Correct NAS mount guidance to match default compose stack (f24e964)

πŸ”§ Maintenance

  • Apply ruff format across drifted files (9c97609)
  • Retrigger after adding orhun/git-cliff-action to Actions allowlist (bc0ac41)
  • Follow 8329d4f's eh_max_concurrency 2->8 and pin the browse/download split (fbd9c01)
  • Bump pillow, cryptography, nanoid; remove orphaned tagger service (73fc7d2)
  • Remove AI tagger/SwarmUI/captioner variables from .env.example (b6d4877)
  • Drop the tagger and captioner services (db918d1)
  • Rebalance api and worker memory limits (e2eb565)
  • Bump Next.js and pin postcss, sharp (e49ff06)
  • Apply ruff format to files from the branch merges (8c10b04)
  • Sort the import block in test_media_formats (d8758b8)
  • Keep local docs ignored (2568853)
  • Move ADRs and security model to local-only docs (d4e4a77)
  • Name the git hub generically in comments (e77ac41)
  • Add test:related script for commit-time related-tests gate (9dfd2ad)
  • Align fixtures and hook expectations (5a76324)
  • Ignore TODO-NOVEL.md local worklist (3add51a)
  • Port e-hentai seed + nav-audit tests to reducer model (8ed7ab9)
  • Remove browse load-mode setting (infinite scroll only) (8d8337f)
  • Make release promotion idempotent (931ac61)
  • Harden release pipeline + git-cliff release notes (9852930)

πŸ“¦ Other

  • Merge dev: fix backend Docker build missing dbinit build context (605fc48)
  • Merge dev: ruff format fixes to unblock Release quality gate (a874ceb)
  • Merge dev: retrigger Release after Actions allowlist fix (7ffa744)

Full Changelog: v2026.7.0...v2026.9.0