github grimmory-tools/grimmory v3.0.0
Release v3.0.0

9 hours ago

3.0.0 (2026-04-22)

Features

  • add discord automated release notifications (#564) (e65536d)
  • add reading progress endpoints to mobile api (#377) (4bca3f6)
  • add Unraid community app template (#62) (b2b01cf)
  • api-docs: reintroduce API doc generation (#289) (5ac7b55)
  • api: allow disable of kobo store proxy (#337) (91c1973)
  • api: use redirect for kobo sync book images (#198) (c4107a9)
  • brand: update app to use the Grimmory brand identity (#550) (5a6b702)
  • build: nvmrc file to automatic switch to Node.js 24 (#130) (8fcb147)
  • cbx-viewer: add (back) infinite and long-strip modes, fixed. (#390) (1db1b84)
  • community: move issue intake to GitHub Discussions (#565) (11cb206)
  • devex: add a unified just command surface (69d50d4)
  • filters: add age rating and content rating filters, improve filter options (#479) (502f573)
  • issues: add typed Grimmory issue templates (511f84c)
  • lint: Additional CI workflow to enforce a threshold of the amount of frontend lint issues (#163) (79aa2e0)
  • pdf: integrate PDFium4j for PDF processing and metadata extraction (#281) (64083fe)
  • pdf: move ebook reader to embedpdf, add bookmarks, remove old pdf.js stuff (#393) (6c8a907)
  • reader: add document mode to the PDF viewer, overhaul PDF viewer, add different modes to CBX viewer (#306) (61b9b53)
  • ui: allow copying non-release app version from sidebar (#472) (cefa3ac)
  • web-reader: HTTP Caching & Cache Storage for content responses (#75) (5495225)

Bug Fixes

  • api: check legacy tools path for binaries (#146) (5d84097)
  • api: handle kobo proxy errors during kobo sync (#217) (d7867ba)
  • api: invert kobo book type check for downloads (#432) (6a9f4cd)
  • api: merge processFile() transactions with calling transactions (#287) (8bdf36d)
  • api: skip physical books in metadata manager to prevent NPE (#234) (ebdcd0b)
  • api: stop using dropped streamEntryFromArchive (#315) (0c87e37), closes #113
  • api: use ASIN instead of search if available (#369) (34042be)
  • api: use CBX Extractor in the CBX processor (#409) (5318e10)
  • api: use correct field lengths for file processors (#459) (d4bc840)
  • api: Use fixed-layout epub format in Kobo sync when necessary (Booklore PR Port) (#16) (dc1fa74)
  • archive: infer archive type via Magic Numbers instead of filename (#79) (3c0b5c0), closes #1 #2 #3 #6
  • audiobook: improve audiobook streaming and player UI (#513) (3e98807)
  • auth: add global error handler and PWA update service, and update auth logout to force full page reload (prevent reload-hell) (#741) (62434c5)
  • auth: ensure case-insensitivity on reading remote auth headers (#389) (b9a28d6)
  • auth: fix authentication request handling to exclude specific endpoints from authorization checks leading to permission denied errors (#566) (4d6691e)
  • backend: Fix metadata fields being stripped from API response, causing issues with filtering. (#250) (c1711dd)
  • book-browser: prevent memory leaks by unsubscribing from observables (#80) (5f1d34d)
  • book-card: prefer audiobook covers for square mixed-format cards (#467) (0eb4c8e)
  • bookdrop: clean bookdrop metadata before persisting (#462) (6a52a1a)
  • books: make "select all" actually select all not just the books loaded in (#533) (13f282f)
  • cache: improve cache handling by checking availability before operations (#397) (b2ff955)
  • cbx-reader: add GIF and BMP to supported image extensions (#230) (74c7ad5)
  • ci: align github actions with yarn 4 frontend tooling (dcd264c)
  • ci: reduce workflow cache churn (3f9d3e0)
  • clean up import in AuthenticationSettingsComponent (49101b7)
  • collapse-series: fix series collapsing (#541) (e26df36)
  • dashboard: improve performance with OnPush change detection (#440) (85e8d23)
  • devex: add GitHub sign-in note to rc and nightly Discord posts (#572) (52ed009)
  • dto: add DailyListeningDto and update session-related DTOs to use LocalDate (#403) (e2d6c1b)
  • entrypoint: ensure books directory exists and is writable by the target user (#119) (af9beaf)
  • file-mover: fix file mover never updating (#651) (d9d7a18)
  • file: allow physical books to be moved between libraries (#296) (4ce9188)
  • file: deduplicate bookFiles and protect source library root in FileMoveService (#294) (1625055)
  • file: update file type and size retrieval to use primaryFile structure (#383) (707f0a8)
  • filter: add missing filters for: Lubimyczytac, RanobeDB, and Audible ratings, comic specific metadata fields (#647) (4bac913)
  • filter: update filter options to use CountedOption for read statuses and file types (#448) (4a68fa2)
  • fix text overflow with attach-to-book flow when dealing with long titles (#265) (1799493)
  • frontend: fixes library health pinging even when the user is not authenticated (#385) (d502c18)
  • frontend: remove double encoding of series name in URL (#262) (a92459d)
  • hardcover: add series position decimals and use primary books count (#87) (8def367)
  • hardcover: hardcover sync duplicates reads and doesn't update progress (#247) (a261749)
  • hardcover: use hardcover edition based on ISBN for syncing progress (#173) (85c1749)
  • hibernate: improve transaction management and optimize entity fetching (#176) (ad3a981)
  • image-dimension: fix image dimension detection loading whole CBX files into memory (#663) (9236ac9)
  • kobo: add library to entityGraph when fetching books for download (#646) (11e6a35)
  • kobo: default kobo store proxy to "on" (#515) (a32cd54)
  • kobo: handle missing book when pulling kobo metadata (#473) (28dd303)
  • kobo: proxy the /v1/auth/device endpoint (#511) (ba6eb4f)
  • lazy-loading: improve image loading performance with lazy loading and low priority fetch (#431) (2c26bd2)
  • loading: update loading checks to use signal() for reactive state management (#727) (284e7be)
  • logging: change book added event completion log level from info to debug (#532) (928ccff)
  • metadata: add support for audible fields in metadata refresh options (#348) (2ecd352)
  • metadata: fix metadata fetching relying for filename "first" instead of better fields like ISBN in Goodreads/Bookdrop (#85) (4ac1d31), closes #1 #2 #3 #6
  • metadata: include custom namespace fields in file write checks (#257) (339a0c7)
  • metadata: preserve lock states and fallback values in metadata refresh (#258) (3f8a185)
  • metadata: refactor book metadata fetching to use fetch API and signals for state management (#495) (fcee609)
  • metadata: support multiple roles for the same creator in EPUB metadata extraction (#561) (c06dc95)
  • metadata: update book retrieval methods to fix lazy init exception when removing some authors/retrieving metadata from file (#560) (9c3ecc5)
  • mobile: enable pan mode and disable swipe-to-navigate and tap-to-turn-page zones on mobile devices (#742) (fb555d9)
  • packaging: include frontend in the docker build context (00f116a)
  • packaging: keep the frontend compatibility symlink in docker context (237c54b)
  • pdf-reader: localize embedpdf viewer to active app language (#466) (da7fa4b)
  • pdf-viewer: convert component properties to signals for improved reactivity (#475) (846a4b2)
  • pdf-writer: use same-dir temp files and harden cleanup (#719) (9601667)
  • pdf: improve PDF blob handling and improve viewer destruction logic (#506) (68d0b26)
  • reader: add fetchFreshBookDetail method to ensure up-to-date reading position across devices (#358) (4527d43)
  • reader: implement signal-based state management and cleanup in EbookReaderComponent (#435) (a779de8)
  • reader: optimize memory management for canvas and image handling in infinite scrolling (#433) (376ac6f)
  • reader: resolve epub preview runtime and audiobook download failures (#463) (c95b5fa)
  • readers: add chapter caching and improve page rendering (#514) (649c485)
  • release: always publish nightly images on manual runs (#571) (c6d567e)
  • search: replace dropdown with popover for search results and improve visibility handling (#355) (a176be3)
  • security: add access control annotations to various controllers (#312) (145b94d)
  • security: enforce validation on request bodies and tighten JWT issuer checks (7d7a5d9)
  • service: add transactional support to author delete and update methods (#653) (fd00da3)
  • streaming: rewrite file streaming with NIO and HTTP caching (#512) (5bd2e9a)
  • table-view: table-view to also actually select all when users select press all (#645) (791a4ea)
  • transloco-loader: update deepMerge function type definitions (#167) (6ff7275)
  • ui: add missing OIDC group permissions (#487) (39de8e3)
  • ui: enable all OIDC permissions when admin is granted (#517) (27db18a)
  • ui: Fix book scroll judder (#309) (351074f)
  • ui: Fixed the Angular Linter (#138) (0e61057)
  • ui: handle RFC5987 content-disposition headers (#730) (8047f87)
  • ui: improve audible metadata provider detection (#456) (a63328b)
  • ui: parse magic shelf date values as local midnight (#489) (41e1132)
  • ui: properly scale placeholder artwork text with smaller sizes (#531) (6f2b86a)
  • ui: restore frontend verification after eslint cleanup (43389c8)
  • ui: settings forms not reflecting saved values reliably (#648) (78be516)
  • ui: use RFC3330 format for date picker (#491) (6541d41)
  • ui: use signals for duplicate merger (#732) (a03ae72)
  • upload: add ChangeDetectorRef calls to ensure UI updates during file upload process (#557) (bf4fab3)
  • user-settings: fix settings loading errors (#527) (902f5f5)
  • webmvc: avoid index fallback exception for missing public routes (#298) (a3add5d)
  • websocket: add heartbeat scheduling and transport limits (#313) (bfeeef2)

Performance

  • ui: captures some low hanging fruit around excessive re-renders in the app (#158) (8778827)
  • ui: decouple book browser rendering pipeline (#341) (be0b717)

Refactors

  • api: move detect deleted/new books to LibraryFileHelper (#555) (11caa91)
  • api: optimize caching mechanisms and improve book filtering (#372) (3e5a6a9)
  • api: switch to Spring logging filter (#195) (5f06ab9)
  • api: use NightCompress library for reading CBX (#113) (1e0b4d0)
  • api: use Path for FileUtils.getBookFullPath (#209) (97411fa)
  • api: use spring content disposition helper for BookDownloadService (#449) (2637960)
  • cbx-reader: convert properties to signals for improved reactivity and performance/add top/bottom swipe detection (#743) (a9ce7c7)
  • concurrency: improve thread management and locking in monitoring services (#137) (5bcef92)
  • config: remove redundant Spring Boot config and fix injection patterns (#314) (390a372)
  • cover: add async cover notifications, for real time updates (#716) (7a88b12)
  • drop unused standalone comicinfo.xml parser (#218) (66de45c)
  • ebook-reader: optimize destruction handling and improve reactive subscriptions (#478) (1f5f99d)
  • email: replace Booklore References In Email with Grimmory (#434) (a0a7be4)
  • entity: update fetch strategies to LAZY for improved relibility (#122) (b905e82)
  • epub: migrate from documentnode to grimmory epub4j library and update related code (#334) (bff20c5)
  • file: improve path handling and validation (#82) (cbd04ee)
  • frontend: decouple app shell from PrimeNG layout system (#307) (55a6343)
  • frontend: Migrate state to Tanstack Query + signals (#117) (ccb80d7)
  • frontend: rename booklore-ui to frontend (874b013)
  • frontend: repoint repo tooling to the frontend path (42d9dcb)
  • geoip: replace ObjectMapper instantiation with JsonMapper for improved configuration (#139) (aab68d5)
  • icon: fix SVG icons loading straight to memory (#56) (c9c255b), closes #80
  • kobo: create endpoints for non-catchall (#507) (bd7e578)
  • library: implement asynchronous book addition and cover generation with event handling (#329) (536daa9)
  • migrate library-creator component state to signals and enable component unit tests (#476) (f292a3e)
  • pdf-viewer: improve worker and blob handling for better loading of wasm PDFium workers (#333) (74c5bbd)
  • regex: replace string manipulation with Pattern matching for improved readability (#359) (78099cc)
  • SecurityFilter: Stop filters from being registered on all routes (#361) (9ddbe35)
  • service: replace manual caching with Cacheable and JPQL with Criteria API (#316) (02b2087)
  • settings: replace unsubscribe logic with takeUntilDestroyed for better resource management (#443) (7abac02)
  • threads: replace manual thread management with Spring lifecycle (#322) (cf79990)
  • ui: replace SVG artwork placeholders with CSS (#292) (2fd7310)

Chores

  • api: add the base OpenAPI metadata config (#423) (a32ca37)
  • api: drop unused book download proxy (#428) (907ad09)
  • api: drop unused code in AmazonBookParser and AudibleParser (#368) (b05d76d)
  • api: fix typo on openapi doc for healthcheck (#380) (7e796ec)
  • api: Migrate BookCreatorServiceTests to AssertJ and remove unnessesary tests (#229) (2474cdd)
  • banner: add ASCII art banner (#381) (05185ee)
  • build: migrate Gradle build scripts from Groovy to Kotlin DSL (#100) (ff14647)
  • codeql: Initialize a codeql config so we can sort out the caching properly. (2ad937a)
  • dependencies: bump Spring Boot to 4.0.5 and Hibernate to 7.3.0 Final (#223) (4e57719)
  • dependencies: update @embedpdf packages to version 2.12.0 (#325) (84ff595)
  • deps: bump @hono/node-server from 1.19.11 to 1.19.13 in /frontend (#419) (fadc129)
  • deps: bump actions/cache from 4.2.4 to 5.0.4 (40d0076)
  • deps: bump actions/cache from 5.0.4 to 5.0.5 (#762) (317557c)
  • deps: bump actions/setup-node from 6.3.0 to 6.4.0 (#758) (6d6003c)
  • deps: bump actions/upload-artifact from 7.0.0 to 7.0.1 (#763) (a0e2f60)
  • deps: bump conventional-changelog-conventionalcommits (#351) (19223d7)
  • deps: bump docker/build-push-action from 7.0.0 to 7.1.0 (#759) (9834381)
  • deps: bump docker/login-action from 4.0.0 to 4.1.0 (#757) (d2b32ed)
  • deps: bump docker/setup-qemu-action from 3.7.0 to 4.0.0 (3a1cd68)
  • deps: bump dompurify from 3.3.3 to 3.4.0 in /frontend (#536) (7f47b51)
  • deps: bump github/codeql-action from 4.34.1 to 4.35.1 (#332) (4be3311)
  • deps: bump github/codeql-action from 4.35.1 to 4.35.2 (#754) (70b2463)
  • deps: bump handlebars from 4.7.8 to 4.7.9 in /tools/release (#232) (e5ec9d0)
  • deps: bump hono from 4.12.12 to 4.12.14 in /frontend (#535) (91989b5)
  • deps: bump hono from 4.12.9 to 4.12.12 in /frontend (#422) (10c7fac)
  • deps: bump lodash from 4.17.23 to 4.18.1 in /tools/release (#339) (736ed01)
  • deps: bump lodash-es from 4.17.23 to 4.18.1 in /frontend (#344) (f7294bf)
  • deps: bump lodash-es from 4.17.23 to 4.18.1 in /tools/release (#342) (bd58f19)
  • deps: bump taiki-e/install-action from 2.69.10 to 2.71.0 (#331) (f7600e6)
  • deps: bump taiki-e/install-action from 2.69.7 to 2.69.10 (c0fca03)
  • deps: bump taiki-e/install-action from 2.71.0 to 2.75.19 (#756) (365d44e)
  • deps: bump the gradle-dependencies group (#350) (73857a8)
  • deps: bump the gradle-dependencies group across 1 directory with 8 updates (#224) (052c932)
  • deps: bump the gradle-dependencies group across 1 directory with 9 updates (#755) (8b0c3f8)
  • docker: bump Gradle version to 9.4.1 in Dockerfiles (#379) (d254da1)
  • docs: align Discord links with the README (dee8cd9)
  • docs: update Discord invite links (e4fc279)
  • drop booklore-ui symlink (#753) (9c92f54)
  • expand and generate specs for the frontend code section (#242) (a3c5da9)
  • frontend-lint: add local typecheck and stylelint commands (cef000d)
  • frontend-lint: tune stylelint for Angular and legacy SCSS patterns (dc2c1ec)
  • frontend: add missing auth service mock (#226) (4da5f2b)
  • frontend: add temporary booklore-ui compatibility symlink (4ddc567)
  • frontend: fix build warnings + set threshold to zero (#421) (6ab2ad6)
  • github: update bug report template with build selection (#529) (f2b3507)
  • lint: set LINT_ERROR_THRESHOLD to zero (#238) (cb8fa67)
  • nvm: moved .nvmrc file to the repository root (#237) (169c9ff)
  • packaging: simplify dockerignore to a denylist (a735bf1)
  • rename springboot app folder to backend (#752) (1a664dd)
  • sdkman: add Java version 25.0.2-tem to .sdkmanrc (#228) (da88da5)
  • ui: clear eslint angular style guide bucket (68e3df7)
  • ui: clear eslint control flow bucket (ac6b44e)
  • ui: clear eslint empty object type bucket (eba9688)
  • ui: clear eslint empty-function bucket (5dfd1e1)
  • ui: clear eslint expression cleanup bucket (79eef41)
  • ui: clear eslint interaction accessibility bucket (18784fd)
  • ui: clear eslint label-association bucket (b03ecf3)
  • ui: clear eslint mechanical style bucket (ea15719)
  • ui: clear eslint no-unused-vars bucket (0d6f83b)
  • ui: clear eslint optional chain assertion bucket (935b3ed)
  • ui: clear eslint presentation-label bucket (0a407f6)
  • ui: clear final prefer-inject bucket (878cfa0)
  • ui: clear helper service any bucket (f7a5d93)
  • ui: clear reader core any bucket (782bd63)
  • ui: clear reader settings prefer-inject bucket (4f7d38a)
  • ui: clear reader state any bucket (af9a53d)
  • ui: clear reader utility any bucket (e12f4ea)
  • ui: clear settings and stats any bucket (3700e35)
  • ui: clear shared prefer-inject bucket (b3fe4fd)
  • ui: clear test and declaration any bucket (2e66fd3)
  • ui: drop book and author animations (#270) (09c36df)
  • ui: drop unused favicon pngs (#675) (64b7a5c)
  • ui: enforce placeholder aspect ratios (#320) (f376b68)
  • ui: lazily load filter sidebar content (#283) (2a2dee8)
  • ui: remove remaining series chart template casts (3fdb63f)
  • ui: update PWA icons for new branding (#679) (d5b497e)
  • unraid: sync unraid template with README (#417) (e3b22ed)
  • update npm packages and address warnings in build (#426) (f0e4497)

Documentation

  • add AI usage policy for contributors (#547) (2c6509e)
  • add code of conduct (#546) (4c56e10)
  • agents: add repository agent workflow guide (caa37cd)
  • api: normalize OpenAPI tagging and operation metadata for app + auth/task endpoints (#437) (402c6f0)
  • consolidate application project development docs (#545) (719e083)
  • plan: add frontend grimmory migration plan (c99aa87)
  • readme: add DISK_TYPE to example compose file (#272) (#477) (3ddec09)
  • readme: modify wording on project independence (#382) (e172fa8)
  • remove frontend test architecture plans (#543) (8fde433)
  • security: update security policy with reporting guidelines and hints to supported versions (#76) (21c23d6), closes #1 #2 #3 #6

CI

  • apt update before installing libarchive (#375) (4d2b803)
  • drop publish-test-results.yml workflow (#737) (f05feae)
  • match release automation to desired behavioral workflow (#739) (10afe3c)
  • split release from build (#749) (ff73eea)
  • temp disable dependabot typescript updates (#761) (1d32e5f)
  • use env vars for input to scripts (#733) (2dbfe82)

Build

  • frontend: make deps checks work with yarn 4 (d59d5f7)
  • yarn: migrate frontend and release tooling to yarn 4 (4855f36)

Style

  • frontend: apply the first eslint autofix pass (e2a8e6a)
  • frontend: apply the first stylelint autofix pass (34fc600)
  • frontend: enforce alpha-value-notation in scss (6921da7)
  • frontend: enforce at-rule-empty-line-before in scss (43412c0)
  • frontend: enforce color-function-alias-notation in scss (130463b)
  • frontend: enforce color-function-notation in scss (ddcbb5b)
  • frontend: enforce color-hex-length in scss (a991351)
  • frontend: enforce declaration-block-single-line-max-declarations in scss (32765de)
  • frontend: enforce declaration-empty-line-before in scss (a04daac)
  • frontend: enforce declaration-property-value-keyword-no-deprecated (1a65884)
  • frontend: enforce keyframes-name-pattern in scss (7058992)
  • frontend: enforce media-feature-range-notation in scss (e46f87e)
  • frontend: enforce no-empty-source in scss (d95424d)
  • frontend: enforce number-max-precision in scss (a689751)
  • frontend: enforce property-no-deprecated in scss (df12acd)
  • frontend: enforce property-no-vendor-prefix in scss (ee02f6e)
  • frontend: enforce rule-empty-line-before in scss (55f4481)
  • frontend: enforce scss dollar-variable-empty-line-before (e68938f)
  • frontend: enforce scss dollar-variable-pattern in layout styles (2ee5dce)
  • frontend: enforce selector-class-pattern in scss (c0dff27)
  • frontend: enforce shorthand-property-no-redundant-values in scss (7b9830f)
  • frontend: resolve the remaining stylelint findings (dbd1f20)
  • frontend: scope no-invalid-position-declaration for scss mixins (0b34a85)

Don't miss a new grimmory release

NewReleases is sending notifications on new releases.