- IntersectionObserver defers both cover images and placeholder canvas
drawing until cards enter viewport — eliminates 1000+ upfront ops
- ETag on /library/list: browser gets 304 Not Modified when nothing changed
- Single DOM pass in renderBooksGrid/renderDuplicatesView/renderSeriesDetail:
card.querySelector replaces second iteration with 500+ getElementById calls
- book_tags joined via json_agg in main query, removing separate SELECT + Python merge
- loadLibrary: error handling prevents silent failures showing as infinite loading
- Delete TODO-PERF-library-load.md (all four bottlenecks resolved)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Convert: warn when title+author already exists in library (preload check)
- Library: Duplicates sidebar section with grouped view and live counter
- Fix: Duplicates view cover loading now uses same canvas/two-pass pattern as renderBooksGrid
- Docs: add TODO-PERF-library-load.md with four identified bottlenecks
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
All formats now use {publisher}/{author} consistently:
- pdf/{publisher}/{author}/{title}.pdf
- comics/{publisher}/{author}/{title}.cbr|cbz
Previously PDF and comics only had {author}, unlike EPUB.
Updated TECHNICAL.md path table accordingly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix CBZ extension: common.make_rel_path now accepts ext param;
CBZ files are stored as comics/{author}/{title}.cbz instead of .cbr;
library.py import passes actual file suffix
- Add GET /download/{filename} endpoint (was 404, referenced in book.html)
- TECHNICAL.md fully rewritten: File Storage Paths section with exact
path patterns per format, complete endpoint lists for all routers
including settings.py (previously undocumented), metadata save
behaviour table, updated Known Bugs Fixed
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- PDF reader: page-image rendering via /library/pdf/{filename}?page=N;
new /api/pdf/info/{filename} endpoint returns page count; reader.html
branches on FORMAT (epub/pdf) injected by server
- PDF metadata edit: PATCH /library/book now updates DB for all formats;
_sync_epub_metadata only called for .epub; non-EPUB formats skip file write
- Fix file path on metadata save: _make_rel_path now includes format prefix
(epub/, pdf/, comics/) matching common.make_rel_path used during import;
previously files were moved outside their format directory
- Fix empty dir cleanup: prune_empty_dirs always runs after successful
metadata save, not only when file was moved
- Hide Edit EPUB button for non-EPUB files in book detail
- Docs: TECHNICAL.md and changelog-develop.md updated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>