Bumps the python-deps group with 8 updates in the / directory: | Package | From | To | | --- | --- | --- | | [python-socketio](https://github.com/miguelgrinberg/python-socketio) | `5.16.1` | `5.16.2` | | [tqdm](https://github.com/tqdm/tqdm) | `4.67.3` | `4.68.1` | | [gevent](https://github.com/gevent/gevent) | `26.4.0` | `26.5.0` | | [apprise](https://github.com/caronc/apprise) | `1.10.0` | `1.11.0` | | [seleniumbase](https://github.com/seleniumbase/SeleniumBase) | `4.48.4` | `4.49.7` | | [basedpyright](https://github.com/detachhead/basedpyright) | `1.39.3` | `1.39.6` | | [prek](https://github.com/j178/prek) | `0.3.13` | `0.4.4` | | [ruff](https://github.com/astral-sh/ruff) | `0.15.12` | `0.15.16` | Updates `python-socketio` from 5.16.1 to 5.16.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/miguelgrinberg/python-socketio/releases">python-socketio's releases</a>.</em></p> <blockquote> <h2>Release 5.16.2</h2> <p>See <a href="https://github.com/miguelgrinberg/python-socketio/blob/main/CHANGES.md">CHANGES.md</a> for release notes.</p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/miguelgrinberg/python-socketio/blob/main/CHANGES.md">python-socketio's changelog</a>.</em></p> <blockquote> <h1>python-socketio change log</h1> <p><strong>Release 5.16.2</strong> - 2026-05-21</p> <ul> <li>Prevent unnecessary resource allocations <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1574">#1574</a> (<a href="ca140fe44d">commit</a>)</li> <li>Add zizmor to CI builds <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1570">#1570</a> (<a href="664dc27ec6">commit</a>)</li> </ul> <p><strong>Release 5.16.1</strong> - 2026-02-06</p> <ul> <li>Use configured JSON module in managers <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1549">#1549</a> (<a href="6229261ae6">commit</a>)</li> <li>Admin UI fixes: remove duplicate tasks, report transport upgrades (<a href="1c2eab13a9">commit</a>)</li> <li>Switch to Furo documentation template (<a href="add47d8c7a">commit</a>)</li> <li>Add Python free-threading to CI <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1554">#1554</a> (<a href="ccdd2004a0">commit</a>)</li> </ul> <p><strong>Release 5.16.0</strong> - 2025-12-24</p> <ul> <li>Address deprecation warnings (<a href="b235699d9b">commit</a>)</li> <li>Drop Python 3.8 and 3.9 from CI builds (<a href="d0728d2f74">commit</a>)</li> </ul> <p><strong>Release 5.15.1</strong> - 2025-12-16</p> <ul> <li>Restore support multiple arguments via pubsub emits <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1540">#1540</a> (<a href="c279f26bb8">commit</a>)</li> </ul> <p><strong>Release 5.15.0</strong> - 2025-11-22</p> <ul> <li>Retry initial Redis connection <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1536">#1534</a> ([commit <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1">#1</a>](<a href="1e903e173a</a>) [commit <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/2">#2</a>](<a href="5e898a9b93</a>))</li> <li>Correctly regenerate RabbitMQ binding after a connection failure <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1516">#1516</a> (<a href="c52e93b4a3">commit</a>) (thanks <strong>Gritty_dev</strong>!)</li> <li>Support <code>ext_type</code> in the <code>MsgPackPacket</code> class <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1521">#1521</a> (<a href="208925344a">commit</a>)</li> <li>Support sending <code>bytesarray</code>s when using pub/sub managers (<a href="6c9b9974f7">commit</a>)</li> <li>Fix typos in documentation <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1520">#1520</a> (<a href="db3f1c2a01">commit</a>) (thanks <strong>Lê Nam Khánh</strong>!)</li> <li>Improvements to the logging documentation (<a href="b423d0e38e">commit</a>)</li> </ul> <p><strong>Release 5.14.3</strong> - 2025-10-29</p> <ul> <li>Support Python's native <code>ConnectionRefusedError</code> exception to reject a connection <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1515">#1515</a> (<a href="f3b18bde3f">commit</a>)</li> <li>Push binary data to the aiopika client manager <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1514">#1514</a> (<a href="194e1b7f27">commit</a>)</li> </ul> <p><strong>Release 5.14.2</strong> - 2025-10-15</p> <ul> <li>Restore binary message support in message queue setups <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1509">#1509</a> (<a href="bab4a10f48">commit</a>)</li> <li>Fix formatting of client connection error <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1507">#1507</a> (<a href="f298c9b54d">commit</a>)</li> <li>Add 3.14 and pypy-3.11 CI tasks (<a href="1f4cd3b025">commit</a>)</li> <li>Improve documentation of the <code>BaseManager.get_participants()</code> method (<a href="33722a0d96">commit</a>)</li> </ul> <p><strong>Release 5.14.1</strong> - 2025-10-02</p> <ul> <li>Restore support for <code>rediss://</code> URLs, and add support for <code>valkeys://</code> as well (<a href="6e2d0de12b">commit</a>)</li> <li>Add support for Redis connections using unix sockets <a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1503">#1503</a> (<a href="a8deb3a8f3">commit</a>) (thanks <strong>Darren Chang</strong>!)</li> </ul> <p><strong>Release 5.14.0</strong> - 2025-09-30</p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="6e2b7175c9"><code>6e2b717</code></a> Release 5.16.2</li> <li><a href="cb65829108"><code>cb65829</code></a> update python-engineio version</li> <li><a href="ca140fe44d"><code>ca140fe</code></a> prevent unnecessary resource allocation (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1574">#1574</a>)</li> <li><a href="b29beef6bf"><code>b29beef</code></a> tox configuration</li> <li><a href="e8981302a3"><code>e898130</code></a> Bump ujson from 5.4.0 to 5.12.1 in /examples/server/sanic (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1573">#1573</a>) #nolog</li> <li><a href="05c32f5da8"><code>05c32f5</code></a> Bump qs and body-parser in /examples/server/javascript (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1572">#1572</a>) #nolog</li> <li><a href="287dc6715b"><code>287dc67</code></a> Bump qs and body-parser in /examples/client/javascript (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1571">#1571</a>) #nolog</li> <li><a href="664dc27ec6"><code>664dc27</code></a> add zizmor to ci (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1570">#1570</a>)</li> <li><a href="14c62366a8"><code>14c6236</code></a> Bump django in /examples/server/wsgi/django_socketio (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1566">#1566</a>) #nolog</li> <li><a href="29b2e5cdbe"><code>29b2e5c</code></a> Bump aiohttp from 3.13.3 to 3.13.4 in /examples/server/aiohttp (<a href="https://redirect.github.com/miguelgrinberg/python-socketio/issues/1565">#1565</a>) #nolog</li> <li>Additional commits viewable in <a href="https://github.com/miguelgrinberg/python-socketio/compare/v5.16.1...v5.16.2">compare view</a></li> </ul> </details> <br /> Updates `tqdm` from 4.67.3 to 4.68.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/tqdm/tqdm/releases">tqdm's releases</a>.</em></p> <blockquote> <h2>tqdm v4.68.1 stable</h2> <ul> <li>set name of monitor thread (<a href="https://redirect.github.com/tqdm/tqdm/issues/1669">#1669</a>, <a href="https://redirect.github.com/tqdm/tqdm/issues/1752">#1752</a> <- <a href="https://redirect.github.com/tqdm/tqdm/issues/1435">#1435</a>)</li> <li>fix monitor thread <code>atexit</code> deadlock (<a href="https://redirect.github.com/tqdm/tqdm/issues/1751">#1751</a> <- <a href="https://redirect.github.com/tqdm/tqdm/issues/528">#528</a>, <a href="https://redirect.github.com/tqdm/tqdm/issues/627">#627</a>, <a href="https://redirect.github.com/tqdm/tqdm/issues/1435">#1435</a>, <a href="https://redirect.github.com/tqdm/tqdm/issues/1564">#1564</a>)</li> <li>docs: minor copyediting</li> </ul> <h2>tqdm v4.68.0 stable</h2> <ul> <li><code>utils</code>: simplify terminal size detection (<a href="https://redirect.github.com/tqdm/tqdm/issues/1760">#1760</a>)</li> <li><code>contrib</code> <ul> <li><code>itertools</code> (<a href="https://redirect.github.com/tqdm/tqdm/issues/1760">#1760</a>) <ul> <li>add <code>chain</code>, <code>permutations</code>, <code>combinations</code>, <code>combinations_with_replacement</code>, <code>batched</code></li> <li>add <code>product(repeat=1)</code> keyword argument (<a href="https://redirect.github.com/tqdm/tqdm/issues/1428">#1428</a>)</li> </ul> </li> <li>fix <code>discord</code>, <code>telegram</code> error handling</li> <li>fix <code>discord</code>, <code>slack</code>, <code>telegram</code> format for <code>total=None</code></li> </ul> </li> <li>soft-deprecate <code>tqdm.utils.envwrap</code> -> <a href="https://github.com/tqdm/envwrap"><code>envwrap</code></a></li> <li>benchmarks: fix <code>asv</code></li> <li>misc linting</li> <li>misc framework updates <ul> <li>CI: migrate manual job to <code>pre-commit.ci</code></li> <li>bump workflow actions & pre-commit hooks</li> </ul> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="67cf355f96"><code>67cf355</code></a> Merge pull request <a href="https://redirect.github.com/tqdm/tqdm/issues/1751">#1751</a> from jaltmayerpizzorno/fix-atexit-monitor-deadlock</li> <li><a href="cfa4a8522e"><code>cfa4a85</code></a> minor docstring updates</li> <li><a href="f83290ce32"><code>f83290c</code></a> Fix TMonitor deadlock at interpreter shutdown</li> <li><a href="59029c37ad"><code>59029c3</code></a> Set name for tqdm monitor thread (<a href="https://redirect.github.com/tqdm/tqdm/issues/1752">#1752</a>)</li> <li><a href="ef4a142ebd"><code>ef4a142</code></a> bump version, merge pull request <a href="https://redirect.github.com/tqdm/tqdm/issues/1760">#1760</a> from tqdm/devel</li> <li><a href="17f246b77d"><code>17f246b</code></a> lint warning suppression</li> <li><a href="c682c7b731"><code>c682c7b</code></a> benchmarks: fix asv</li> <li><a href="fc69588dc2"><code>fc69588</code></a> CI: migrate to pre-commit.ci</li> <li><a href="a31d97f821"><code>a31d97f</code></a> more contrib.itertools</li> <li><a href="e4d97426d6"><code>e4d9742</code></a> soft-deprecate tqdm.utils.envwrap -> envwrap</li> <li>Additional commits viewable in <a href="https://github.com/tqdm/tqdm/compare/v4.67.3...v4.68.1">compare view</a></li> </ul> </details> <br /> Updates `gevent` from 26.4.0 to 26.5.0 <details> <summary>Commits</summary> <ul> <li><a href="33c560c2e2"><code>33c560c</code></a> Preparing release 26.5.0</li> <li><a href="7cebc52f71"><code>7cebc52</code></a> ci.yml: add comments about likely problem with macOS 15/26</li> <li><a href="6a9192e6fd"><code>6a9192e</code></a> Add 315 to make-manylinux.</li> <li><a href="65561dc164"><code>65561dc</code></a> Add change note.</li> <li><a href="a651598240"><code>a651598</code></a> test__threading is apparently initializing the hub on 3.15b1/ubuntu-latest/GH...</li> <li><a href="c2cda32db8"><code>c2cda32</code></a> Disable some linux-specific pidfd tests because we don't use that.</li> <li><a href="53371df6be"><code>53371df</code></a> We can't do coverage on 3.15b1, it doesn't have the binary tracer needed for ...</li> <li><a href="ed9160afeb"><code>ed9160a</code></a> Initial support for Python 3.15</li> <li><a href="36e8203a07"><code>36e8203</code></a> Remove the CI badges from README.rst.</li> <li><a href="21bf47d6b1"><code>21bf47d</code></a> Disable appveyor, the windows github action runners were successful.</li> <li>Additional commits viewable in <a href="https://github.com/gevent/gevent/compare/26.4.0...26.5.0">compare view</a></li> </ul> </details> <br /> Updates `apprise` from 1.10.0 to 1.11.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>Release v1.11.0</h2> <h2>What's Changed</h2> <p>A big win for this release is priortization of grouped/tagged content. Basically, this release allows you to tag multiple items and provide a weight to them. Apprise will attempt to notify the highest priority/weighted services first (of same level), and only if this level fails will it try the next. Tagging is no longer just a <code>tag</code>. It's now <code>weight:tag</code> too; for example <code>100:friends</code> associates the weight of <code>100</code> with the tag <code>friends</code>. You can still continue to notify friends with your Apprise calls, but if there are weight categories, then these will be factored into the order. Highest priority (weighted) tags have a lower integer value (zero being the higest priority). Only the next priority will be notified if the first fails.</p> <p>This releae also allows you to set up a notifiation service to gracefully fail and not have Apprise itself report a failure. This is useful for situations where you notify several end points and you really don't care if they're unavailable or not. Apprise wil do it's usual best effort to send the notification, but not treat it as a failure if it can't get through. Use <code>optional=yes</code> on your Apprise URL.</p> <p>Thirdly, this release introduces retries! You can now have Apprise attempt to notify your endpoint a second, or a third, (up to 10x) tries before giving up and deeming it unable to send the notification. Use <code>retry=X</code> on your Apprise URL</p> <h3>📣 New Notification Services:</h3> <ul> <li>Added Zoom (Incoming Webhook) Support in <a href="https://redirect.github.com/caronc/apprise/pull/1596">caronc/apprise#1596</a></li> <li>Added WeChat Support in <a href="https://redirect.github.com/caronc/apprise/pull/1598">caronc/apprise#1598</a></li> <li>RingCentral Support Added in <a href="https://redirect.github.com/caronc/apprise/pull/878">caronc/apprise#878</a></li> <li>Session Open Group Server Support in <a href="https://redirect.github.com/caronc/apprise/pull/1615">caronc/apprise#1615</a></li> <li>Added HumHub Support in <a href="https://redirect.github.com/caronc/apprise/pull/1623">caronc/apprise#1623</a></li> <li>Amazon Chime Support in <a href="https://redirect.github.com/caronc/apprise/pull/1627">caronc/apprise#1627</a></li> <li>GroupMe Support Added in <a href="https://redirect.github.com/caronc/apprise/pull/1629">caronc/apprise#1629</a></li> </ul> <h3>🐞 Bugfixes</h3> <ul> <li>improved robustness of windows test cases preventing others from passing in <a href="https://redirect.github.com/caronc/apprise/pull/1609">caronc/apprise#1609</a></li> <li>Handle XMPP SASL SCRAM-PLUS / Channel Binding in <a href="https://redirect.github.com/caronc/apprise/pull/1619">caronc/apprise#1619</a></li> <li>TRACE logging during apprise init cleaned up in <a href="https://redirect.github.com/caronc/apprise/pull/1622">caronc/apprise#1622</a></li> <li>fixed mastodon error: AttributeError - 'list' object has no attribute 'union' in <a href="https://redirect.github.com/caronc/apprise/pull/1631">caronc/apprise#1631</a></li> </ul> <h3>💡 Features</h3> <ul> <li>o365:// saveToSentItems configurable - ?savesent=no in <a href="https://redirect.github.com/caronc/apprise/pull/1599">caronc/apprise#1599</a></li> <li>updated WhatsApp Buisness Graph API to v21 in <a href="https://redirect.github.com/caronc/apprise/pull/1603">caronc/apprise#1603</a></li> <li>🔥 Built in retries, escalations, priorities, and optional service calls in <a href="https://redirect.github.com/caronc/apprise/pull/1601">caronc/apprise#1601</a></li> <li>Slack Template/Payload support in <a href="https://redirect.github.com/caronc/apprise/pull/1604">caronc/apprise#1604</a></li> <li>Added Slack workflows and trigger support in <a href="https://redirect.github.com/caronc/apprise/pull/1605">caronc/apprise#1605</a></li> <li>🚀 Pushover E2EE Support in <a href="https://redirect.github.com/caronc/apprise/pull/1612">caronc/apprise#1612</a></li> <li>WKD support added to email plugin in <a href="https://redirect.github.com/caronc/apprise/pull/1614">caronc/apprise#1614</a> and <a href="https://redirect.github.com/caronc/apprise/pull/1618">caronc/apprise#1618</a></li> <li>Amazon SNS/SES Improvements in <a href="https://redirect.github.com/caronc/apprise/pull/1620">caronc/apprise#1620</a></li> <li>Notifico Standalone Support Added in <a href="https://redirect.github.com/caronc/apprise/pull/1275">caronc/apprise#1275</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/1593">caronc/apprise#1593</a></li> <li>Twitter/X migration to API v2 in <a href="https://redirect.github.com/caronc/apprise/pull/1607">caronc/apprise#1607</a></li> <li>improvements to workflow:// based on recent slack:// changes in <a href="https://redirect.github.com/caronc/apprise/pull/1608">caronc/apprise#1608</a></li> <li>🔓 Added redirect= for allowing url redirection control in <a href="https://redirect.github.com/caronc/apprise/pull/1610">caronc/apprise#1610</a></li> <li>mqtt:// now depends on paho-mqtt v2.1.0+ in <a href="https://redirect.github.com/caronc/apprise/pull/1613">caronc/apprise#1613</a></li> <li>💀 Retire msteams:// as it is no longer in service upstream in <a href="https://redirect.github.com/caronc/apprise/pull/1625">caronc/apprise#1625</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> <pre lang="bash"><code># Install Apprise v1.11.0 from PyPI pip install apprise==1.11.0 </code></pre> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="158c4e1feb"><code>158c4e1</code></a> bumped version to v1.11.0</li> <li><a href="21db421ee8"><code>21db421</code></a> GroupMe Support Added (<a href="https://redirect.github.com/caronc/apprise/issues/1629">#1629</a>)</li> <li><a href="f1e4ad2fd6"><code>f1e4ad2</code></a> fixed mastodon error: AttributeError - 'list' object has no attribute 'union'...</li> <li><a href="e17fe9dd64"><code>e17fe9d</code></a> Amazon Chime Support (<a href="https://redirect.github.com/caronc/apprise/issues/1627">#1627</a>)</li> <li><a href="dfdac59c99"><code>dfdac59</code></a> HumHub Support added (<a href="https://redirect.github.com/caronc/apprise/issues/1623">#1623</a>)</li> <li><a href="9de0397c30"><code>9de0397</code></a> Notifico Standalone Support Added (<a href="https://redirect.github.com/caronc/apprise/issues/1275">#1275</a>)</li> <li><a href="c3e67e61d3"><code>c3e67e6</code></a> Retired msteams:// - as it is no longer in service upstream (<a href="https://redirect.github.com/caronc/apprise/issues/1625">#1625</a>)</li> <li><a href="b463f23979"><code>b463f23</code></a> TRACE logging during apprise init cleaned up (<a href="https://redirect.github.com/caronc/apprise/issues/1622">#1622</a>)</li> <li><a href="1e2fdeb72b"><code>1e2fdeb</code></a> Amazon SNS/SES Improvements (<a href="https://redirect.github.com/caronc/apprise/issues/1620">#1620</a>)</li> <li><a href="4706d0a459"><code>4706d0a</code></a> Handle XMPP SASL SCRAM-PLUS / Channel Binding (<a href="https://redirect.github.com/caronc/apprise/issues/1619">#1619</a>)</li> <li>Additional commits viewable in <a href="https://github.com/caronc/apprise/compare/v1.10.0...v1.11.0">compare view</a></li> </ul> </details> <br /> Updates `seleniumbase` from 4.48.4 to 4.49.7 <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.49.7 - CDP Mode: Patch 112</h2> <h2>CDP Mode: Patch 112</h2> <ul> <li><a href="a9a76399a3">Fix RuntimeWarning: coroutine 'Connection.aclose' was never awaited</a></li> </ul> <h2>What's Changed</h2> <ul> <li>CDP Mode: Patch 112 by <a href="https://github.com/mdmintz"><code>@mdmintz</code></a> in <a href="https://redirect.github.com/seleniumbase/SeleniumBase/pull/4367">seleniumbase/SeleniumBase#4367</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/seleniumbase/SeleniumBase/compare/v4.49.6...v4.49.7">https://github.com/seleniumbase/SeleniumBase/compare/v4.49.6...v4.49.7</a></p> <h2>4.49.6 - CDP Mode: Patch 111 (and more)</h2> <h2>CDP Mode: Patch 111 (and more)</h2> <ul> <li><a href="3cbb5772fa">Fix RuntimeWarning: coroutine 'Event.wait' was never awaited</a> --> This resolves <a href="https://redirect.github.com/seleniumbase/SeleniumBase/issues/4363">seleniumbase/SeleniumBase#4363</a></li> <li><a href="e7fc1a854c">Remove the selenium-wire integration</a> --> This resolves <a href="https://redirect.github.com/seleniumbase/SeleniumBase/issues/4362">seleniumbase/SeleniumBase#4362</a></li> <li><a href="ed817adefb">activate_cdp_mode(url) should still open the url if already active</a></li> <li><a href="cf996bf039">Save time & memory by only importing sb_install if needed</a></li> <li><a href="c1ab11fc1d">Update the CDP Mode activation sequence</a></li> <li><a href="8274d737af">Optimize the pytest-html report plugin</a></li> <li><a href="f709444731">Refresh Python dependencies</a></li> <li><a href="41666ae760">Update examples</a></li> </ul> <h2>What's Changed</h2> <ul> <li>CDP Mode: Patch 111 (and more) by <a href="https://github.com/mdmintz"><code>@mdmintz</code></a> in <a href="https://redirect.github.com/seleniumbase/SeleniumBase/pull/4365">seleniumbase/SeleniumBase#4365</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/seleniumbase/SeleniumBase/compare/v4.49.5...v4.49.6">https://github.com/seleniumbase/SeleniumBase/compare/v4.49.5...v4.49.6</a></p> <h2>4.49.5 - CDP Mode: Patch 110</h2> <h2>CDP Mode: Patch 110</h2> <ul> <li><a href="0b8a5ce638">Update error-handling for checking if a process is still running</a></li> </ul> <h2>What's Changed</h2> <ul> <li>CDP Mode: Patch 110 by <a href="https://github.com/mdmintz"><code>@mdmintz</code></a> in <a href="https://redirect.github.com/seleniumbase/SeleniumBase/pull/4360">seleniumbase/SeleniumBase#4360</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/seleniumbase/SeleniumBase/compare/v4.49.4...v4.49.5">https://github.com/seleniumbase/SeleniumBase/compare/v4.49.4...v4.49.5</a></p> <h2>4.49.4 - CDP Mode: Patch 109</h2> <h2>CDP Mode: Patch 109</h2> <ul> <li><a href="74ee362dc4">Handle PermissionError in methods that use psutil</a></li> <li><a href="b41d331873">Refresh Python dependencies</a></li> </ul> <h2>What's Changed</h2> <ul> <li>CDP Mode: Patch 109 by <a href="https://github.com/mdmintz"><code>@mdmintz</code></a> in <a href="https://redirect.github.com/seleniumbase/SeleniumBase/pull/4358">seleniumbase/SeleniumBase#4358</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/seleniumbase/SeleniumBase/compare/v4.49.3...v4.49.4">https://github.com/seleniumbase/SeleniumBase/compare/v4.49.3...v4.49.4</a></p> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="9cd73e6698"><code>9cd73e6</code></a> Merge pull request <a href="https://redirect.github.com/seleniumbase/SeleniumBase/issues/4367">#4367</a> from seleniumbase/cdp-mode-patch-112</li> <li><a href="c2973f391e"><code>c2973f3</code></a> Version 4.49.7</li> <li><a href="a9a76399a3"><code>a9a7639</code></a> Fix <code>RuntimeWarning: coroutine 'Connection.aclose' was never awaited</code></li> <li><a href="4732aafc5d"><code>4732aaf</code></a> Merge pull request <a href="https://redirect.github.com/seleniumbase/SeleniumBase/issues/4365">#4365</a> from seleniumbase/cdp-mode-patch-111</li> <li><a href="583e6cd6b9"><code>583e6cd</code></a> Version 4.49.6</li> <li><a href="9e78a662ab"><code>9e78a66</code></a> Officially support Python 3.15</li> <li><a href="f709444731"><code>f709444</code></a> Refresh Python dependencies</li> <li><a href="1c234e270d"><code>1c234e2</code></a> Refresh mkdocs dependencies</li> <li><a href="41666ae760"><code>41666ae</code></a> Update examples</li> <li><a href="b8686dc65d"><code>b8686dc</code></a> Update the documentation</li> <li>Additional commits viewable in <a href="https://github.com/seleniumbase/SeleniumBase/compare/v4.48.4...v4.49.7">compare view</a></li> </ul> </details> <br /> Updates `basedpyright` from 1.39.3 to 1.39.6 <details> <summary>Commits</summary> <ul> <li><a href="ad82d91ce2"><code>ad82d91</code></a> 1.39.6</li> <li><a href="cf60738b8d"><code>cf60738</code></a> fix vscode config for formatting markdown files now that we use two formatter...</li> <li><a href="29e303a1b0"><code>29e303a</code></a> print stderr from npm commands when build fails</li> <li><a href="f133f3d6b9"><code>f133f3d</code></a> uncomment some test code which started causing a test to fail. no idea why i ...</li> <li><a href="f71e96bfe6"><code>f71e96b</code></a> remove python 3.9 check from <code>TypeAlias4</code> test because typeshed has dropped s...</li> <li><a href="e4c40b76f5"><code>e4c40b7</code></a> fix tests</li> <li><a href="d7c522bc2a"><code>d7c522b</code></a> ruff ignore new <code>benchmarkData</code> files from upstream</li> <li><a href="a7cf33dce1"><code>a7cf33d</code></a> fix eslint in vscode</li> <li><a href="14c96beec3"><code>14c96be</code></a> fix logic for reporting invalid <code>pythonPlatform</code> detected by the new eslint v...</li> <li><a href="280802ce1b"><code>280802c</code></a> remove remnants of webpack</li> <li>Additional commits viewable in <a href="https://github.com/detachhead/basedpyright/compare/v1.39.3...v1.39.6">compare view</a></li> </ul> </details> <br /> Updates `prek` from 0.3.13 to 0.4.4 <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.4.4</h2> <h2>Release Notes</h2> <p>Released on 2026-06-04.</p> <h3>✨ Highlights</h3> <p>0.4.4 makes <code>prek run</code> easier to watch and easier to slice.</p> <p>Hook stream output now shows a small live preview under the running hook in the progress UI. Long-running hooks no longer look stuck while they are producing logs, and failed hooks are easier to diagnose because recent output is already visible before the final result.</p> <p>The new group selector lets a single config support different workflows. Tag hooks with <code>groups</code>, then select or exclude those groups at run time:</p> <pre lang="yaml"><code>repos: - repo: local hooks: - id: format name: Format Python language: system entry: ruff format groups: [format, ci] <pre><code> - id: lint name: Lint Python language: system entry: ruff check groups: [lint, ci] </code></pre> <p></code></pre></p> <pre lang="bash"><code>prek run --all-files --group ci prek run --all-files --no-group format </code></pre> <p>This is useful when local development, CI, slow validation, or project-specific checks need different hook sets without splitting the config.</p> <h3>💚 Sponsorship</h3> <p>If prek saves time for you or your team, please consider sponsoring the project on <a href="https://github.com/sponsors/j178">GitHub Sponsors</a>. It helps keep new features, performance work, and maintenance moving.</p> <h3>Enhancements</h3> <!-- 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.4.4</h2> <p>Released on 2026-06-04.</p> <h3>Highlights</h3> <p>0.4.4 makes <code>prek run</code> easier to watch and easier to slice.</p> <p>Hook stream output now shows a small live preview under the running hook in the progress UI. Long-running hooks no longer look stuck while they are producing logs, and failed hooks are easier to diagnose because recent output is already visible before the final result.</p> <p>The new group selector lets a single config support different workflows. Tag hooks with <code>groups</code>, then select or exclude those groups at run time:</p> <pre lang="yaml"><code>repos: - repo: local hooks: - id: format name: Format Python language: system entry: ruff format groups: [format, ci] <pre><code> - id: lint name: Lint Python language: system entry: ruff check groups: [lint, ci] </code></pre> <p></code></pre></p> <pre lang="bash"><code>prek run --all-files --group ci prek run --all-files --no-group format </code></pre> <p>This is useful when local development, CI, slow validation, or project-specific checks need different hook sets without splitting the config.</p> <h3>Enhancements</h3> <ul> <li>Add hook group filters to <code>prek run</code> (<a href="https://redirect.github.com/j178/prek/pull/2141">#2141</a>)</li> <li>Delay hook output preview rendering (<a href="https://redirect.github.com/j178/prek/pull/2140">#2140</a>)</li> <li>Stream hook output in progress UI (<a href="https://redirect.github.com/j178/prek/pull/2136">#2136</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>Fix intent-to-add stash restore (<a href="https://redirect.github.com/j178/prek/pull/2143">#2143</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="f44270e63f"><code>f44270e</code></a> Bump version 0.4.4 (<a href="https://redirect.github.com/j178/prek/issues/2148">#2148</a>)</li> <li><a href="da457c57b5"><code>da457c5</code></a> Document hook stage file input (<a href="https://redirect.github.com/j178/prek/issues/2147">#2147</a>)</li> <li><a href="0fa29294fa"><code>0fa2929</code></a> Add hook group filters to <code>prek run</code> (<a href="https://redirect.github.com/j178/prek/issues/2141">#2141</a>)</li> <li><a href="9b0047ffb3"><code>9b0047f</code></a> Fix intent-to-add stash restore (<a href="https://redirect.github.com/j178/prek/issues/2143">#2143</a>)</li> <li><a href="00b2520f41"><code>00b2520</code></a> Delay hook output preview rendering (<a href="https://redirect.github.com/j178/prek/issues/2140">#2140</a>)</li> <li><a href="a54fdf0935"><code>a54fdf0</code></a> Simplify hook output preview rendering (<a href="https://redirect.github.com/j178/prek/issues/2139">#2139</a>)</li> <li><a href="ab7165d5cd"><code>ab7165d</code></a> Stream hook output in progress UI (<a href="https://redirect.github.com/j178/prek/issues/2136">#2136</a>)</li> <li><a href="f60958443f"><code>f609584</code></a> Remove unpinned dotnet test (<a href="https://redirect.github.com/j178/prek/issues/2137">#2137</a>)</li> <li><a href="ce0d8b34de"><code>ce0d8b3</code></a> Update Rust to 1.96 (<a href="https://redirect.github.com/j178/prek/issues/2134">#2134</a>)</li> <li><a href="1815fc50cc"><code>1815fc5</code></a> Update PyPI Downloads badge to dynamic JSON</li> <li>Additional commits viewable in <a href="https://github.com/j178/prek/compare/v0.3.13...v0.4.4">compare view</a></li> </ul> </details> <br /> Updates `ruff` from 0.15.12 to 0.15.16 <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.16</h2> <h2>Release Notes</h2> <p>Released on 2026-06-04.</p> <h3>Preview features</h3> <ul> <li>[<code>flake8-async</code>] Implement <code>yield-in-context-manager-in-async-generator</code> (<code>ASYNC119</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24644">#24644</a>)</li> <li>[<code>pylint</code>] Narrow diagnostic range and exclude cases without exception handlers (<code>PLW0717</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25440">#25440</a>)</li> <li>[<code>ruff</code>] Treat <code>yield</code> before <code>break</code> from a terminal loop as terminal (<code>RUF075</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25447">#25447</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>[<code>eradicate</code>] Avoid flagging <code>ruff:ignore</code> comments as code (<code>ERA001</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25537">#25537</a>)</li> <li>[<code>eradicate</code>] Fix <code>ERA001</code>/<code>RUF100</code> conflict when <code>noqa</code> is on commented-out code (<a href="https://redirect.github.com/astral-sh/ruff/pull/25414">#25414</a>)</li> <li>[<code>pyflakes</code>] Avoid removing the <code>format</code> call when it would change behavior (<code>F523</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25320">#25320</a>)</li> <li>[<code>pylint</code>] Avoid syntax errors in invalid character replacements in f-strings before Python 3.12 (<code>PLE2510</code>, <code>PLE2512</code>, <code>PLE2513</code>, <code>PLE2514</code>, <code>PLE2515</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25544">#25544</a>)</li> <li>[<code>pyupgrade</code>] Avoid converting <code>format</code> calls with more kinds of side effects (<code>UP032</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25484">#25484</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>[<code>flake8-pytest-style</code>] Avoid fixes for ambiguous <code>argnames</code> and <code>argvalues</code> combinations (<code>PT006</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24776">#24776</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Drop excess capacity from statement suites during parsing (<a href="https://redirect.github.com/astral-sh/ruff/pull/25368">#25368</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>[<code>pydocstyle</code>] Improve discoverability of rules enabled for each convention (<a href="https://redirect.github.com/astral-sh/ruff/pull/24973">#24973</a>)</li> <li>[<code>ruff</code>] Restore example code for Python versions before 3.15 (<code>RUF017</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25439">#25439</a>)</li> <li>Fix typo <code>bin/active</code> → <code>bin/activate</code> in tutorial (<a href="https://redirect.github.com/astral-sh/ruff/pull/25473">#25473</a>)</li> </ul> <h3>Other changes</h3> <ul> <li>Shrink additional parser AST collections (<a href="https://redirect.github.com/astral-sh/ruff/pull/25465">#25465</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/Redslayer112"><code>@Redslayer112</code></a></li> <li><a href="https://github.com/koriyoshi2041"><code>@koriyoshi2041</code></a></li> <li><a href="https://github.com/George-Ogden"><code>@George-Ogden</code></a></li> <li><a href="https://github.com/TejasAmle"><code>@TejasAmle</code></a></li> <li><a href="https://github.com/anishgirianish"><code>@anishgirianish</code></a></li> <li><a href="https://github.com/ntBre"><code>@ntBre</code></a></li> <li><a href="https://github.com/MichaReiser"><code>@MichaReiser</code></a></li> <li><a href="https://github.com/loganrosen"><code>@loganrosen</code></a></li> <li><a href="https://github.com/RafaelJohn9"><code>@RafaelJohn9</code></a></li> <li><a href="https://github.com/adityasingh2400"><code>@adityasingh2400</code></a></li> </ul> <!-- 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.16</h2> <p>Released on 2026-06-04.</p> <h3>Preview features</h3> <ul> <li>[<code>flake8-async</code>] Implement <code>yield-in-context-manager-in-async-generator</code> (<code>ASYNC119</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24644">#24644</a>)</li> <li>[<code>pylint</code>] Narrow diagnostic range and exclude cases without exception handlers (<code>PLW0717</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25440">#25440</a>)</li> <li>[<code>ruff</code>] Treat <code>yield</code> before <code>break</code> from a terminal loop as terminal (<code>RUF075</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25447">#25447</a>)</li> </ul> <h3>Bug fixes</h3> <ul> <li>[<code>eradicate</code>] Avoid flagging <code>ruff:ignore</code> comments as code (<code>ERA001</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25537">#25537</a>)</li> <li>[<code>eradicate</code>] Fix <code>ERA001</code>/<code>RUF100</code> conflict when <code>noqa</code> is on commented-out code (<a href="https://redirect.github.com/astral-sh/ruff/pull/25414">#25414</a>)</li> <li>[<code>pyflakes</code>] Avoid removing the <code>format</code> call when it would change behavior (<code>F523</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25320">#25320</a>)</li> <li>[<code>pylint</code>] Avoid syntax errors in invalid character replacements in f-strings before Python 3.12 (<code>PLE2510</code>, <code>PLE2512</code>, <code>PLE2513</code>, <code>PLE2514</code>, <code>PLE2515</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25544">#25544</a>)</li> <li>[<code>pyupgrade</code>] Avoid converting <code>format</code> calls with more kinds of side effects (<code>UP032</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25484">#25484</a>)</li> </ul> <h3>Rule changes</h3> <ul> <li>[<code>flake8-pytest-style</code>] Avoid fixes for ambiguous <code>argnames</code> and <code>argvalues</code> combinations (<code>PT006</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/24776">#24776</a>)</li> </ul> <h3>Performance</h3> <ul> <li>Drop excess capacity from statement suites during parsing (<a href="https://redirect.github.com/astral-sh/ruff/pull/25368">#25368</a>)</li> </ul> <h3>Documentation</h3> <ul> <li>[<code>pydocstyle</code>] Improve discoverability of rules enabled for each convention (<a href="https://redirect.github.com/astral-sh/ruff/pull/24973">#24973</a>)</li> <li>[<code>ruff</code>] Restore example code for Python versions before 3.15 (<code>RUF017</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/25439">#25439</a>)</li> <li>Fix typo <code>bin/active</code> → <code>bin/activate</code> in tutorial (<a href="https://redirect.github.com/astral-sh/ruff/pull/25473">#25473</a>)</li> </ul> <h3>Other changes</h3> <ul> <li>Shrink additional parser AST collections (<a href="https://redirect.github.com/astral-sh/ruff/pull/25465">#25465</a>)</li> </ul> <h3>Contributors</h3> <ul> <li><a href="https://github.com/Redslayer112"><code>@Redslayer112</code></a></li> <li><a href="https://github.com/koriyoshi2041"><code>@koriyoshi2041</code></a></li> <li><a href="https://github.com/George-Ogden"><code>@George-Ogden</code></a></li> <li><a href="https://github.com/TejasAmle"><code>@TejasAmle</code></a></li> <li><a href="https://github.com/anishgirianish"><code>@anishgirianish</code></a></li> <li><a href="https://github.com/ntBre"><code>@ntBre</code></a></li> <li><a href="https://github.com/MichaReiser"><code>@MichaReiser</code></a></li> <li><a href="https://github.com/loganrosen"><code>@loganrosen</code></a></li> <li><a href="https://github.com/RafaelJohn9"><code>@RafaelJohn9</code></a></li> <li><a href="https://github.com/adityasingh2400"><code>@adityasingh2400</code></a></li> </ul> <h2>0.15.15</h2> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="6c498ab539"><code>6c498ab</code></a> Bump 0.15.16 (<a href="https://redirect.github.com/astral-sh/ruff/issues/25635">#25635</a>)</li> <li><a href="e51e132831"><code>e51e132</code></a> [<code>flake8-async</code>] Implement <code>yield-in-context-manager-in-async-generator</code> (`AS...</li> <li><a href="7c6dcd9f26"><code>7c6dcd9</code></a> [ty] Add caching for pattern match narrowing (<a href="https://redirect.github.com/astral-sh/ruff/issues/25613">#25613</a>)</li> <li><a href="27058fc071"><code>27058fc</code></a> [ty] Compact retained definition and expression identities (<a href="https://redirect.github.com/astral-sh/ruff/issues/25606">#25606</a>)</li> <li><a href="bf80d05f00"><code>bf80d05</code></a> Fix CODEOWNERS syntax (<a href="https://redirect.github.com/astral-sh/ruff/issues/25622">#25622</a>)</li> <li><a href="10ccd511e9"><code>10ccd51</code></a> Shrink additional parser AST collections (<a href="https://redirect.github.com/astral-sh/ruff/issues/25465">#25465</a>)</li> <li><a href="0d7135f4d2"><code>0d7135f</code></a> [ty] Upgrade Salsa (<a href="https://redirect.github.com/astral-sh/ruff/issues/25545">#25545</a>)</li> <li><a href="49493a3cea"><code>49493a3</code></a> [ty] Show type alias value on hover (<a href="https://redirect.github.com/astral-sh/ruff/issues/25381">#25381</a>)</li> <li><a href="85207d3b76"><code>85207d3</code></a> [ty] sys.implementation.version is not sys.version_info (<a href="https://redirect.github.com/astral-sh/ruff/issues/25608">#25608</a>)</li> <li><a href="a8a0614348"><code>a8a0614</code></a> [ty] Avoid retaining duplicate function signatures (<a href="https://redirect.github.com/astral-sh/ruff/issues/25609">#25609</a>)</li> <li>Additional commits viewable in <a href="https://github.com/astral-sh/ruff/compare/0.15.12...0.15.16">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> Co-authored-by: CaliBrain <calibrain@l4n.xyz>
📚 Shelfmark: Book Search & Request Tool
Note
This project is in a stable state as of May 2026 but is not under active maintenance.
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.



