What's Changed
v1.10.0 is the release where the party finally splits up, and for once it's on purpose. Characters got the most love this round. The Characters page sorts by name, system, campaign or sheet, and the rest of the party's characters get their own Party members section grouped by campaign. GMs can build a pre-gen and hand it to a player with Give to player…, keeping edit access until the player takes the keys. When the catalogue ships a newer version of a sheet you use, Grimoire tells you, and Update all takes care of it. Sheets can also carry a phone layout of their own, so nobody has to pinch-zoom to find their AC mid-combat.
Scanned books got a lot smarter about OCR. A scan with a few pages of real text, or a chapter title stamped on every page, used to pass for a text book and stay mostly unsearchable. Now it's read properly, map packs are left alone, and each book is read in its own language, so the German edition finally searches in German. Under the hood, opening a 600-page PDF and zooming in no longer stalls everyone else, a huge rescan no longer sits at 100% for hours, and the first page load is about a fifth the size it was.
Grimoire can also keep your Grimoire Codex DB collection in sync, so the site knows what's on your shelf, and the OPDS feed can be paged for e-readers that choke on a large library. Big thanks to @aragorntc for the OCR fixes behind most of this release's searchability gains.
Before You Upgrade
- Reverse proxies:
TRUSTED_PROXIESnow defaults to127.0.0.0/8,::1,172.16.0.0/12, and no longer trusts10.0.0.0/8,192.168.0.0/16orfc00::/7. If your proxy runs on another machine on your LAN, in Kubernetes, Swarm or Podman, on a Docker network in the192.168pool, or reaches Grimoire over Tailscale IPv6, add its address toTRUSTED_PROXIES. Until you do, everyone behind it shares one sign-in rate limit and Active Sessions shows the proxy's address. Grimoire logs a hint naming the address to add - Add-on scripts: every script add-on needs approving once more after the upgrade. An approval now covers the exact script and the environment variables it reads
- OCR: a PDF is now read with OCR when its own text covers less than half its pages, not only when it has none, so new books may take longer to scan on the OCR image. Books already in your library are left alone until you choose Re-OCR. Set
OCR_MIN_TEXT_COVERAGE=0andOCR_MIN_PAGE_CHARS=0to keep the old behaviour - Back up
DATA_PATH: this release migrates the database, including converting guest invite codes so they are no longer stored as plain text. Existing codes keep working, but going back to 1.9.x means restoring that backup - Scripts and API clients: the share-link and calendar-feed routes have new, stable
operationIds, so regenerate any generated client. Page renders pastRENDER_QUEUE_LIMITanswer503withRetry-After, and out-of-rangeoffset/pagevalues are now a422 SECRET_KEY: changing it now also ends every guest invite code, so regenerate them from each campaign's guest list if you rotate it
New Features
- Give a character you prepared to one of your players
- Update installed character sheets from the catalogue, one at a time or all at once
- Phone layouts for character sheets, with their own stylesheet
- Keep your Grimoire Codex DB collection in sync with your library
- Page the OPDS feed with
?page_size= - OCR each scanned book in its own language, read from its Language field,
.opfsidecar or the PDF
Enhancements
- Sort the Characters page by name, system, campaign or sheet version
- Party members' characters get their own section, grouped by campaign
- Read a book's language from its
.opfsidecar - OCR scans with only a few pages of text, and offer Re-OCR for them by @aragorntc in #687
- Judge a text layer by how much text each page carries, with
OCR_MIN_TEXT_COVERAGEandOCR_MIN_PAGE_CHARSby @aragorntc in #741 - Leave artwork-heavy books such as map packs out of OCR
- About a fifth as much JavaScript on first load
- Rescans after a big reorganisation show their progress and no longer lock you out
- Permission errors name the folder and point at
PUID/PGIDinstead of calling the library read-only
Bug Fixes
- A folder whose name differs only by case no longer loses its books when the other one is deleted, moved or renamed
- Large books and deep zooms no longer stall the rest of Grimoire
- OCR keeps the pages that already had their own text in search by @aragorntc in #741
- Books queued for OCR while another is being read are picked up by @aragorntc in #689
- Merging duplicates with "delete files" keeps the files if the merge fails
- Books with no game system stay visible to players once a system is restricted
- A crashed page shows a recovery panel, and a missing book says so instead of spinning forever
- Switching campaign notes quickly no longer edits the wrong note
- Long system names no longer break mid-word beside the card badges
- A replaced map shows its new image
- Hand-placed add-ons are no longer replaced by an index add-on with the same id
- Grimoire stays root on NAS shares and library subfolders it couldn't otherwise write to
- Unique, stable OpenAPI operation ids for the share-link and calendar routes
New Contributors
Full Changelog: v1.9.2...v1.10.0
What's Changed
- Build(deps): Update ruff requirement from >=0.17.1 to >=0.17.2 by @dependabot[bot] in #696
- Build(deps): Bump the minor-and-patch group with 3 updates by @dependabot[bot] in #694
- Build(deps): Bump the web-stack group with 2 updates by @dependabot[bot] in #692
- Fix: Pick up books queued for OCR while a drain is running by @aragorntc in #689
- Build(deps): Bump the minor-and-patch group in /frontend with 5 updates by @dependabot[bot] in #693
- Test: Fix two flaky backend tests by @hunter-read in #698
- Fix: Name permission problems instead of calling the library read-only by @hunter-read in #697
- Fix: OCR a scan whose text layer covers only a few of its pages by @aragorntc in #687
- Fix: Follow up thin-text OCR - sample for artwork, offer Re-OCR, keep… by @hunter-read in #715
- Chore: Freeze the logic Alembic revisions use by @hunter-read in #716
- Build(deps): Bump python from
a6e34c5toa0f5706by @dependabot[bot] in #717 - Build(deps): Bump node from
0a7108btofe4f6d7by @dependabot[bot] in #718 - Build(deps): Bump debian from
7c7b2c9to7ff6ba3by @dependabot[bot] in #719 - Build(deps): Bump the actions group with 4 updates by @dependabot[bot] in #720
- Fix: Gate src/lib/ files in the frontend coverage check by @hunter-read in #722
- Fix: Make the backend suite pass whatever order it runs in by @hunter-read in #723
- docs: fix stale comments after lazy-config and worker changes by @canakyuz in #721
- Refactor: Split config into a package and centralise environment settings by @hunter-read in #725
- Fix: Report every book tag_books leaves untagged; correct two comments by @hunter-read in #727
- Perf: Load the campaign list and admin users list in fixed query counts by @hunter-read in #729
- Perf: Split the frontend bundle by route and load locales on demand by @hunter-read in #731
- Fix: Give GET+HEAD routes unique, stable OpenAPI operationIds by @hunter-read in #732
- Refactor: Share one slugify and one job helper across the backend by @hunter-read in #730
- Refactor: Move shared domain helpers out of backend/routers by @hunter-read in #734
- Feat: Let character sheets ship a phone layout with its own stylesheet by @hunter-read in #733
- Fix: Run the indexer's database steps on the Session's own thread by @hunter-read in #735
- Fix: Drop a stale note response when the wiki selection has moved on by @hunter-read in #736
- Fix: Show a recovery panel when a view fails to render, and an error when a book fails to load by @hunter-read in #737
- Fix: Delete a merged duplicate's files only after the merge commits by @hunter-read in #738
- Fix: Keep a burst of cold page renders from stalling the whole API by @hunter-read in #739
- Refactor: Finish migrating frontend/src to strict TypeScript by @hunter-read in #742
- Fix: Judge a text layer by how much text a page carries, and stop the OCR pass dropping embedded text by @aragorntc in #741
- Feat: Sort the Characters page by name, system or sheet version by @hunter-read in #743
- Feat: Keep a Grimoire Codex DB collection in sync with the library by @hunter-read in #744
- Feat: Let a GM give a character to a player, offer sheet updates, and group party characters by @hunter-read in #745
- Feat: Page the OPDS acquisition feeds when the URL asks with ?page_size= by @hunter-read in #746
- Fix: Stop long system names breaking mid-word beside the card badges by @hunter-read in #747
- Fix: Prune vanished systems in batches with progress, and catch children emptied by the file manager by @hunter-read in #750
- Fix: Stop the read-only export test depending on books other files leave behind by @hunter-read in #752
- Feat: Read the language from OPF sidecars, and OCR each scanned book in its own language by @hunter-read in #753
- Fix: Name a book's system only to readers who can see it, and derive sheet layouts only from their source fields by @hunter-read in #755
- Fix: Keep add-on updates to their own source, bound list paging, and tidy several edge-case errors by @hunter-read in #756
- Fix: Check every add-on download against the index, show the env a script reads, and note two upgrade changes by @hunter-read in #757
- Fix: Match a folder's rows by its exact path, so a look-alike folder's books are left alone by @hunter-read in #758
New Contributors
Full Changelog: v1.9.2...v1.10.0