🌟 What's New in v2.0.0
This is the biggest Booklore release yet, with nearly 200 commits touching every part of the application:
- Multi-Format Book Support & Audiobooks: Books can now have multiple file formats (EPUB, PDF, CBZ, etc.) attached to a single entry. Full audiobook support is here with a dedicated player, streaming playback, narrator filtering, and session tracking.
- Duplicate Book Detection & Merge: Booklore can now detect duplicate books across your library. A new merge tool lets you combine duplicates, choose which formats to keep, and optionally move files, all without losing metadata.
- Author Metadata via Audnexus: Author pages now pull rich metadata (bios, images) from the Audnexus API, with a dedicated author browser, detail page, and editor.
- Series Browser: A brand new series browser page with search, filtering, sorting, and resizable cards for browsing your series collection at a glance.
- Annotation Notebook: All your highlights, notes, and bookmarks are now collected in a searchable, paginated notebook view.
- Audit Log System: Admins can now see a full audit trail of significant actions (user management, library changes, metadata operations) with geo flags, relative timestamps, and filterable logs.
- Bidirectional Kobo Sync: Full two-way reading progress sync with Kobo devices, plus shelves and magic shelves now sync as Kobo tags.
- Cascading Sidebar Filters: Filters now cascade, so selecting an author narrows available series, genres, etc. You can also customize which filters are visible.
- 10+ New Statistics Charts: A massive expansion of the stats page with reading heatmaps, distribution charts, completion races, and more.
- PDF Annotations & Reader Upgrades: The PDF reader now supports annotations, dark/light mode toggle, and Range streaming. The ebook reader gains fullscreen, keyboard shortcuts, and go-to-percentage. The CBX reader adds fullscreen, slideshow, RTL, and long strip mode.
- Sidecar Metadata Files: Booklore can now read and write
.metadata.jsonsidecar files alongside your books for portable metadata storage. - Extended Comic Metadata: Full ComicInfo.xml support with a dedicated comic metadata picker and write-back to CBZ/PDF files.
- Internationalization via Weblate: Booklore is now fully translatable with Transloco and Weblate integration. Ships with 15+ languages including Hungarian, Slovenian, Croatian, Swedish, Chinese, and Japanese.
- Java 25, Spring Boot 4, Gradle 9: The entire backend has been upgraded to the latest stack. Nginx has been removed; Angular is now served directly from Spring Boot.
- Login Rate Limiting: Brute-force protection on the login endpoint. Plus new age and content rating support for restricted libraries.
- Performance: Book list API optimized with ETag caching, delta sync, and IndexedDB. Project Lilliput compact object headers reduce heap usage.
🚀 New Features
- Introduce multi-format book support, including audiobooks (#2486) by @acx10
- Add duplicate book detection/merge and fix format-related data loss (#2820) by @acx10
- Add author metadata via Audnexus with browser, detail, and editor pages (#2843) by @acx10
- feat: add series browser page (#2771) by @acx10
- feat: add annotation notebook with server-side pagination (#2736) by @acx10
- feat: add audit log system for tracking admin-significant actions (#2759) by @acx10
- Add bidirectional Kobo reading progress sync (#2791) by @acx10
- feat(filters): implement cascading sidebar filters (#2616) by @acx10
- feat(cbx-reader): add fullscreen, slideshow, RTL, long strip mode and keyboard shortcuts (#2632) by @acx10
- feat(sidecar): add sidecar JSON metadata file support (#2657) by @acx10
- feat(comic-metadata): add extended comic metadata support (#2654) by @acx10
- feat(i18n): add Transloco translation framework with EN/ES and 7 language scaffolds (#2681) by @acx10
- feat(api, build): Upgrade to Java 25, Gradle 9, and Spring Boot 4, Jackson 3 (#2597) by @balazs-szucs
- Remove nginx and serve Angular directly from Spring Boot (#2662) by @acx10
- feat: add login rate limiting to prevent brute-force attacks (#2761) by @acx10
- feat(content-restrictions): add age rating and content rating support (#2619) by @acx10
- feat(sorting): add multi-field sorting support (#2628) by @acx10
- feat(metadata): add custom metadata write to file support for moods, tags, ratings, and external IDs in PDF, and CBZ (#2552) by @balazs-szucs
- feat(metadata) Save basic metadata to EPUB file - Bonus use Calibre Custom Columns for importing metadata. (#1879) by @jadehawk
- feat: add grouped field dropdown and composite fields to magic shelf (#2750) by @acx10
- feat(filters): add customizable visible filters setting (#2625) by @acx10
- Add 10 advanced stats charts (#2850) by @acx10
- feat(stats): add 5 new user statistics charts (#2703) by @acx10
- feat(i18n): add Weblate integration and auth translations (#2727) by @acx10
- feat: add else clause and value modifiers to file naming patterns (#2724) by @acx10
- feat: add button to fetch metadata from book file (#2739) by @acx10
- feat(google-books): add optional API key configuration (#2629) by @acx10
✨ Enhancements
- feat(reader): add PDF annotations, Range streaming, and optimized chunk loading (#2701) by @acx10
- feat(reader): add fullscreen, keyboard shortcuts, search cancel, and go-to-percentage (#2698) by @acx10
- feat(reader): add dark/light mode toggle and improved close button to PDF reader (#2699) by @acx10
- feat(kobo-sync): add user scoped 2 way kobo sync (#2452) by @b3nk3
- feat(kobo-sync): Sync Shelves and Magic Shelves to Kobo Tags (#2236) by @xcashy
- Redesign series page layout and book list tab (#2847) by @acx10
- feat(sort): replace compound sort options with atomic fields and multi-sort support (#2686) by @acx10
- Add moveFiles option to attach/merge and per-book delete in duplicate merger (#2833) by @acx10
- feat: enhance audit logs with geo flags, relative time, and UX improvements (#2760) by @acx10
- feat(bookdrop): add ability to poll the bookdrop folder (#2768) by @arjunsrinivasan1997
- feat: add metadata presence filter to magic shelf (#2757) by @acx10
- feat(upload): add upload progress tracking with progress bar and stats (#2640) by @acx10
- feat(email): add format selection to email book dialog (#2650) by @acx10
- feat(pwa): Enable fullscreen mode for Android immersive reading (#2649) by @alondero
- Add Hungarian and Slovenian language support (#2846) by @acx10
- fix(library-service): prevent concurrent library scans with a tracking set (#2637) by @balazs-szucs
- feat: add configurable sidebar width setting (#2749) by @acx10
- refactor(download): simplify file download to use browser native handling (#2639) by @acx10
🎨 UI Tweaks
- Add visual polish to book card component (#2788) by @acx10
- refactor: centralize access-denied card styles into shared mixin (#2515) by @acx10
🐛 Bug Fixes
- fix(auth): resolve DST-related login failure for refresh tokens (#2624) by @acx10
- Fix Kobo sync HeadersTooLargeException for large libraries (#2809) by @acx10
- fix(metadata-refresh): Correct metadata update priorities and preserve disabled fields during 'replace all' (#2503) by @balazs-szucs
- fix(metadata-parsers): improve ISBN search logic and fallback strategies for metadata fetching (#2502) by @balazs-szucs
- fix(metadata-update): ensure per-book transaction isolation in bulk updates to prevent race conditions (#2536) by @balazs-szucs
- fix(metadata-refresh): fix filter book shelves by authenticated user logs out the user. (#2481) by @balazs-szucs
- Fix null collection errors for PDFs, audiobooks, and physical books (#2817) by @acx10
- fix(library-processing): re-fetch library entity after clearing entity manager during rescan (#2507) by @balazs-szucs
- fix(file-move): ensure file moves are rolled back if database update fails (#2588) by @balazs-szucs
- fix(file-move): update empty directory cleanup to handle multiple library paths (#2634) by @balazs-szucs
- Fix CBR/CB7 to CBZ conversion losing track of file path (#2835) by @acx10
- fix(cbz-reader): CBZ reading regression and optimize ZIP parsing strategy (#2593) by @balazs-szucs
- Fix PDF reader not loading alternate format files (#2836) by @acx10
- fix(epub-cover-extract): improve cover image extraction with fallback handling (#2585) by @balazs-szucs
- fix(epub-metadata): enhance cover extraction with heuristic fallbacks for manifest and ZIP entries (#2636) by @balazs-szucs
- fix(book-rule-evaluator): fix file type handling and add mapping for specific formats to fix magic shelve based on filetype (#2480) by @balazs-szucs
- Fix magic shelf rule evaluation for numeric comparisons (#2795) by @acx10
- Fix read status NULL progress handling in rule evaluator (#2821) by @acx10
- Fix bookdrop race condition processing files before fully written (#2785) by @acx10
- fix(bookdrop): handle file modifications in Bookdrop event handler (#2559) by @balazs-szucs
- fix(hardcover-sync): Don't send repeated read status to Hardcover.app (#2609) by @PhasecoreX
- fix(api): Select correct Hardcover.app ISBN from lookup results (#2530) by @PhasecoreX
- fix(ui): fix memory leaks and cascading API calls in metadata editor (#2716) by @acx10
- fix: replace Quill editor with native HTML rendering for book descriptions (#2733) by @acx10
- Fix reading stats queries not accounting for timezone (#2844) by @acx10
- Fix reading session timeline long sessions, tooltip perf, and week mismatch (#2848) by @acx10
- fix(reading-stats,ui): update heatmap to use local time formatting… (#2587) by @WorldTeacher
- fix(select-all): "Mark All" bug and add "Remove from all shelves" bulk action across components (#2562) by @balazs-szucs
- fix(opds): Fix OPDS CBR mime type reporting and strict Archive detection (#2592) by @balazs-szucs
- Fix OPDS shelf filter cartesian product (#2837) by @acx10
- fix(comic-metadata): fix series grouping bug with external ComicInfo.xml metadata (#2385) by @balazs-szucs
- Fix additional file uploader bugs and improve metadata viewer (#2816) by @acx10
- Fix PWA offline fallback blocking localhost access when internet is disconnected (#2784) by @acx10
- fix(audiobook-reader): use preload=none for immediate streaming playback (#2518) by @acx10
- fix: reset audiobook progress and clear cached progress in UI (#2711) by @acx10
- Fix cbx reader prev/next book stacking on close (#2858) by @acx10
- Fix ebook reader header not hiding on mobile tap (#2857) by @acx10
- fix(reader): enable text copy in ebook reader (#2702) by @acx10
- Fix CBZ reader scroll position reset in infinite scroll mode (#2781) by @acx10
- Fix column gap +/- buttons in eBook reader default settings (#2780) by @acx10
- Fix email provider creation failing due to null shared field (#2794) by @acx10
- Fix audit logs pagination bug and add URL query param sync (#2787) by @acx10
- Fix audit log description overflow for bulk metadata refresh (#2783) by @acx10
- Fix multiple author card menus opening simultaneously (#2852) by @acx10
- Fix Goodreads label mappings and format config (#2779) by @AlfredSimpson
- fix(ui): encode filter values in query params to handle commas in names (#2717) by @acx10
- fix(ui): prevent footer submenu from rendering off screen (#2714) by @acx10
- fix(ui): inline mobile charts submenu to prevent layout overflow (#2713) by @acx10
- fix(ui): correctly format lubimyczytac external rating link (#2491) by @sebhewelt
- Fix iconDisplay binding syntax in metadata viewer (#2772) by @WorldTeacher
- Fix mobile toolbar overlapping on small screens (#2856) by @acx10
- Fix book browser header title overflow on mobile (#2808) by @acx10
- fix(book-browser): resolve footer menu not hiding after navigation back (#2626) by @acx10
- fix: align frontend Page interfaces with VIA_DTO serialization format (#2751) by @acx10
- fix: show provider icons in metadata viewer when only ID is present (#2734) by @acx10
- fix: hide show-more button when description fits without truncation (#2766) by @acx10
- fix: use audiobook thumbnail for audiobook entries in notebook (#2763) by @acx10
- fix: show session numbers in book (#2696) by @WorldTeacher
- fix(settings): use boxed Integer for ScrollerConfig.maxItems to allow null (#2684) by @acx10
- fix(series-multi-select): Fix transparency in series multi select pop-up (#2555) by @balazs-szucs
- Fix: Filter text overwrites on long options (#2540) by @acx10
- Fix: Lock icons do not stay with publisher and series name input fields (#2539) by @acx10
- fix(metadata): improve cover errors, reduce metadata fetch count, and hide attach option (#2690) by @acx10
⚡ Performance
- perf: optimize book list API with ETag, delta sync, and IndexedDB caching (#2753) by @acx10
- perf: enable compact object headers (Project Lilliput) (#2755) by @acx10
🛠️ Refactoring & Maintenance
- refactor: split BookService into BookFileService and BookMetadataManageService (#2758) by @acx10
- chore: fix memory leaks, add aria-labels, improve type safety and logging (#2764) by @acx10
- chore: add caching, validation, lazy routes, refresh rate limiting, JaCoCo, and cleanup (#2762) by @acx10
- perf: strip unused fields from book list API response (#2741) by @acx10
- perf(epub): Replace linear manifest scans with HashMaps in EPUB reader (#2598) by @balazs-szucs
- feat(metadata): return full metadata from parsers instead of previews (#2689) by @acx10
- feat: comic metadata picker, lazy-load providers, and UI improvements (#2679) by @acx10
- Add complete translations for all supported languages (#2831) by @acx10
- Add Hungarian and Slovenian language support (#2846) by @acx10
- Add Croatian and Swedish translations for login page (#2786) by @acx10
- feat: add i18n translations for stats, pdf reader, magic shelf, and remaining components (en/es) (#2742) by @acx10
- feat: add i18n translations for book components, services, and readers (en/es) (#2738) by @acx10
- fix(i18n): dynamic sidebar translations and UI font normalization (#2683) by @acx10
- feat: disable PDF printing for users without download permission (#2737) by @acx10
- feat(ui): add file name column to table view and include filename in search (#2712) by @acx10
- feat(ui): provide hyperlinks for books as book cards in grid view (#2500) by @berb
- feat(ui): Add sort by filePath (#1180 and #2364) (#2512) by @chiguirepower
- feat(icons): Made icons for libraries and shelves optional with no default icons. (#2599) by @arthurgiroux
- fix(comicvine): add fallback to issue detail endpoint for missing creator credits (#2694) by @balazs-szucs
- fix(epub-metadata): enhance cover extraction with heuristic fallbacks for manifest and ZIP entries (#2636) by @balazs-szucs
- fix(metadata-match): Fix metadata quality calculation to properly handle locked fields (#2513) by @balazs-szucs
- fix(ui): reload shelves when enabling Kobo sync (#2715) by @acx10
- fix(ui): standardize button labels and styles across components (#2560) by @balazs-szucs
- chore: redesign README for cleaner layout and visual polish (#2728) by @acx10
- fix: make README logo visible in GitHub light mode (#2756) by @acx10
- chore: clean up PR template and contributing guide (#2660) by @acx10
- fix(file naming): add leading zero to series index (#2642) by @WorldTeacher
- Update viewport meta tag to prevent auto-zoom on iOS when entering in… (#2620) by @jmswangit
- test(API): add missing tests for BookMapperV2 (#2495) by @piffio
- fix(audiobook-reader): use preload=none with explicit load() for faster streaming (#2520) by @acx10
- fix(ui): clean cached properties (#2499) by @piffio
- fix(additional-file-uploader): add file size validation with UI feedback (#2516) by @acx10
- fix(os_x-conversion): ignore __MACOSX directory for conversions (#2479) by @balazs-szucs
- fix(series-page): add missing overlay preference service to book card (#2466) by @xcashy
- fix(docker): add build and gradle directories to volumes in docker compose (#2459) by @balazs-szucs
📦 Dependencies
- chore(deps): bump org.springframework.boot from 4.0.2 to 4.0.3 in /booklore-api in the gradle-dependencies group (#2813) by @dependabot[bot]
- chore(deps): bump the npm-dependencies group in /booklore-ui with 15 updates (#2814) by @dependabot[bot]
- chore(deps): bump the npm-dependencies group across 1 directory with 18 updates (#2687) by @dependabot[bot]
- chore(deps): bump the npm-dependencies group in /booklore-ui with 13 updates (#2721) by @dependabot[bot]
- chore(deps): bump the npm-dependencies group in /booklore-ui with 20 updates (#2542) by @dependabot[bot]
- chore(deps): bump the gradle-dependencies group across 1 directory with 7 updates (#2659) by @dependabot[bot]
- chore(deps): bump the gradle-dependencies group in /booklore-api with 2 updates (#2720) by @dependabot[bot]
- chore(deps): bump tar from 7.5.7 to 7.5.9 in /booklore-ui (#2805) by @dependabot[bot]
- chore(deps): bump tar from 7.5.6 to 7.5.7 in /booklore-ui (#2534) by @dependabot[bot]
- chore(deps): bump hono from 4.11.9 to 4.12.0 in /booklore-ui (#2815) by @dependabot[bot]
- chore(deps): bump qs from 6.14.1 to 6.14.2 in /booklore-ui (#2722) by @dependabot[bot]
- chore(deps): bump @modelcontextprotocol/sdk and @angular/cli in /booklore-ui (#2612) by @dependabot[bot]
- chore(deps): bump actions/setup-node from 4 to 6 (#2573) by @dependabot[bot]
⚙️ CI/CD
- ci: move Angular/Gradle builds to native CI steps to eliminate QEMU emulation (#2705) by @acx10
- chore: add performance label to release drafter categories (#2754) by @acx10
🐳 Docker Images
- Docker Hub:
booklore/booklore:v2.0.0 - GitHub Container Registry:
ghcr.io/booklore-app/booklore:v2.0.0
Full Changelog: v1.18.5...v2.0.0










