Repository navigation
v2026.9.0
π 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