Skip to content

v1.9.1

Latest

Choose a tag to compare

@hunter-read hunter-read released this 22 Oct 20:09

What's Changed

v1.9.1 is a patch release the way a mimic is a treasure chest. Under the lid, this one is mostly about making Grimoire sturdier and lighter: it uses about half the memory it did, renders book pages in their own process so one cursed PDF can't take the whole server down with it, and no longer runs as root inside the container. A lot of sign-in, session and upload handling got tightened along the way, so a few things need checking before you upgrade - see below.

Your library also looks after itself a bit more. Grimoire now watches the library folder, so books you add, rename or move on disk show up within seconds without a rescan. Merging duplicates is now one step that carries everything across - bookmarks, favourites, campaign links, share links - and the duplicates page lets you burn through the whole queue from the keyboard. Folder naming patterns let Grimoire read a book's title, publisher and version straight out of a filename, so all that careful file naming finally pays off.

At the table, the reader zooms to 800% for the tiny print on those maps, and Join pages stitches a two-page spread into one picture. Players can give their GM edit access to a character sheet, campaigns list everyone's characters by player, and sheets can carry more art than a portrait, so the knight's coat of arms finally has a home.

Before You Upgrade

  • Single sign-on groups: with a Groups Claim set, only groups named exactly admin, gm and player grant roles. Map other names under Settings → Authentication or with OIDC_ADMIN_GROUP, OIDC_GM_GROUP and OIDC_PLAYER_GROUP
  • SECRET_KEY: Grimoire won't start with a key copied from the old docs or compose files. Replace it with the output of openssl rand -hex 32
  • Scripts: requests that change something need the Authorization header or an API key, and ?token= is no longer accepted
  • Valkey: the example compose files now set a Valkey password. If you use one, add --requirepass and put the password in VALKEY_URL
  • WORKERS: change WORKERS=2 from an older compose file to 1 to get the memory savings

New Features

  • Watch the library for changes, with no rescan needed
  • Merge duplicates in one step from any list, with a keyboard-driven review queue
  • Folder naming patterns and variant filename rules
  • Private add-on sources with per-source access tokens
  • Let players give their campaign's GM edit access to a character sheet
  • List a campaign's characters on its page, grouped by player
  • Image fields on character sheets, and a character's art shown large and framed
  • Show when users were last active, and filter logs by user
  • Password rules, per-account sign-in limits and trusted proxies
  • Docker images published to GHCR alongside Docker Hub

Enhancements

  • About half the memory use, with book pages rendered in a separate process
  • Run the container as a non-root user
  • Reader zooms to 800% and keeps zoom between pages
  • Join a spread's pages into one seamless image
  • Book pages open faster from campaign notes and search
  • Link a book's system from the reader header
  • Select a whole folder when linking campaign resources
  • Accept batched replace uploads while earlier replaces re-index
  • STARTUP_SCAN=false skips the scan on start-up
  • Feed and share-link tokens are hashed at rest
  • Update React to 19, Pillow to 13.0 and FFmpeg to 8.1.3

Bug Fixes

  • Renamed folders keep their systems and books
  • Stop reaches the startup scan and OCR
  • Two people reading the same book no longer crash the server
  • Usernames like Émile can sign in again
  • Deleting users and campaigns, and merging guests, either finishes or changes nothing
  • Copy metadata appears on the duplicate comparison page
  • Gallery filters stay open, and fast typing in search keeps every character
  • OPDS covers load in e-readers
  • Reader search snippets show quotes and ampersands
  • Backups include character portraits

Full Changelog: v1.9.0...v1.9.1

What's Changed

  • Enhancement: Cut idle memory from ~500 MB to ~220 MB by @hunter-read in #590
  • Feat: Join the two pages of a spread into one image by @hunter-read in #591
  • Refactor: Run the MCP server on the official mcp SDK by @hunter-read in #592
  • Feat: Zoom the reader to 800% with sharp tiles, and keep zoom across pages by @hunter-read in #593
  • Feat: Select a whole folder when linking campaign resources by @hunter-read in #594
  • CI: Add Dependabot version updates, and build the frontend on Node 22 by @hunter-read in #596
  • Security: Hash feed and share-link tokens at rest; redact VALKEY_URL in logs by @hunter-read in #595
  • Build(deps): Bump the actions group with 10 updates by @dependabot[bot] in #601
  • Build(deps): Bump the web-stack group across 2 directories with 2 updates by @dependabot[bot] in #597
  • Feat: Migrate the frontend to TypeScript, starting with API types from the OpenAPI schema by @hunter-read in #611
  • Build(deps): Bump tzdata from 2025.2 to 2026.5 by @dependabot[bot] in #605
  • Build(deps): Update pytest-cov requirement from >=7.0 to >=7.1.0 by @dependabot[bot] in #606
  • Build(deps): Bump markdownify from 0.14.1 to 1.2.3 by @dependabot[bot] in #607
  • Build(deps): Bump markdownify from 0.14.1 to 1.2.3 in /backend by @dependabot[bot] in #608
  • Build(deps): Bump tzdata from 2025.2 to 2026.5 in /backend by @dependabot[bot] in #609
  • Build(deps): Bump the minor-and-patch group across 1 directory with 11 updates by @dependabot[bot] in #612
  • Build(deps): Bump the actions group with 3 updates by @dependabot[bot] in #613
  • Security: Run the container as a non-root user, and verify the ffmpeg source by @hunter-read in #614
  • Fix: Serialise PyMuPDF use per document, and open documents outside the cache lock by @hunter-read in #616
  • Publish Docker images to GHCR alongside Docker Hub by @hunter-read in #617
  • Refactor: Import config without starting the app; move start-up into lifespan by @hunter-read in #618
  • CI: Run the community add-on contract tests instead of skipping them by @hunter-read in #619
  • CI: Smoke-test both Docker image targets, and cut PR run time by @hunter-read in #620
  • Refactor: Type the ORM models with Mapped[] and re-enable every mypy check by @hunter-read in #621
  • Render PDF pages in a pool of worker processes by @hunter-read in #622
  • Feature: Password rules, per-account sign-in limits and trusted proxies by @hunter-read in #623
  • Fix: Tighten sign-in, links, imports and downloads, and bound sheet formulas by @hunter-read in #629
  • Chore: Tidy sessions, settings, add-ons and container defaults; add structural tests by @hunter-read in #630
  • Build(deps): Bump the minor-and-patch group across 2 directories with 2 updates by @dependabot[bot] in #633
  • Build(deps): Update ruff requirement from >=0.16 to >=0.17.1 by @dependabot[bot] in #635
  • Build(deps): Update pytest requirement from >=9.0 to >=9.1.1 by @dependabot[bot] in #637
  • Chore: Stop duplicate pip Dependabot PRs and hold bcrypt at 4.x by @hunter-read in #643
  • Build(deps): Bump mcp from 1.30.0 to 2.3.0 in /backend by @dependabot[bot] in #639
  • Build(deps): Bump fastapi from 0.143.2 to 0.143.3 in the web-stack group by @dependabot[bot] in #646
  • Build(deps): Bump bcrypt from 4.0.1 to 4.3.0 in the minor-and-patch group by @dependabot[bot] in #647
  • Build(deps): Update mypy requirement from >=2.0 to >=2.4.0 by @dependabot[bot] in #648
  • Fix: Deny explicit content to new OIDC accounts whose claim omits viewNSFW by @hunter-read in #650
  • Fix: Make user deletion and guest merge atomic, and survive shared rows on merge by @hunter-read in #652
  • Docs: Describe the main-only branch flow, and default the gates' base ref to main by @hunter-read in #653
  • Fix: Decode HTML entities in reader search sidebar snippets by @hunter-read in #654
  • Chore: Replace passlib with direct bcrypt calls and move bcrypt to 5.0.0 by @hunter-read in #655
  • Build(deps): Bump sqlalchemy from 2.1.4 to 2.1.5 in the minor-and-patch group by @dependabot[bot] in #656
  • Feat: Image fields on character sheets, and a character's art shown large and framed by @hunter-read in #658
  • Feat: Private add-on sources with per-source access tokens by @hunter-read in #659
  • Feat: Let players give their campaign's GM edit access to a character sheet by @hunter-read in #660
  • Feat: Filename rules - folder naming patterns and variant markers by @hunter-read in #661
  • Fix: Reap a killed render worker from one thread at a time by @hunter-read in #662
  • Feat: List a campaign's characters on its page, grouped by player by @hunter-read in #663
  • Feat: Link a book's system from the reader header by @hunter-read in #665
  • Fix: Accept batched replace uploads while earlier replaces re-index by @hunter-read in #664
  • Fix: Let Stop reach the startup scan, and let it be skipped by @hunter-read in #666
  • Feat: Warm linked book pages from campaign notes and hovered search hits by @hunter-read in #667
  • Feat: Show when users were last active and filter logs by user by @hunter-read in #668
  • Feat: Merge duplicates in one step, from any list, with a fast review queue by @hunter-read in #669
  • Fix: Keep renamed folders' systems and books, and watch the library for changes by @hunter-read in #671
  • Fix: Sign-in, uploads, campaign guests and limits, and update Pillow and FFmpeg by @hunter-read in #672

Full Changelog: v1.9.0...v1.9.1