dependabot[bot] 5d5b8d4bef Bump the python-deps group across 1 directory with 8 updates (#1049)
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> &lt;-
<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> &lt;-
<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> -&gt; <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 &amp; 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 -&gt; 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>
--&gt; 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>
--&gt; 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 &amp; 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>
2026-06-09 20:53:20 -04:00
2026-04-12 12:39:15 +01:00
2026-04-12 12:39:15 +01:00
2026-05-12 08:47:53 +01:00
2026-05-12 08:47:53 +01:00
2026-04-13 11:40:41 +01:00
2026-04-13 11:40:41 +01:00
2026-04-12 12:39:15 +01:00
2026-04-15 18:50:13 +01:00
2026-05-14 14:46:43 +01:00

📚 Shelfmark: Book Search & Request Tool

Shelfmark

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

Home screen Home screen

Search results Search results

Multi-source downloads Multi-source downloads

Download queue Download queue

🚀 Quick Start

Prerequisites

  • Docker & Docker Compose

Installation

  1. Download the docker-compose file:

    curl -O https://raw.githubusercontent.com/calibrain/shelfmark/main/compose/docker-compose.yml
    
  2. Start the service:

    docker compose up -d
    
  3. 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 nobrl mount option to avoid database lock errors.

Non-root container mode

  • Start the container as 1000:1000 with Docker user: "1000:1000" or docker run --user 1000:1000.
  • For Kubernetes, set runAsUser: 1000, runAsGroup: 1000, and runAsNonRoot: true together.
  • PUID/PGID keep the default root startup flow.
  • Mounted paths must already be writable by 1000:1000.
  • USING_TOR=true requires 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_ADMIN and NET_RAW capabilities
  • 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 (when ENABLE_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.

Description
No description provided
Readme MIT 56 MiB
Languages
Python 73.4%
TypeScript 25%
Shell 0.9%
CSS 0.4%
Dockerfile 0.2%
Other 0.1%