Bumps the python-deps group with 5 updates in the / directory: | Package | From | To | | --- | --- | --- | | [authlib](https://github.com/authlib/authlib) | `1.7.0` | `1.7.2` | | [apprise](https://github.com/caronc/apprise) | `1.9.9` | `1.10.0` | | [seleniumbase](https://github.com/seleniumbase/SeleniumBase) | `4.48.2` | `4.48.4` | | [prek](https://github.com/j178/prek) | `0.3.10` | `0.3.13` | | [ruff](https://github.com/astral-sh/ruff) | `0.15.11` | `0.15.12` | Updates `authlib` from 1.7.0 to 1.7.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/authlib/authlib/releases">authlib's releases</a>.</em></p> <blockquote> <h2>v1.7.2</h2> <h2>What's Changed</h2> <ul> <li>Fix the readme links by <a href="https://github.com/azmeuk"><code>@azmeuk</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/886">authlib/authlib#886</a></li> <li>Allow non-recommended algorithms in ClientSecretJWT and PrivateKey by <a href="https://github.com/azmeuk"><code>@azmeuk</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/887">authlib/authlib#887</a></li> <li>Validate BCP47 language tags with a regex by <a href="https://github.com/azmeuk"><code>@azmeuk</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/873">authlib/authlib#873</a></li> <li>Fix RFC7523 signing with non RSA keys by <a href="https://github.com/azmeuk"><code>@azmeuk</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/884">authlib/authlib#884</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/authlib/authlib/compare/v1.7.1...v1.7.2">https://github.com/authlib/authlib/compare/v1.7.1...v1.7.2</a></p> <h2>v1.7.1</h2> <h2>What's Changed</h2> <ul> <li>Fix authlib.jose deprecation warning poping from _joserfc_helpers by <a href="https://github.com/azmeuk"><code>@azmeuk</code></a> in <a href="https://redirect.github.com/authlib/authlib/pull/881">authlib/authlib#881</a></li> <li>Fix redirecting to unvalidated <code>redirect_uri</code> on <code>InvalidScopeError</code> in <code>OpenIDImplicitGrant</code> and <code>OpenIDHybridGrant</code>.</li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/authlib/authlib/compare/v1.7.0...v1.7.1">https://github.com/authlib/authlib/compare/v1.7.0...v1.7.1</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="a0b76fac3f"><code>a0b76fa</code></a> chore: bump to 1.7.2</li> <li><a href="c85c7f2b02"><code>c85c7f2</code></a> Merge pull request <a href="https://redirect.github.com/authlib/authlib/issues/884">#884</a> from azmeuk/852-rfc7523-key-import</li> <li><a href="a3b2adda43"><code>a3b2add</code></a> Merge pull request <a href="https://redirect.github.com/authlib/authlib/issues/873">#873</a> from azmeuk/bcp47</li> <li><a href="f2578eaa19"><code>f2578ea</code></a> fix: Import RSAKey in auth.py for additional key support</li> <li><a href="b57182cf46"><code>b57182c</code></a> fix: fallback support RSAKey when client_secret is text</li> <li><a href="4e7590292c"><code>4e75902</code></a> Merge branch 'main' into 852-rfc7523-key-import</li> <li><a href="5eb4a86060"><code>5eb4a86</code></a> Merge pull request <a href="https://redirect.github.com/authlib/authlib/issues/887">#887</a> from azmeuk/883-alg</li> <li><a href="5633f37c47"><code>5633f37</code></a> fix: allow non-recommended algorithms in ClientSecretJWT and PrivateKeyJWT</li> <li><a href="4c8e7b381a"><code>4c8e7b3</code></a> Merge pull request <a href="https://redirect.github.com/authlib/authlib/issues/886">#886</a> from azmeuk/885-readme</li> <li><a href="23b333e48a"><code>23b333e</code></a> docs: fix the readme links</li> <li>Additional commits viewable in <a href="https://github.com/authlib/authlib/compare/v1.7.0...v1.7.2">compare view</a></li> </ul> </details> <br /> Updates `apprise` from 1.9.9 to 1.10.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/caronc/apprise/releases">apprise's releases</a>.</em></p> <blockquote> <h2>v1.10.0</h2> <h2>What's Changed</h2> <p>The big wow factor of this release would be the huge effort put into Matrix E2EE built into Apprise without adding overhead to the plugin itself. Huge props to those that helped out. Other than that, a few more services have been added (137 supported now 🚀 ).</p> <p>The official documentation website (<a href="https://appriseit.com">https://appriseit.com</a>) got a nice cleanup; the Service listings are now searchable; some nice tweaks to the URL Builder as well.</p> <h3>📣 New Notification Services:</h3> <ul> <li>Opsgenie functionality ported to jira:// in <a href="https://redirect.github.com/caronc/apprise/pull/1273">caronc/apprise#1273</a></li> <li>Evolution API (WhatsApp) notification plugin by <a href="https://github.com/opastorello"><code>@opastorello</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1579">caronc/apprise#1579</a></li> <li>Added blink(1) support in <a href="https://redirect.github.com/caronc/apprise/pull/1578">caronc/apprise#1578</a></li> <li>Exotel Support in <a href="https://redirect.github.com/caronc/apprise/pull/782">caronc/apprise#782</a></li> <li>Added Octopush Support in <a href="https://redirect.github.com/caronc/apprise/pull/622">caronc/apprise#622</a></li> <li>Added Postmark support in <a href="https://redirect.github.com/caronc/apprise/pull/1590">caronc/apprise#1590</a></li> </ul> <h3>🐞 Bugfixes</h3> <ul> <li>ntfy:// tags= changed to xtags= in <a href="https://redirect.github.com/caronc/apprise/pull/1555">caronc/apprise#1555</a> <ul> <li>this allows tags to work again correctly for those dependant on it; previously <code>tags=</code> conflicted with <code>tags=</code> in Apprise)</li> </ul> </li> <li>XMPP server hostname can differentiate to what is found in JID in <a href="https://redirect.github.com/caronc/apprise/pull/1560">caronc/apprise#1560</a></li> <li>fixed issue with mailto:// when using yahoo.com in <a href="https://redirect.github.com/caronc/apprise/pull/1561">caronc/apprise#1561</a></li> <li>Fluxer time dependant unittest assertion optimized for slower systems in <a href="https://redirect.github.com/caronc/apprise/pull/1566">caronc/apprise#1566</a></li> <li>fixed templating references impacting url generation (on <a href="https://appriseit.com">https://appriseit.com</a>) in <a href="https://redirect.github.com/caronc/apprise/pull/1582">caronc/apprise#1582</a></li> <li>fixed KeyError Exception thrown when certain emoji's specified in <a href="https://redirect.github.com/caronc/apprise/pull/1592">caronc/apprise#1592</a></li> </ul> <h3>💡 Features</h3> <ul> <li>Migrate the Dot. (Quote/0) plugin from API v1 to API v2 by <a href="https://github.com/HerbertGao"><code>@HerbertGao</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1512">caronc/apprise#1512</a> <ul> <li>Updated Dot. plugin to better align with Apprise in <a href="https://redirect.github.com/caronc/apprise/pull/1588">caronc/apprise#1588</a></li> </ul> </li> <li>URLs that can not be loaded are more verbose for the reasoning in <a href="https://redirect.github.com/caronc/apprise/pull/1568">caronc/apprise#1568</a></li> <li>Webex wxteams:// Bot API Support in <a href="https://redirect.github.com/caronc/apprise/pull/1567">caronc/apprise#1567</a></li> <li>fixes parse_url() -> url() -> parse_url() inconsistency in <a href="https://redirect.github.com/caronc/apprise/pull/1572">caronc/apprise#1572</a></li> <li>Pushover Delivery Group Support in <a href="https://redirect.github.com/caronc/apprise/pull/1563">caronc/apprise#1563</a></li> <li>Matrix token template cleanup in <a href="https://redirect.github.com/caronc/apprise/pull/1573">caronc/apprise#1573</a></li> <li>fcm:// add apns-push-type header for reliable iOS delivery by <a href="https://github.com/AlbertoLanaro"><code>@AlbertoLanaro</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1577">caronc/apprise#1577</a></li> <li>Home Assistant "Service' Notification Support Added (extension to what was already there) in <a href="https://redirect.github.com/caronc/apprise/pull/1294">caronc/apprise#1294</a></li> <li>Added attachment support to Mattermost in <a href="https://redirect.github.com/caronc/apprise/pull/1583">caronc/apprise#1583</a></li> <li>🔥 Matrix E2EE Support in <a href="https://redirect.github.com/caronc/apprise/pull/1574">caronc/apprise#1574</a></li> <li>Matrix Hookshot support added in <a href="https://redirect.github.com/caronc/apprise/pull/1586">caronc/apprise#1586</a></li> <li>Mastodon supports hashtag/user references in <a href="https://redirect.github.com/caronc/apprise/pull/1587">caronc/apprise#1587</a></li> <li>PushPlus refactored to support more options in <a href="https://redirect.github.com/caronc/apprise/pull/1589">caronc/apprise#1589</a></li> <li>Inproved azure:// error handling and message responses in <a href="https://redirect.github.com/caronc/apprise/pull/1499">caronc/apprise#1499</a></li> </ul> <h3>❤️ Life-Cycle Support</h3> <ul> <li>Update LoC badge by <a href="https://github.com/github-actions"><code>@github-actions</code></a>[bot] in <a href="https://redirect.github.com/caronc/apprise/pull/1554">caronc/apprise#1554</a></li> <li>Memory-Optimized Plugin Management in <a href="https://redirect.github.com/caronc/apprise/pull/1557">caronc/apprise#1557</a></li> <li>Ruff linter configuration updated and applied to entire codebase in <a href="https://redirect.github.com/caronc/apprise/pull/1562">caronc/apprise#1562</a></li> <li>i18n(pt_BR): add Brazilian Portuguese translation by <a href="https://github.com/opastorello"><code>@opastorello</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1580">caronc/apprise#1580</a></li> <li>i18n(es): add Spanish translation by <a href="https://github.com/opastorello"><code>@opastorello</code></a> in <a href="https://redirect.github.com/caronc/apprise/pull/1581">caronc/apprise#1581</a></li> </ul> <h2>Installation</h2> <p>Apprise is available <a href="https://pypi.org/project/apprise/">on PyPI</a> through <em>pip</em>:</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="343c960969"><code>343c960</code></a> bummped version to v1.10.0</li> <li><a href="67b5230771"><code>67b5230</code></a> Inproved azure:// error handling and message responses (<a href="https://redirect.github.com/caronc/apprise/issues/1499">#1499</a>)</li> <li><a href="755f17479f"><code>755f174</code></a> bugfix: KeyError Exception thrown when certain emoji's specified (<a href="https://redirect.github.com/caronc/apprise/issues/1592">#1592</a>)</li> <li><a href="a7bc56dd81"><code>a7bc56d</code></a> PushPlus refactored to support more options (<a href="https://redirect.github.com/caronc/apprise/issues/1589">#1589</a>)</li> <li><a href="9d0056b9cd"><code>9d0056b</code></a> Added Postmark support (<a href="https://redirect.github.com/caronc/apprise/issues/1590">#1590</a>)</li> <li><a href="0617ef7ac6"><code>0617ef7</code></a> Updated Dot. plugin to better align with Apprise standards (<a href="https://redirect.github.com/caronc/apprise/issues/1588">#1588</a>)</li> <li><a href="0fbe094686"><code>0fbe094</code></a> Added Octopush Support (<a href="https://redirect.github.com/caronc/apprise/issues/622">#622</a>)</li> <li><a href="58d0f1e00a"><code>58d0f1e</code></a> Exotel Support (<a href="https://redirect.github.com/caronc/apprise/issues/782">#782</a>)</li> <li><a href="2a8d62fad5"><code>2a8d62f</code></a> Mastodon supports hashtag/user references (<a href="https://redirect.github.com/caronc/apprise/issues/1587">#1587</a>)</li> <li><a href="1382633788"><code>1382633</code></a> Matrix Hookshot support added (<a href="https://redirect.github.com/caronc/apprise/issues/1586">#1586</a>)</li> <li>Additional commits viewable in <a href="https://github.com/caronc/apprise/compare/v1.9.9...v1.10.0">compare view</a></li> </ul> </details> <br /> Updates `seleniumbase` from 4.48.2 to 4.48.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/seleniumbase/SeleniumBase/releases">seleniumbase's releases</a>.</em></p> <blockquote> <h2>4.48.4 - CDP Mode: Patch 104</h2> <h2>CDP Mode: Patch 104</h2> <ul> <li><a href="a756d91999">Update CDP Mode</a></li> <li><a href="0e8b32f9b8">Update CDP Mode examples</a></li> </ul> <h2>What's Changed</h2> <ul> <li>CDP Mode: Patch 104 by <a href="https://github.com/mdmintz"><code>@mdmintz</code></a> in <a href="https://redirect.github.com/seleniumbase/SeleniumBase/pull/4339">seleniumbase/SeleniumBase#4339</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/seleniumbase/SeleniumBase/compare/v4.48.3...v4.48.4">https://github.com/seleniumbase/SeleniumBase/compare/v4.48.3...v4.48.4</a></p> <h2>4.48.3 - Update config and dependencies</h2> <h2>Update config and dependencies</h2> <ul> <li><a href="e5b2ffde2a">Update default config in Chrome</a></li> <li><a href="163ef1b5b9">Refresh Python dependencies</a></li> </ul> <h2>What's Changed</h2> <ul> <li>Update config and dependencies by <a href="https://github.com/mdmintz"><code>@mdmintz</code></a> in <a href="https://redirect.github.com/seleniumbase/SeleniumBase/pull/4338">seleniumbase/SeleniumBase#4338</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/seleniumbase/SeleniumBase/compare/v4.48.2...v4.48.3">https://github.com/seleniumbase/SeleniumBase/compare/v4.48.2...v4.48.3</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="9ae2c55aba"><code>9ae2c55</code></a> Merge pull request <a href="https://redirect.github.com/seleniumbase/SeleniumBase/issues/4339">#4339</a> from seleniumbase/cdp-mode-patch-104</li> <li><a href="854529fb1e"><code>854529f</code></a> Version 4.48.4</li> <li><a href="0e8b32f9b8"><code>0e8b32f</code></a> Update CDP Mode examples</li> <li><a href="a756d91999"><code>a756d91</code></a> Update CDP Mode</li> <li><a href="7e07f81ff3"><code>7e07f81</code></a> Merge pull request <a href="https://redirect.github.com/seleniumbase/SeleniumBase/issues/4338">#4338</a> from seleniumbase/update-config-and-dependencies</li> <li><a href="dbf2979951"><code>dbf2979</code></a> Version 4.48.3</li> <li><a href="163ef1b5b9"><code>163ef1b</code></a> Refresh Python dependencies</li> <li><a href="e5b2ffde2a"><code>e5b2ffd</code></a> Update default config in Chrome</li> <li><a href="ac638ca1b1"><code>ac638ca</code></a> Update examples</li> <li><a href="2fe80fe4fc"><code>2fe80fe</code></a> Update CDP Mode examples</li> <li>Additional commits viewable in <a href="https://github.com/seleniumbase/SeleniumBase/compare/v4.48.2...v4.48.4">compare view</a></li> </ul> </details> <br /> Updates `prek` from 0.3.10 to 0.3.13 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/j178/prek/releases">prek's releases</a>.</em></p> <blockquote> <h2>0.3.13</h2> <h2>Release Notes</h2> <p>Released on 2026-05-06.</p> <h3>Bug fixes</h3> <ul> <li>Respect hook filters for message files (<a href="https://redirect.github.com/j178/prek/pull/2049">#2049</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>Add Godot Engine to users in README (<a href="https://redirect.github.com/j178/prek/pull/2047">#2047</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/j178"><code>@j178</code></a></li> <li><a href="https://github.com/Calinou"><code>@Calinou</code></a></li> </ul> <h2>Install prek 0.3.13</h2> <h3>Install prebuilt binaries via shell script</h3> <pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf https://github.com/j178/prek/releases/download/v0.3.13/prek-installer.sh | sh </code></pre> <h3>Install prebuilt binaries via powershell script</h3> <pre lang="sh"><code>powershell -ExecutionPolicy Bypass -c "irm https://github.com/j178/prek/releases/download/v0.3.13/prek-installer.ps1 | iex" </code></pre> <h3>Install prebuilt binaries via Homebrew</h3> <pre lang="sh"><code>brew install prek </code></pre> <h2>Download prek 0.3.13</h2> <table> <thead> <tr> <th>File</th> <th>Platform</th> <th>Checksum</th> </tr> </thead> <tbody> <tr> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-aarch64-apple-darwin.tar.gz">prek-aarch64-apple-darwin.tar.gz</a></td> <td>Apple Silicon macOS</td> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-aarch64-apple-darwin.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-x86_64-apple-darwin.tar.gz">prek-x86_64-apple-darwin.tar.gz</a></td> <td>Intel macOS</td> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-x86_64-apple-darwin.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-aarch64-pc-windows-msvc.zip">prek-aarch64-pc-windows-msvc.zip</a></td> <td>ARM64 Windows</td> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-aarch64-pc-windows-msvc.zip.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-i686-pc-windows-msvc.zip">prek-i686-pc-windows-msvc.zip</a></td> <td>x86 Windows</td> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-i686-pc-windows-msvc.zip.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-x86_64-pc-windows-msvc.zip">prek-x86_64-pc-windows-msvc.zip</a></td> <td>x64 Windows</td> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-x86_64-pc-windows-msvc.zip.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-aarch64-unknown-linux-gnu.tar.gz">prek-aarch64-unknown-linux-gnu.tar.gz</a></td> <td>ARM64 Linux</td> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-aarch64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-i686-unknown-linux-gnu.tar.gz">prek-i686-unknown-linux-gnu.tar.gz</a></td> <td>x86 Linux</td> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-i686-unknown-linux-gnu.tar.gz.sha256">checksum</a></td> </tr> <tr> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-riscv64gc-unknown-linux-gnu.tar.gz">prek-riscv64gc-unknown-linux-gnu.tar.gz</a></td> <td>RISCV Linux</td> <td><a href="https://github.com/j178/prek/releases/download/v0.3.13/prek-riscv64gc-unknown-linux-gnu.tar.gz.sha256">checksum</a></td> </tr> </tbody> </table> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/j178/prek/blob/master/CHANGELOG.md">prek's changelog</a>.</em></p> <blockquote> <h2>0.3.13</h2> <p>Released on 2026-05-06.</p> <h3>Bug fixes</h3> <ul> <li>Respect hook filters for message files (<a href="https://redirect.github.com/j178/prek/pull/2049">#2049</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>Add Godot Engine to users in README (<a href="https://redirect.github.com/j178/prek/pull/2047">#2047</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/j178"><code>@j178</code></a></li> <li><a href="https://github.com/Calinou"><code>@Calinou</code></a></li> </ul> <h2>0.3.12</h2> <p>Released on 2026-05-05.</p> <h3>Highlights</h3> <p><code>auto_update.cooldown_days</code> is now available in both the user-level global config (<code>~/.config/prek/prek.toml</code> on Linux and macOS, or <code>$XDG_CONFIG_HOME/prek/prek.toml</code> when set; <code>%APPDATA%\prek\prek.toml</code> on Windows) and project config. Set a user default for <code>prek auto-update</code>, then override it per project when a repository needs a different update cadence.</p> <pre lang="toml"><code>[auto_update] cooldown_days = 7 </code></pre> <h3>Enhancements</h3> <ul> <li>Add global auto-update cooldown config (<a href="https://redirect.github.com/j178/prek/pull/2041">#2041</a>)</li> <li>Add project auto-update cooldown config (<a href="https://redirect.github.com/j178/prek/pull/2044">#2044</a>)</li> <li>Support <code>language: dart</code> (<a href="https://redirect.github.com/j178/prek/pull/1146">#1146</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>Pass commit message file to workspace hooks (<a href="https://redirect.github.com/j178/prek/pull/2043">#2043</a>)</li> <li>Preserve non-UTF8 filenames from git (<a href="https://redirect.github.com/j178/prek/pull/2023">#2023</a>)</li> <li>ruby: put resolved Ruby's bin dir on <code>$PATH</code> for <code>gem</code> invocations (<a href="https://redirect.github.com/j178/prek/pull/2021">#2021</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>Update docs with the new logo and icon (<a href="https://redirect.github.com/j178/prek/pull/2025">#2025</a>)</li> <li>Point schema docs to SchemaStore (<a href="https://redirect.github.com/j178/prek/pull/2039">#2039</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="81b290ef06"><code>81b290e</code></a> Bump version to 0.3.13 (<a href="https://redirect.github.com/j178/prek/issues/2050">#2050</a>)</li> <li><a href="3f5e5c6e54"><code>3f5e5c6</code></a> Respect hook filters for message files (<a href="https://redirect.github.com/j178/prek/issues/2049">#2049</a>)</li> <li><a href="1fab88775a"><code>1fab887</code></a> Add Godot Engine to users in README (<a href="https://redirect.github.com/j178/prek/issues/2047">#2047</a>)</li> <li><a href="93a71e0b73"><code>93a71e0</code></a> Remove deleted <code>dist/post/index.cjs</code> from publish prek version workflow (<a href="https://redirect.github.com/j178/prek/issues/2046">#2046</a>)</li> <li><a href="56d6d0c13e"><code>56d6d0c</code></a> Bump version to 0.3.12 (<a href="https://redirect.github.com/j178/prek/issues/2045">#2045</a>)</li> <li><a href="5f94f6f8ea"><code>5f94f6f</code></a> Add project auto-update cooldown config (<a href="https://redirect.github.com/j178/prek/issues/2044">#2044</a>)</li> <li><a href="c52833e999"><code>c52833e</code></a> Add global auto-update cooldown</li> <li><a href="8af3054dc6"><code>8af3054</code></a> Pass commit message file to workspace hooks (<a href="https://redirect.github.com/j178/prek/issues/2043">#2043</a>)</li> <li><a href="1bf54f5fa9"><code>1bf54f5</code></a> Update Rust crate serde-saphyr to 0.0.25 (<a href="https://redirect.github.com/j178/prek/issues/2036">#2036</a>)</li> <li><a href="8c9761a523"><code>8c9761a</code></a> Bump rand to 0.9.4 (<a href="https://redirect.github.com/j178/prek/issues/2040">#2040</a>)</li> <li>Additional commits viewable in <a href="https://github.com/j178/prek/compare/v0.3.10...v0.3.13">compare view</a></li> </ul> </details> <br /> Updates `ruff` from 0.15.11 to 0.15.12 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/releases">ruff's releases</a>.</em></p> <blockquote> <h2>0.15.12</h2> <h2>Release Notes</h2> <p>Released on 2026-04-24.</p> <h3>Preview features</h3> <ul> <li>Implement <code>#ruff:file-ignore</code> file-level suppressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/23599">#23599</a>)</li> <li>Implement <code>#ruff:ignore</code> logical-line suppressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/23404">#23404</a>)</li> <li>Revert preview changes to displayed diagnostic severity in LSP (<a href="https://redirect.github.com/astral-sh/ruff/pull/24789">#24789</a>)</li> <li>[<code>airflow</code>] Implement <code>task-branch-as-short-circuit</code> (<code>AIR004</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/23579">#23579</a>)</li> <li>[<code>flake8-bugbear</code>] Fix <code>break</code>/<code>continue</code> handling in <code>loop-iterator-mutation</code> (<code>B909</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24440">#24440</a>)</li> <li>[<code>pylint</code>] Fix <code>PLC2701</code> for type parameter scopes (<a href="https://redirect.github.com/astral-sh/ruff/pull/24576">#24576</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>[<code>pandas-vet</code>] Suggest <code>.array</code> as well in <code>PD011</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/24805">#24805</a>)</li> </ul> <h3>CLI</h3> <ul> <li>Respect default Unix permissions for cache files (<a href="https://redirect.github.com/astral-sh/ruff/pull/24794">#24794</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>[<code>pylint</code>] Fix <code>PLR0124</code> description not to claim self-comparison always returns the same value (<a href="https://redirect.github.com/astral-sh/ruff/pull/24749">#24749</a>)</li> <li>[<code>pyupgrade</code>] Expand docs on reusable <code>TypeVar</code>s and scoping (<code>UP046</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24153">#24153</a>)</li> <li>Improve rules table accessibility (<a href="https://redirect.github.com/astral-sh/ruff/pull/24711">#24711</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/dylwil3"><code>@dylwil3</code></a></li> <li><a href="https://github.com/AlexWaygood"><code>@AlexWaygood</code></a></li> <li><a href="https://github.com/woodruffw"><code>@woodruffw</code></a></li> <li><a href="https://github.com/avasis-ai"><code>@avasis-ai</code></a></li> <li><a href="https://github.com/Dev-iL"><code>@Dev-iL</code></a></li> <li><a href="https://github.com/denyszhak"><code>@denyszhak</code></a></li> <li><a href="https://github.com/ShipItAndPray"><code>@ShipItAndPray</code></a></li> <li><a href="https://github.com/anishgirianish"><code>@anishgirianish</code></a></li> <li><a href="https://github.com/augustelalande"><code>@augustelalande</code></a></li> <li><a href="https://github.com/amyreese"><code>@amyreese</code></a></li> <li><a href="https://github.com/majiayu000"><code>@majiayu000</code></a></li> </ul> <h2>Install ruff 0.15.12</h2> <h3>Install prebuilt binaries via shell script</h3> <pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf https://releases.astral.sh/github/ruff/releases/download/0.15.12/ruff-installer.sh | sh </code></pre> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's changelog</a>.</em></p> <blockquote> <h2>0.15.12</h2> <p>Released on 2026-04-24.</p> <h3>Preview features</h3> <ul> <li>Implement <code>#ruff:file-ignore</code> file-level suppressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/23599">#23599</a>)</li> <li>Implement <code>#ruff:ignore</code> logical-line suppressions (<a href="https://redirect.github.com/astral-sh/ruff/pull/23404">#23404</a>)</li> <li>Revert preview changes to displayed diagnostic severity in LSP (<a href="https://redirect.github.com/astral-sh/ruff/pull/24789">#24789</a>)</li> <li>[<code>airflow</code>] Implement <code>task-branch-as-short-circuit</code> (<code>AIR004</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/23579">#23579</a>)</li> <li>[<code>flake8-bugbear</code>] Fix <code>break</code>/<code>continue</code> handling in <code>loop-iterator-mutation</code> (<code>B909</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24440">#24440</a>)</li> <li>[<code>pylint</code>] Fix <code>PLC2701</code> for type parameter scopes (<a href="https://redirect.github.com/astral-sh/ruff/pull/24576">#24576</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>[<code>pandas-vet</code>] Suggest <code>.array</code> as well in <code>PD011</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/24805">#24805</a>)</li> </ul> <h3>CLI</h3> <ul> <li>Respect default Unix permissions for cache files (<a href="https://redirect.github.com/astral-sh/ruff/pull/24794">#24794</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>[<code>pylint</code>] Fix <code>PLR0124</code> description not to claim self-comparison always returns the same value (<a href="https://redirect.github.com/astral-sh/ruff/pull/24749">#24749</a>)</li> <li>[<code>pyupgrade</code>] Expand docs on reusable <code>TypeVar</code>s and scoping (<code>UP046</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24153">#24153</a>)</li> <li>Improve rules table accessibility (<a href="https://redirect.github.com/astral-sh/ruff/pull/24711">#24711</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/dylwil3"><code>@dylwil3</code></a></li> <li><a href="https://github.com/AlexWaygood"><code>@AlexWaygood</code></a></li> <li><a href="https://github.com/woodruffw"><code>@woodruffw</code></a></li> <li><a href="https://github.com/avasis-ai"><code>@avasis-ai</code></a></li> <li><a href="https://github.com/Dev-iL"><code>@Dev-iL</code></a></li> <li><a href="https://github.com/denyszhak"><code>@denyszhak</code></a></li> <li><a href="https://github.com/ShipItAndPray"><code>@ShipItAndPray</code></a></li> <li><a href="https://github.com/anishgirianish"><code>@anishgirianish</code></a></li> <li><a href="https://github.com/augustelalande"><code>@augustelalande</code></a></li> <li><a href="https://github.com/amyreese"><code>@amyreese</code></a></li> <li><a href="https://github.com/majiayu000"><code>@majiayu000</code></a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="66f93cf7ed"><code>66f93cf</code></a> Bump 0.15.12 (<a href="https://redirect.github.com/astral-sh/ruff/issues/24815">#24815</a>)</li> <li><a href="476a4d02e8"><code>476a4d0</code></a> [ty] Complete support for more detailed diagnostics on possibly unbound error...</li> <li><a href="ed669eab30"><code>ed669ea</code></a> Implement <code>#ruff:file-ignore</code> file-level suppressions (<a href="https://redirect.github.com/astral-sh/ruff/issues/23599">#23599</a>)</li> <li><a href="e73d952e43"><code>e73d952</code></a> [ty] Include inferred type in <code>invalid-key</code> concise diagnostic for union/inte...</li> <li><a href="80feb29b31"><code>80feb29</code></a> [ty] report only dead annotation-only locals as unused (<a href="https://redirect.github.com/astral-sh/ruff/issues/24811">#24811</a>)</li> <li><a href="0fbf2bc273"><code>0fbf2bc</code></a> Drop deprecated license classifier (<a href="https://redirect.github.com/astral-sh/ruff/issues/24808">#24808</a>)</li> <li><a href="43b174cc7f"><code>43b174c</code></a> [ty] Infer lambda parameter types with <code>Callable</code> type context (<a href="https://redirect.github.com/astral-sh/ruff/issues/24317">#24317</a>)</li> <li><a href="4f449ae4a2"><code>4f449ae</code></a> [ty] Add error context for intersection types (<a href="https://redirect.github.com/astral-sh/ruff/issues/24772">#24772</a>)</li> <li><a href="5b4e753acb"><code>5b4e753</code></a> [ty] Add support for goto in literal enum member inlay hint (<a href="https://redirect.github.com/astral-sh/ruff/issues/24792">#24792</a>)</li> <li><a href="e7cc76275a"><code>e7cc762</code></a> [ty] Add error context for TypedDict assignments (<a href="https://redirect.github.com/astral-sh/ruff/issues/24790">#24790</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/ruff/compare/0.15.11...0.15.12">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
📚 Shelfmark: Book Search & Request Tool
Shelfmark is a self-hosted web interface for searching and requesting books and audiobooks across multiple sources. Bring your own sources, metadata providers, and download clients to build a single hub for your digital library. Supports multiple users with a built-in request system, so you can share your instance with others and let them browse and request books on their own.
Works great alongside the following library tools, with support for automatic imports:
✨ Features
- One-Stop Interface - A clean, modern UI to search, browse, and download from multiple configured sources in one place
- Multiple Sources - Configurable web, torrent, usenet, and IRC source support
- Audiobook Support - Full audiobook search and download with dedicated processing
- Flexible Search - Search metadata providers (Hardcover, Open Library, Google Books) for rich book and audiobook discovery, or query configured sources directly
- Multi-User & Requests - Share your instance with others, let users browse and request books, and manage approvals with configurable notifications
- Authentication - Built-in login, OIDC single sign-on, proxy auth, and Calibre-Web database support
- Real-Time Progress - Unified download queue with live status updates across all sources
- Network Flexibility - Configurable proxy support, DNS settings, and optional Cloudflare handling for protected sources
🖼️ Screenshots
🚀 Quick Start
Prerequisites
- Docker & Docker Compose
Installation
-
Download the docker-compose file:
curl -O https://raw.githubusercontent.com/calibrain/shelfmark/main/compose/docker-compose.yml -
Start the service:
docker compose up -d -
Open
http://localhost:8084
Open the web interface, then configure the sources and settings you want to use.
Volume Setup
volumes:
- /your/config/path:/config # Config, database, and artwork cache directory
- /your/download/path:/books # Downloaded books
- /client/path:/client/path # Optional: For Torrent/Usenet downloads, match your client directory exactly.
Tip
: Point the download volume to your CWA or Grimmory ingest folder for automatic import.
Note
: CIFS shares require
nobrlmount option to avoid database lock errors.
Non-root container mode
- Start the container as
1000:1000with Dockeruser: "1000:1000"ordocker run --user 1000:1000. - For Kubernetes, set
runAsUser: 1000,runAsGroup: 1000, andrunAsNonRoot: truetogether. PUID/PGIDkeep the default root startup flow.- Mounted paths must already be writable by
1000:1000. USING_TOR=truerequires root startup.
⚙️ Configuration
Search Modes
Direct
- Queries configured sources directly
Universal (recommended)
- Search via metadata providers (Hardcover, Open Library, Google Books) for richer results
- Aggregates releases from multiple configured sources
- Full audiobook support
Environment Variables
Environment variables work for initial setup and Docker deployments. They serve as defaults that can be overridden in the web interface.
| Variable | Description | Default |
|---|---|---|
FLASK_PORT |
Web interface port | 8084 |
INGEST_DIR |
Book download directory | /books |
TZ |
Container timezone | UTC |
PUID / PGID |
Runtime user/group for the default root-startup flow (also supports legacy UID/GID) |
1000 / 1000 |
SEARCH_MODE |
direct or universal |
universal |
USING_TOR |
Enable Tor routing (requires root startup) | false |
See the full Environment Variables Reference for all available options.
Some of the additional options available in Settings:
- Prowlarr - Configure indexers and download clients to download books and audiobooks
- Additional audiobook sources - Configure additional sources for audiobook discovery
- IRC - Add details for IRC book sources and download directly from the UI
- Library Link - Add a link to your Calibre-Web or Grimmory instance in the UI header
- File processing - Customiseable download paths, file renaming and directory creation with template-based renaming
- Network Settings - Custom proxy support (SOCKS5 + HTTP/S) and configurable DNS
- Format & Language - Filter downloads by preferred formats, languages and sorting order
- Metadata Providers - Configure API keys for Hardcover, Open Library, etc.
🐳 Docker Variants
Standard
docker compose up -d
The full-featured image with all network capabilities included.
Tor Routing
Optional Tor support for network privacy:
curl -O https://raw.githubusercontent.com/calibrain/shelfmark/main/compose/docker-compose.tor.yml
docker compose -f docker-compose.tor.yml up -d
Notes:
- Requires root startup
- Requires
NET_ADMINandNET_RAWcapabilities - Timezone is auto-detected from Tor exit node
- Custom DNS/proxy settings are ignored when Tor is active
Lite
A lighter image without the built-in browser automation. Ideal for:
- External services - Already running FlareSolverr or similar for other applications
- Alternative sources - Using Prowlarr, IRC, or other configured sources
- Audiobooks - Using Shelfmark primarily for audiobooks
curl -O https://raw.githubusercontent.com/calibrain/shelfmark/main/compose/docker-compose.lite.yml
docker compose -f docker-compose.lite.yml up -d
If you need browser-based access with the Lite image, configure an external resolver in Settings.
🔐 Authentication
Authentication is optional but recommended for shared or exposed instances. Multiple authentication methods are available in Settings:
1. Single Username/Password
2. Proxy (Forward) Authentication
Proxy auth trusts headers set by your reverse proxy (e.g. X-Auth-User). Ensure Shelfmark is not directly exposed, and configure your proxy to strip/overwrite these headers for all inbound requests.
3. OIDC (OpenID Connect)
Integrate with your identity provider (Authelia, Authentik, Keycloak, etc.) for single sign-on. Supports PKCE flow, auto-discovery, group-based admin mapping, and auto-provisioning of new users.
4. Calibre-Web Database
If you're running Calibre-Web, you can reuse its user database by mounting it:
volumes:
- /path/to/calibre-web/app.db:/auth/app.db:ro
Multi-User Support
With any authentication method enabled, Shelfmark supports multi-user management with admin/user roles. Users can have per-user settings for download destinations, email recipients, and notification preferences. Non-admin users only see their own downloads and can submit book requests for admin review. Admins can configure request policies per source to control whether users can download directly, must submit a request, or are blocked entirely.
Project Scope
Shelfmark is a manual search and download tool, the entry point to your book library, not a library manager. It finds books, downloads them, and sends them to a configured destination. That's the full scope.
Shelfmark intentionally does not:
- Track or manage your library - it doesn't know or care what you already own
- Integrate with library software - what happens after delivery is up to your library tool
- Monitor authors, series, or new releases - there is no background automation
- Queue future downloads - if a book isn't available now, Shelfmark won't watch for it
These are non-goals, not missing features.
Contributing
Shelfmark's core feature set is complete. Development focuses on stability, bug fixes, quality-of-life improvements, and refining the search experience. Contributions in these areas are welcome, please file issues or submit pull requests on GitHub.
Feature requests that fall outside the project scope (library integration, automation, collection management) will be closed. If you're unsure whether something fits, open a discussion first.
Health Monitoring
The application exposes a health endpoint at /api/health (no authentication required). Add a health check to your compose:
healthcheck:
test: ["CMD", "curl", "-sf", "http://localhost:8084/api/health"]
interval: 30s
timeout: 30s
retries: 3
Logging
Logs are available via:
docker logs <container-name>/var/log/shelfmark/inside the container (whenENABLE_LOGGING=true)
Log level is configurable via Settings or LOG_LEVEL environment variable.
Development
# Quality checks
make checks # Run ALL static analysis (frontend + Python)
make python-checks # Run Ruff, BasedPyright, and Vulture
make install-python-dev # Sync Python runtime + dev tools with uv
# Frontend development
make install # Install dependencies
make dev # Start Vite dev server (localhost:5173)
make build # Production build
make frontend-typecheck # TypeScript checks
# Backend (Docker)
make up # Start backend via docker-compose.dev.yml
make down # Stop services
make refresh # Rebuild and restart
make restart # Restart container
The frontend dev server proxies to the backend on port 8084.
License
MIT License - see LICENSE for details.
⚠️ Disclaimer
Shelfmark is a search interface that displays results from external metadata providers and sources. It does not host, store, or distribute any content. The developers are not responsible for how the tool is used or what is accessed through it.
Users are solely responsible for:
- Ensuring they have the legal right to download any material they access
- Complying with copyright laws and intellectual property rights in their jurisdiction
- Understanding and accepting the terms of any sources they configure
Use of this tool is entirely at your own risk.
Support
For issues or questions, please file an issue on GitHub.



