dependabot[bot] aa72850eab build(deps): bump the npm-deps group in /src/frontend with 6 updates (#1551)
Bumps the npm-deps group in /src/frontend with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [react](https://github.com/react/react/tree/HEAD/packages/react) |
`19.3.0` | `19.3.1` |
|
[react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom)
| `19.3.0` | `19.3.1` |
| [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) |
`6.41.0` | `6.42.1` |
| [oxfmt](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt) |
`0.72.0` | `0.74.0` |
| [oxlint](https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint) |
`1.87.0` | `1.89.0` |
|
[vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest)
| `5.0.4` | `5.0.5` |

Updates `react` from 19.3.0 to 19.3.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/react/react/releases">react's
releases</a>.</em></p>
<blockquote>
<h2>19.3.1 (October 14th, 2026)</h2>
<h2>React Server Components</h2>
<ul>
<li>Improve transport protocol (<a
href="https://redirect.github.com/facebook/react/pull/37845">#37845</a>
by <a
href="https://github.com/unstubbable"><code>@​unstubbable</code></a> and
<a href="https://github.com/eps1lon"><code>@​eps1lon</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/react/react/commit/61aa00df822d0eb76d0362eb8b6fdd3527693efe"><code>61aa00d</code></a>
[19.3.x][Flight] Improve transport protocol (<a
href="https://github.com/react/react/tree/HEAD/packages/react/issues/37845">#37845</a>)</li>
<li>See full diff in <a
href="https://github.com/react/react/commits/v19.3.1/packages/react">compare
view</a></li>
</ul>
</details>
<br />

Updates `react-dom` from 19.3.0 to 19.3.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/react/react/releases">react-dom's
releases</a>.</em></p>
<blockquote>
<h2>19.3.1 (October 14th, 2026)</h2>
<h2>React Server Components</h2>
<ul>
<li>Improve transport protocol (<a
href="https://redirect.github.com/facebook/react/pull/37845">#37845</a>
by <a
href="https://github.com/unstubbable"><code>@​unstubbable</code></a> and
<a href="https://github.com/eps1lon"><code>@​eps1lon</code></a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/react/react/commit/61aa00df822d0eb76d0362eb8b6fdd3527693efe"><code>61aa00d</code></a>
[19.3.x][Flight] Improve transport protocol (<a
href="https://github.com/react/react/tree/HEAD/packages/react-dom/issues/37845">#37845</a>)</li>
<li>See full diff in <a
href="https://github.com/react/react/commits/v19.3.1/packages/react-dom">compare
view</a></li>
</ul>
</details>
<br />

Updates `knip` from 6.41.0 to 6.42.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/webpro-nl/knip/releases">knip's
releases</a>.</em></p>
<blockquote>
<h2>Release 6.42.1</h2>
<ul>
<li>fix(semantic-release): resolve shareable configs from extends (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2159">#2159</a>)
(4c4a5ece9148cf621f3a6e091fd3550b18f6e19a) - thanks <a
href="https://github.com/giaBaoJS"><code>@​giaBaoJS</code></a>!</li>
<li>fix(jest): load projects entries as Jest configs (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2167">#2167</a>)
(4c22593724460890e4492ba86119d0188127f2ba) - thanks <a
href="https://github.com/Cayan"><code>@​Cayan</code></a>!</li>
<li>Update npmx.dev snapshot
(4b19797b77a559f7190e9119b3a156e1ac6aef9f)</li>
<li>fix(tailwind): track packages referenced from CSS url() (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2166">#2166</a>)
(949da00abf419c1eeabdab1541ce7e5c312371b9) - thanks <a
href="https://github.com/agustincastaing"><code>@​agustincastaing</code></a>!</li>
<li>Add .otf to foreign file extensions
(fcff4db0b88d6282569743cd779aec5a5df99862)</li>
<li>Match quoted SCSS url() values within a single line
(2c5c2a2efab8f08be538bfe1f40982cb6f0fca3c)</li>
<li>fix(bun): treat bun test arguments as path filters (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2165">#2165</a>)
(5f3a7fb526d3eca7561aacfc9d0ac60056525206) - thanks <a
href="https://github.com/jakeleventhal"><code>@​jakeleventhal</code></a>!</li>
<li>fix(vitest): use default test entries when config has no test key
(<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2170">#2170</a>)
(7ee576ccd461f719b533e3783a5b58391ce89e91) - thanks <a
href="https://github.com/fixfon"><code>@​fixfon</code></a>!</li>
</ul>
<h2>Release 6.42.0</h2>
<ul>
<li>fix: add bun 1.4.3 check subcommand (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2131">#2131</a>)
(09129b8aaa554ffae2ff8f42a5ff4d6994eb7759) - thanks <a
href="https://github.com/NimmLor"><code>@​NimmLor</code></a>!</li>
<li>Detect pnpm workspaces correctly around <code>packages:</code>
(resolve <a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2133">#2133</a>,
close <a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2134">#2134</a>)
(d1cc0928be54e6cac9668460d9f6a21e3a94f818)</li>
<li>fix(github-actions): resolve working-directory nested under checkout
path (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2136">#2136</a>)
(87e051e45f12c107cc25ed08bba962b95bb23b51) - thanks <a
href="https://github.com/kenny-ish"><code>@​kenny-ish</code></a>!</li>
<li>fix(nx): track local generator and executor entry points (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2117">#2117</a>)
(<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2121">#2121</a>)
(558407f51b5fdf4460275b69950676e7bace35d5) - thanks <a
href="https://github.com/DreamLongYT"><code>@​DreamLongYT</code></a>!</li>
<li>Update dependency bun to v1.4.3 (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2137">#2137</a>)
(71f90bf6d5fb2675430f60416e403851f9cb2cfe) - thanks <a
href="https://github.com/renovate"><code>@​renovate</code></a>[bot]!</li>
<li>docs(react-router): note to run react-router typegen before Knip (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2140">#2140</a>)
(f21ce9a9f1e3264cad1b763cf31ec2c177fb8656) - thanks <a
href="https://github.com/MannXo"><code>@​MannXo</code></a>!</li>
<li>fix: normalize scoped binary names (close <a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2143">#2143</a>)
(c8509c4e45e1c343da707c26877a0a6584f6bc11)</li>
<li>Clarify plugin implementation boundaries
(c5a67f59d351e8d26dc6ecbbd3c3193e313772a4)</li>
<li>fix(jest): treat mocked and required dependencies as used (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2141">#2141</a>)
(3eaf1ba16045a3ac22f0717c4f1252312298bb76) - thanks <a
href="https://github.com/TkDodo"><code>@​TkDodo</code></a>!</li>
<li>fix: preserve root-only plugins for trailing-slash cwd (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2139">#2139</a>)
(7f0db0e7670bfd18fab081b522a104f787829f7d) - thanks <a
href="https://github.com/sean0407"><code>@​sean0407</code></a>!</li>
<li>fix(nx): resolve run-commands script paths from the target cwd (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2151">#2151</a>)
(516bd9a324303653978528f582287c857846fcc8) - thanks <a
href="https://github.com/JeanBeaurepaire"><code>@​JeanBeaurepaire</code></a>!</li>
<li>Resolve Nx run-commands loader paths from the target cwd
(fa8ca13e1345115d30122900ab68db7339487502)</li>
<li>Add <code>@​solidjs/vite-plugin</code> plugin (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2144">#2144</a>)
(579a88d306429694be43590efb50cb72067551ba) - thanks <a
href="https://github.com/everton-dgn"><code>@​everton-dgn</code></a>!</li>
<li>feat: add filesystem-routing plugin (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2145">#2145</a>)
(1abd9e1875bae36b0baf77f5864aab849d1528a8) - thanks <a
href="https://github.com/everton-dgn"><code>@​everton-dgn</code></a>!</li>
<li>Support tags in line comments (resolve <a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/1924">#1924</a>)
(5abef4846e20f09fd4d0ee8dc2513ce50b616cdb)</li>
<li>Keep resolveFromAST to static values in plugin guide
(4cd353fd9ecb780228a63069080586a46ba6a8f2)</li>
<li>fix(solidjs-vite-plugin): keep entry overrides in production (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2155">#2155</a>)
(e4b5f890787da07824cc174cb624396f2133ff06) - thanks <a
href="https://github.com/everton-dgn"><code>@​everton-dgn</code></a>!</li>
<li>feat(angular): resolve styleUrl and styleUrls of <a
href="https://github.com/Component"><code>@​Component</code></a> (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2157">#2157</a>)
(c20d4d720c586c9c5dc6e3d1a6ea60c557688bfa) - thanks <a
href="https://github.com/Cayan"><code>@​Cayan</code></a>!</li>
<li>Update npmx.dev snapshot
(59eb873f3beecf40b7aed9579bd29e1ab8b631f0)</li>
<li>fix(next): recognize Turbopack alias targets (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2156">#2156</a>)
(1d44f6a1a39c5557c1e215c7cf9db17937967344) - thanks <a
href="https://github.com/jakeleventhal"><code>@​jakeleventhal</code></a>!</li>
<li>fix: preserve re-exports from framework entries (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2154">#2154</a>)
(263ce20408a77b2473c555f304ad3b55c696b6a6) - thanks <a
href="https://github.com/jakeleventhal"><code>@​jakeleventhal</code></a>!</li>
<li>feat(solidjs-vite-plugin): follow Solid's SSR and client mode entry
rules (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2148">#2148</a>)
(d711231eae14d8ecac562d73078125f3b30dc8fd) - thanks <a
href="https://github.com/everton-dgn"><code>@​everton-dgn</code></a>!</li>
<li>feat(filesystem-routing): read route options from Vite configs (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2149">#2149</a>)
(585f206ca52d54e30f2068c818e1b33b50085459) - thanks <a
href="https://github.com/everton-dgn"><code>@​everton-dgn</code></a>!</li>
<li>feat(filesystem-routing): resolve routes from the Vite root (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2150">#2150</a>)
(8cc0cb0c9ff09463cad30817c8cf78cbc48b7ed6) - thanks <a
href="https://github.com/everton-dgn"><code>@​everton-dgn</code></a>!</li>
<li>fix: track namespace members in Promise.all imports (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2162">#2162</a>)
(3f17cdfce7a0f90e2599a7074291c4c875fe8244) - thanks <a
href="https://github.com/everton-dgn"><code>@​everton-dgn</code></a>!</li>
<li>Update a few dependencies
(161dbed3ccffa574e3a9493ddb20842eefa26af8)</li>
<li>Fix Solid setup fixture coverage
(ebe4180785667f6ff85c1e6ce2a11226713b2d5a)</li>
<li>Migrate shell script parsing to unbash v6
(f86044c6760ac4f27e564f15feeae907cba3d297)</li>
<li>Add sponsors: <a
href="https://github.com/pennylane-hq"><code>@​pennylane-hq</code></a>,
<a href="https://github.com/agentscore"><code>@​agentscore</code></a>,
<a
href="https://github.com/oblique-security"><code>@​oblique-security</code></a>
(thank you!) (57ff23eb430aaece73e02574923cabc6016a920b)</li>
<li>Stop pairing Promise.all imports and bindings after a spread
(5bd2c64eaf92f82a316d8fa6551acdb1d6c48c32)</li>
<li>Update some stats (dd02ddeb235dd516cf93db99dda2180b0eb09a97)</li>
<li>fix(nx): read karmaConfig from target options (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2164">#2164</a>)
(4e1e4bc18f6d2f2705d729c375a20bd1679b8c0f) - thanks <a
href="https://github.com/Cayan"><code>@​Cayan</code></a>!</li>
<li>Add tsrs plugin (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2163">#2163</a>)
(ba09126c023a2c408de8d7dae3bf6ab97e420966) - thanks <a
href="https://github.com/jakeleventhal"><code>@​jakeleventhal</code></a>!</li>
<li>Drop redundant containingFilePath from plugin config inputs
(ffb6caf02891d29eee41c7a0ecf147312dbe7205)</li>
<li>Resolve Nx target option configs from the workspace root
(52c5233aa905124c5b30c0bb7f9b0b25cd4260c6)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/webpro-nl/knip/commit/ee32ee6ca4c8826ca45f306041d9f8c5ffdaa335"><code>ee32ee6</code></a>
Release knip@6.42.1</li>
<li><a
href="https://github.com/webpro-nl/knip/commit/7ee576ccd461f719b533e3783a5b58391ce89e91"><code>7ee576c</code></a>
fix(vitest): use default test entries when config has no test key (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2170">#2170</a>)</li>
<li><a
href="https://github.com/webpro-nl/knip/commit/5f3a7fb526d3eca7561aacfc9d0ac60056525206"><code>5f3a7fb</code></a>
fix(bun): treat bun test arguments as path filters (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2165">#2165</a>)</li>
<li><a
href="https://github.com/webpro-nl/knip/commit/2c5c2a2efab8f08be538bfe1f40982cb6f0fca3c"><code>2c5c2a2</code></a>
Match quoted SCSS url() values within a single line</li>
<li><a
href="https://github.com/webpro-nl/knip/commit/fcff4db0b88d6282569743cd779aec5a5df99862"><code>fcff4db</code></a>
Add .otf to foreign file extensions</li>
<li><a
href="https://github.com/webpro-nl/knip/commit/949da00abf419c1eeabdab1541ce7e5c312371b9"><code>949da00</code></a>
fix(tailwind): track packages referenced from CSS url() (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2166">#2166</a>)</li>
<li><a
href="https://github.com/webpro-nl/knip/commit/4c22593724460890e4492ba86119d0188127f2ba"><code>4c22593</code></a>
fix(jest): load projects entries as Jest configs (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2167">#2167</a>)</li>
<li><a
href="https://github.com/webpro-nl/knip/commit/4c4a5ece9148cf621f3a6e091fd3550b18f6e19a"><code>4c4a5ec</code></a>
fix(semantic-release): resolve shareable configs from extends (<a
href="https://github.com/webpro-nl/knip/tree/HEAD/packages/knip/issues/2159">#2159</a>)</li>
<li><a
href="https://github.com/webpro-nl/knip/commit/8aa7d0e281ecba684c35acf4effd072e90a8862d"><code>8aa7d0e</code></a>
Release knip@6.42.0</li>
<li><a
href="https://github.com/webpro-nl/knip/commit/52c5233aa905124c5b30c0bb7f9b0b25cd4260c6"><code>52c5233</code></a>
Resolve Nx target option configs from the workspace root</li>
<li>Additional commits viewable in <a
href="https://github.com/webpro-nl/knip/commits/knip@6.42.1/packages/knip">compare
view</a></li>
</ul>
</details>
<br />

Updates `oxfmt` from 0.72.0 to 0.74.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/oxc-project/oxc/releases">oxfmt's
releases</a>.</em></p>
<blockquote>
<h2>oxfmt v0.74.0</h2>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>e236de0 formatter_tests: Skip conformance spec calls with
non-literal options (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27957">#27957</a>)
(leaysgur)</li>
<li>782ab6e linter: Search string values without UTF-8 conversion (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/26716">#26716</a>)
(Dunqing)</li>
<li>a5d8184 jsdoc: Parse code spans after quotes in descriptions (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27955">#27955</a>)
(leaysgur)</li>
<li>2645d2c formatter_markdown: Treat link destinations and footnote
references as opaque to code span fences (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27948">#27948</a>)
(leaysgur)</li>
<li>4d8195c formatter_yaml: Keep a root plain scalar starting with a
document marker verbatim (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27947">#27947</a>)
(leaysgur)</li>
<li>529b057 formatter_core: Keep front matter verbatim when body starts
with indented delimiter (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27946">#27946</a>)
(leaysgur)</li>
<li>c22a9b2 formatter: Treat static block with only empty statements as
empty (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27945">#27945</a>)
(leaysgur)</li>
<li>d3ff3f6 formatter/jsdoc: Write descriptions as written to not close
the comment (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27823">#27823</a>)
(leaysgur)</li>
<li>c4c1727 formatter/sort_imports: Keep comments after the last import
(<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27822">#27822</a>)
(leaysgur)</li>
<li>a64677e formatter: Print JSDoc embedded snippets with LF (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27821">#27821</a>)
(leaysgur)</li>
<li>2c1cc20 formatter: Keep comment only Vue bindings as-is (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27820">#27820</a>)
(leaysgur)</li>
<li>1bf236d formatter/sort_imports: Do not use comments as import source
(<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27819">#27819</a>)
(leaysgur)</li>
<li>52ee29d formatter_yaml: Never start col-0 line with document marker
or BOM (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27818">#27818</a>)
(leaysgur)</li>
<li>81c75e7 formatter/css: Keep glued css-in-js statement placeholders
glued (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27814">#27814</a>)
(leaysgur)</li>
<li>a1ef7f4 formatter: Keep typecast parens in same-operator binary and
arrow chain (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27812">#27812</a>)
(leaysgur)</li>
<li>de110ce formatter: Keep more parens around
<code>TSInstantiationExpression</code> (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27811">#27811</a>)
(leaysgur)</li>
<li>8b02e90 formatter_json: Reject invalid JSON instead of dropping them
(<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27785">#27785</a>)
(leaysgur)</li>
<li>6fe4c1b formatter: Treat lone CR in JSX text and argument blank
lines (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27780">#27780</a>)
(leaysgur)</li>
<li>5605362 oxfmt: Validate editorconfig as like oxfmtrc (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27778">#27778</a>)
(leaysgur)</li>
<li>5b2acb0 formatter_core: Report error position releative to CRLF
source (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27777">#27777</a>)
(leaysgur)</li>
<li>c78e80e formatter_core: Report parse error positions relative to the
BOM-headed source (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27776">#27776</a>)
(leaysgur)</li>
<li>3a980c9 formatter_toml: Handle BOM like other languages (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27775">#27775</a>)
(leaysgur)</li>
<li>97c9fc4 oxfmt: Handle BOM in config JSON (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27774">#27774</a>)
(leaysgur)</li>
<li>28eb4a7 oxfmt: Print trailing newline for
<code>--list-different</code> (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27773">#27773</a>)
(leaysgur)</li>
<li>d2bea21 formatter: Glue comments to an opener in empty for-head
slots and array holes (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27737">#27737</a>)
(leaysgur)</li>
<li>6a95ec1 formatter: Keep comment position on holey array (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27730">#27730</a>)
(leaysgur)</li>
<li>54769da formatter: Break after dangling line comment in holey array
(<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27729">#27729</a>)
(leaysgur)</li>
<li>99077ef formatter_json: Reject unary expressions other than signed
numbers (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27728">#27728</a>)
(leaysgur)</li>
<li>22cd4cd formatter_json: Handle holey array and comments (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27727">#27727</a>)
(leaysgur)</li>
<li>644ca1c formatter: Do not indent logical chains whose right sides
all inline (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27667">#27667</a>)
(leaysgur)</li>
<li>a07a0fb formatter: Wrap comment-only JSX expression container in a
group (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27666">#27666</a>)
(leaysgur)</li>
</ul>
<h3>⚡ Performance</h3>
<ul>
<li>e220293 formatter: Check only the operator suppression mark in
<code>is_quiet</code> (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27952">#27952</a>)
(leaysgur)</li>
<li>e5fdc9c formatter_core: Write into one element stack through a
concrete <code>Formatter</code> (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27559">#27559</a>)
(leaysgur)</li>
<li>a342f7e formatter: Skip comment handling for nodes with no comment
near them (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27557">#27557</a>)
(leaysgur)</li>
<li>d8ce750 formatter: Write string literals with swapped quotes into
the arena (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27558">#27558</a>)
(Yuji Sugiura)</li>
<li>1c393c0 formatter_core: Skip scanning texts with nothing to rewrite
(<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27561">#27561</a>)
(leaysgur)</li>
<li>1d3ef10 formatter_core: Keep the embedded IR when nothing in it is
rewritten (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27673">#27673</a>)
(leaysgur)</li>
</ul>
<h3>📚 Documentation</h3>
<ul>
<li>1325225 oxfmt: Update useless comment prefix (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27956">#27956</a>)
(leaysgur)</li>
<li>d0dd140 formatter: Note lossy cooked round-trip in template embeds
(<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27944">#27944</a>)
(leaysgur)</li>
<li>8a3a6c8 oxfmt: Update stale notes on the JSDoc string-out channel
and fixture origins (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27824">#27824</a>)
(leaysgur)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/oxc-project/oxc/commit/07ed78f4abde4020ca7919381ffea4da8616b78a"><code>07ed78f</code></a>
release(apps): oxlint v1.89.0 &amp;&amp; oxfmt v0.74.0 (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27961">#27961</a>)</li>
<li><a
href="https://github.com/oxc-project/oxc/commit/6941b4ed45ead21c45bc2164cb80a180eed85b43"><code>6941b4e</code></a>
release(apps): oxlint v1.88.0 &amp;&amp; oxfmt v0.73.0 (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27643">#27643</a>)</li>
<li><a
href="https://github.com/oxc-project/oxc/commit/a495e8241e4927a65f77c5e97b9f4dee4dbff5aa"><code>a495e82</code></a>
feat(oxfmt): support <code>associations</code> config to specify
language over filepath ...</li>
<li><a
href="https://github.com/oxc-project/oxc/commit/408d87f62893d5dc3eb3e0aa8a0b5e7e2eca32f3"><code>408d87f</code></a>
docs(oxfmt): simplify oxfmtrc docs (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27432">#27432</a>)</li>
<li><a
href="https://github.com/oxc-project/oxc/commit/5db28facf7bfe71d36829381b176f1c611e816f0"><code>5db28fa</code></a>
feat(oxfmt): support Astro via <code>prettier-plugin-astro@1.x</code>
(<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27386">#27386</a>)</li>
<li><a
href="https://github.com/oxc-project/oxc/commit/902e188b3518afede5fc2b9823e36d8a48af6fda"><code>902e188</code></a>
docs(oxfmt): update how <code>embeddedLanguageFormatting</code> option
works (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxfmt/issues/27362">#27362</a>)</li>
<li>See full diff in <a
href="https://github.com/oxc-project/oxc/commits/oxfmt_v0.74.0/npm/oxfmt">compare
view</a></li>
</ul>
</details>
<br />

Updates `oxlint` from 1.87.0 to 1.89.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/oxc-project/oxc/releases">oxlint's
releases</a>.</em></p>
<blockquote>
<h2>oxlint v1.89.0</h2>
<h3>💥 BREAKING CHANGES</h3>
<ul>
<li>e3c1b11 ast: [<strong>BREAKING</strong>] Preserve lone surrogates in
static property names (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27095">#27095</a>)
(Dunqing)</li>
<li>a0a987c ast: [<strong>BREAKING</strong>] Preserve lone surrogates in
static member names (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26677">#26677</a>)
(Dunqing)</li>
</ul>
<h3>🚀 Features</h3>
<ul>
<li>770ada4 linter: Mark vue 3 rules as recommended (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27717">#27717</a>)
(Cam McHenry)</li>
<li>ba38c1d linter: Mark react/react-hooks rules as recommended (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27701">#27701</a>)
(Cam McHenry)</li>
<li>d85a3ba linter: Mark promise rules as recommended (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27693">#27693</a>)
(Cam McHenry)</li>
<li>e71c88a linter: Mark node rule as recommended (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27692">#27692</a>)
(Cam McHenry)</li>
<li>7213f61 linter: Mark nextjs rules as recommended (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27691">#27691</a>)
(Cam McHenry)</li>
<li>d7c6b26 linter: Mark jsx-a11y rules as recommended (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27690">#27690</a>)
(Cam McHenry)</li>
<li>199dfdc linter: Mark jsdoc rules as recommended (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27689">#27689</a>)
(Cam McHenry)</li>
<li>780bff3 linter: Mark jest/vitest rules as recommended (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27672">#27672</a>)
(Cam McHenry)</li>
<li>6ae6859 linter: Mark import rules as recommended (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27671">#27671</a>)
(Cam McHenry)</li>
<li>b7a1df3 linter: Mark unicorn rules as recommended (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27670">#27670</a>)
(Cam McHenry)</li>
<li>c44a355 linter: Mark typescript rules as recommended from upstream
(<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27634">#27634</a>)
(Cam McHenry)</li>
<li>6b49dba linter: Mark eslint rules as recommended from upstream (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27632">#27632</a>)
(Cam McHenry)</li>
</ul>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>7c47246 linter: Check module specifiers and string values that
contain lone surrogates (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26717">#26717</a>)
(Dunqing)</li>
<li>782ab6e linter: Search string values without UTF-8 conversion (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26716">#26716</a>)
(Dunqing)</li>
<li>326904f linter/unicorn/no-useless-undefined: Allow
<code>undefined</code> in <code>React.useRef</code> (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25027">#25027</a>)
(Chris Dokurno)</li>
<li>f9cf165 linter/unicorn/prefer-spread: Ignore super method calls (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27868">#27868</a>)
(camc314)</li>
<li>00484e1 linter/eslint/prefer-const: Report destructuring assignments
inside blocks (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27856">#27856</a>)
(camc314)</li>
<li>9c35461 linter/eslint/sort-vars: Report every out-of-order
declaration (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27767">#27767</a>)
(camc314)</li>
<li>01e1c5e linter/unicorn/prefer-string-replace-all: Resolve regex
variables (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27769">#27769</a>)
(camc314)</li>
<li>7f474d5 linter/eslint/no-loop-func: Detect writes after the loop (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27754">#27754</a>)
(camc314)</li>
<li>4b7fea6 linter/eslint/block-scoped-var: Ignore declarations without
writes (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27760">#27760</a>)
(camc314)</li>
<li>2947917 linter/eslint/no-lonely-if: Check final else blocks in
else-if chains (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27759">#27759</a>)
(camc314)</li>
<li>fc039b5 linter/eslint/sort-imports: Check imports after other
statements (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27749">#27749</a>)
(camc314)</li>
<li>1acba97 linter/unicorn/prefer-at: Report slice index reads once (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27762">#27762</a>)
(camc314)</li>
<li>6190e26 linter/eslint/prefer-arrow-callback: Ignore functions used
as conditional tests (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27533">#27533</a>)
(Anzal Husain Abidi)</li>
<li>b3cdaaf linter/eslint/sort-keys: Check computed identifier names (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27748">#27748</a>)
(camc314)</li>
<li>170e608 linter/unicorn/prefer-native-coercion-functions: Check
object methods and function properties (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27750">#27750</a>)
(camc314)</li>
<li>9261df7 linter/unicorn/prefer-string-raw: Check object property
values (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27758">#27758</a>)
(camc314)</li>
<li>ddea86b linter/eslint/prefer-template: Report separate nested
concatenations (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27764">#27764</a>)
(camc314)</li>
<li>2c67197 linter/eslint/no-unused-vars: Count conditional calls in
sequences as uses (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27755">#27755</a>)
(camc314)</li>
<li>7f22fa0 linter/unicorn/prefer-regexp-test: Check logical operands in
boolean contexts (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27761">#27761</a>)
(camc314)</li>
<li>3c44398 linter/eslint/class-methods-use-this: Count this in
parameter defaults (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27756">#27756</a>)
(camc314)</li>
<li>d85923f linter/eslint/no-param-reassign: Report rest parameter
writes (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27765">#27765</a>)
(camc314)</li>
<li>8ea47bb linter/unicorn/prefer-type-error: Handle parenthesized type
checks (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27766">#27766</a>)
(camc314)</li>
<li>e96856c linter/unicorn/catch-error-name: Check unused
underscore-prefixed names (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27751">#27751</a>)
(camc314)</li>
<li>d8ca399 linter/unicorn/no-array-callback-reference: Ignore callback
factory calls (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27763">#27763</a>)
(camc314)</li>
<li>1267ab8 linter/eslint/max-params: Count rest parameters (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27757">#27757</a>)
(camc314)</li>
<li>9ff25c3 linter/eslint/no-useless-assignment: Report dead stores to
function parameters (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27735">#27735</a>)
(camc314)</li>
<li>ee5e730 linter/eslint/no-setter-return: Check setters in property
descriptors (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27731">#27731</a>)
(camc314)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/oxc-project/oxc/blob/main/npm/oxlint/CHANGELOG.md">oxlint's
changelog</a>.</em></p>
<blockquote>
<h2>[1.89.0] - 2026-10-19</h2>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>9a424c2 oxlint,oxfmt: Correct Node.js TypeScript support range (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27699">#27699</a>)
(camc314)</li>
</ul>
<h2>[1.88.0] - 2026-10-13</h2>
<h3>🚀 Features</h3>
<ul>
<li>3c361a7 linter/unicorn/prefer-query-selector: Add
<code>allowWithVariables</code> option (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27346">#27346</a>)
(Mikhail Baev)</li>
</ul>
<h2>[1.86.0] - 2026-09-28</h2>
<h3>🚀 Features</h3>
<ul>
<li>9d80eed linter/react/only-export-components: Support
<code>allowCompoundComponents</code> (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27117">#27117</a>)
(Kuroda Kayn)</li>
<li>e05b155 linter: Add typescript/no-generated-empty-object-type (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26958">#26958</a>)
(camc314)</li>
</ul>
<h2>[1.82.0] - 2026-09-07</h2>
<h3>🚀 Features</h3>
<ul>
<li>6a0e19c linter/eslint/no-unmodified-loop-condition: Support
<code>checkConditionalExpressions</code> option (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26249">#26249</a>)
(camc314)</li>
</ul>
<h2>[1.81.0] - 2026-08-31</h2>
<h3>📚 Documentation</h3>
<ul>
<li>d5be037 linter/typescript/switch-exhaustiveness-check: Clarify
default case comment pattern (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/26100">#26100</a>)
(camc314)</li>
</ul>
<h2>[1.79.0] - 2026-08-18</h2>
<h3>💥 BREAKING CHANGES</h3>
<ul>
<li>8c4552d linter: [<strong>BREAKING</strong>] Split
react/react-compiler into per-category rules (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25500">#25500</a>)
(Boshen)</li>
</ul>
<h3>🐛 Bug Fixes</h3>
<ul>
<li>228e8e0 linter: Resolve inactive React compiler rules (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25830">#25830</a>)
(Boshen)</li>
<li>aa49d86 linter: Allow spread rule options in config types (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25675">#25675</a>)
(ch3rry)</li>
<li>36f8451 linter/eslint/no-eval: Align indirect default with ESLint
(<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25656">#25656</a>)
(camc314)</li>
<li>beb724d linter/eslint/no-unused-vars: Report bare underscore
parameters (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25663">#25663</a>)
(camc314)</li>
<li>4004c10 linter/eslint/no-irregular-whitespace: Check comments by
default (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25660">#25660</a>)
(camc314)</li>
<li>285820e linter/no-large-snapshots: Precompile and document allowed
snapshot matchers (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25611">#25611</a>)
(Mikhail Baev)</li>
<li>4df5835 linter: Allow capitalized built-in calls (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/25516">#25516</a>)
(Boshen)</li>
</ul>
<h2>[1.78.0] - 2026-08-10</h2>
<h3>🚀 Features</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/oxc-project/oxc/commit/07ed78f4abde4020ca7919381ffea4da8616b78a"><code>07ed78f</code></a>
release(apps): oxlint v1.89.0 &amp;&amp; oxfmt v0.74.0 (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27961">#27961</a>)</li>
<li><a
href="https://github.com/oxc-project/oxc/commit/9a424c209ea0df16becbf3141d63bcc293ede237"><code>9a424c2</code></a>
fix(oxlint,oxfmt): correct Node.js TypeScript support range (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27699">#27699</a>)</li>
<li><a
href="https://github.com/oxc-project/oxc/commit/6941b4ed45ead21c45bc2164cb80a180eed85b43"><code>6941b4e</code></a>
release(apps): oxlint v1.88.0 &amp;&amp; oxfmt v0.73.0 (<a
href="https://github.com/oxc-project/oxc/tree/HEAD/npm/oxlint/issues/27643">#27643</a>)</li>
<li><a
href="https://github.com/oxc-project/oxc/commit/3c361a7fb5c9fbbe940e489f2e315a187a19b565"><code>3c361a7</code></a>
feat(linter/unicorn/prefer-query-selector): add
<code>allowWithVariables</code> option (...</li>
<li>See full diff in <a
href="https://github.com/oxc-project/oxc/commits/oxlint_v1.89.0/npm/oxlint">compare
view</a></li>
</ul>
</details>
<br />

Updates `vitest` from 5.0.4 to 5.0.5
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vitest-dev/vitest/releases">vitest's
releases</a>.</em></p>
<blockquote>
<h2>v5.0.5</h2>
<h3>   🐞 Bug Fixes</h3>
<ul>
<li>Keep vite default <code>fs.deny</code> with api token file  -  by <a
href="https://github.com/hi-ogawa"><code>@​hi-ogawa</code></a>,
<strong>Hiroshi Ogawa</strong> and <strong>Claude Opus 5.5</strong> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11578">vitest-dev/vitest#11578</a>
<a href="https://github.com/vitest-dev/vitest/commit/28dc1edfb"><!-- raw
HTML omitted -->(28dc1)<!-- raw HTML omitted --></a></li>
<li>Handle quoted file names in <code>--changed</code>  -  by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11583">vitest-dev/vitest#11583</a>
<a href="https://github.com/vitest-dev/vitest/commit/14921e962"><!-- raw
HTML omitted -->(14921)<!-- raw HTML omitted --></a></li>
<li>Add <code>data</code> to the <code>import.meta.hot</code> stub  - 
by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11590">vitest-dev/vitest#11590</a>
<a href="https://github.com/vitest-dev/vitest/commit/3a8289ac3"><!-- raw
HTML omitted -->(3a828)<!-- raw HTML omitted --></a></li>
<li>Set <code>skip</code> in <code>skipIf</code>, ignore
<code>undefined</code> options  -  by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11591">vitest-dev/vitest#11591</a>
<a href="https://github.com/vitest-dev/vitest/commit/d523a15f2"><!-- raw
HTML omitted -->(d523a)<!-- raw HTML omitted --></a></li>
<li>Skip builtin loading in async leak detector  -  by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11598">vitest-dev/vitest#11598</a>
<a href="https://github.com/vitest-dev/vitest/commit/fe86a64c6"><!-- raw
HTML omitted -->(fe86a)<!-- raw HTML omitted --></a></li>
<li>Keep the import frame in native loader errors  -  by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11599">vitest-dev/vitest#11599</a>
<a href="https://github.com/vitest-dev/vitest/commit/9697b3894"><!-- raw
HTML omitted -->(9697b)<!-- raw HTML omitted --></a></li>
<li>Run hook cleanups when a later hook fails  -  by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11605">vitest-dev/vitest#11605</a>
<a href="https://github.com/vitest-dev/vitest/commit/6c5a44720"><!-- raw
HTML omitted -->(6c5a4)<!-- raw HTML omitted --></a></li>
<li>Release mocks of finished test files  -  by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11607">vitest-dev/vitest#11607</a>
<a href="https://github.com/vitest-dev/vitest/commit/e9c3d72f0"><!-- raw
HTML omitted -->(e9c3d)<!-- raw HTML omitted --></a></li>
<li>Abort all running tests on cancel  -  by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11606">vitest-dev/vitest#11606</a>
<a href="https://github.com/vitest-dev/vitest/commit/6621a72d6"><!-- raw
HTML omitted -->(6621a)<!-- raw HTML omitted --></a></li>
<li><strong>browser</strong>:
<ul>
<li>Ignore synthetic pagehide events  -  by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11582">vitest-dev/vitest#11582</a>
<a href="https://github.com/vitest-dev/vitest/commit/ca0813584"><!-- raw
HTML omitted -->(ca081)<!-- raw HTML omitted --></a></li>
<li>Run plugin buildStart on server creation  -  by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11593">vitest-dev/vitest#11593</a>
<a href="https://github.com/vitest-dev/vitest/commit/ea611e44c"><!-- raw
HTML omitted -->(ea611)<!-- raw HTML omitted --></a></li>
<li>Drop late connections of closed sessions  -  by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11600">vitest-dev/vitest#11600</a>
<a href="https://github.com/vitest-dev/vitest/commit/f161e6df2"><!-- raw
HTML omitted -->(f161e)<!-- raw HTML omitted --></a></li>
<li>Wait 30s for the browser to close  -  by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11601">vitest-dev/vitest#11601</a>
<a href="https://github.com/vitest-dev/vitest/commit/6498b666a"><!-- raw
HTML omitted -->(6498b)<!-- raw HTML omitted --></a></li>
<li>Run global setup once with instances  -  by <a
href="https://github.com/sheremet-va"><code>@​sheremet-va</code></a> in
<a
href="https://redirect.github.com/vitest-dev/vitest/issues/11596">vitest-dev/vitest#11596</a>
<a href="https://github.com/vitest-dev/vitest/commit/8dd67c262"><!-- raw
HTML omitted -->(8dd67)<!-- raw HTML omitted --></a></li>
</ul>
</li>
<li><strong>reporter</strong>:
<ul>
<li>End reason
<code>&amp;[#39](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/39);failed&amp;[#39](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/39);</code>
on worker crash  -  by <a
href="https://github.com/AriPerkkio"><code>@​AriPerkkio</code></a> in <a
href="https://redirect.github.com/vitest-dev/vitest/issues/11568">vitest-dev/vitest#11568</a>
<a href="https://github.com/vitest-dev/vitest/commit/6ae8e89ff"><!-- raw
HTML omitted -->(6ae8e)<!-- raw HTML omitted --></a></li>
</ul>
</li>
</ul>
<h5>    <a
href="https://github.com/vitest-dev/vitest/compare/v5.0.4...v5.0.5">View
changes on GitHub</a></h5>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/vitest-dev/vitest/commit/7a825db43e2beca0b219d2eadaec334cb81af0c7"><code>7a825db</code></a>
chore: release v5.0.5 (<a
href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11609">#11609</a>)</li>
<li><a
href="https://github.com/vitest-dev/vitest/commit/6621a72d6ed371e43f80ff327f5063693bd6b1ad"><code>6621a72</code></a>
fix: abort all running tests on cancel (<a
href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11606">#11606</a>)</li>
<li><a
href="https://github.com/vitest-dev/vitest/commit/e9c3d72f0c8d6867de06a3df43ea28a05eeec444"><code>e9c3d72</code></a>
fix: release mocks of finished test files (<a
href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11607">#11607</a>)</li>
<li><a
href="https://github.com/vitest-dev/vitest/commit/8dd67c2625943d824e257b87ae57a14094e90eed"><code>8dd67c2</code></a>
fix(browser): run global setup once with instances (<a
href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11596">#11596</a>)</li>
<li><a
href="https://github.com/vitest-dev/vitest/commit/6c5a447203a29a0708fbc5de4fb91ea501bdc395"><code>6c5a447</code></a>
fix: run hook cleanups when a later hook fails (<a
href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11605">#11605</a>)</li>
<li><a
href="https://github.com/vitest-dev/vitest/commit/9697b3894f456b85db91f3824ebe833449305c04"><code>9697b38</code></a>
fix: keep the import frame in native loader errors (<a
href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11599">#11599</a>)</li>
<li><a
href="https://github.com/vitest-dev/vitest/commit/6498b666a3ae8961f6f2a8abdc89015b6fd0b3aa"><code>6498b66</code></a>
fix(browser): wait 30s for the browser to close (<a
href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11601">#11601</a>)</li>
<li><a
href="https://github.com/vitest-dev/vitest/commit/f161e6df2b3c0bc84982d374094379139e380791"><code>f161e6d</code></a>
fix(browser): drop late connections of closed sessions (<a
href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11600">#11600</a>)</li>
<li><a
href="https://github.com/vitest-dev/vitest/commit/fe86a64c6c6aa75481bffe5880b5c4e35ea67927"><code>fe86a64</code></a>
fix: skip builtin loading in async leak detector (<a
href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11598">#11598</a>)</li>
<li><a
href="https://github.com/vitest-dev/vitest/commit/6ae8e89ff0734cf476e30186a83aebe6771aa330"><code>6ae8e89</code></a>
fix(reporter): end reason <code>'failed'</code> on worker crash (<a
href="https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest/issues/11568">#11568</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/vitest-dev/vitest/commits/v5.0.5/packages/vitest">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>
2026-10-23 14:39:54 -04:00
2026-04-12 12:39:15 +01:00
2024-12-16 22:48:26 +00:00
2026-06-23 15:38:46 -04:00

📚 Shelfmark: Book Search & Request Tool

Shelfmark

Note

Shelfmark is feature stable and maintained on a best-effort basis. Bug fixes, security updates, and small quality-of-life improvements are still shipped, and pull requests are reviewed — including new features. There is no roadmap for new features for now.

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, IRC, and Soulseek (slskd) 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
  • At least 2 GB of RAM available to the container when using the standard image — see Memory Requirements

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

Hardcover API Key

Hardcover powers metadata search in Universal mode. Create a token at hardcover.app/account/api — current keys start with hc_pat_ and are far shorter than the JWTs Hardcover issued before August 2026.

Tick these seven scopes on the token screen:

Scope Used for
read:catalog Metadata search, plus book, edition, author and series lookups
read:library Your reading status and shelf counts
read:lists Your lists and the books on them
read:me:content Test Connection and the "Connected as" label
read:users Usernames shown alongside lists
write:library Setting a book's reading status from Shelfmark
write:lists Adding and removing books from lists, including auto-remove on download

The two write: scopes matter only if you set reading status from Shelfmark or leave Auto-Remove from List on Download enabled (it is on by default) — without them those actions fail silently. Everything else Hardcover offers (journal, goals, reviews, prompts, notifications, account) can stay unticked. The all scope works too, but it grants full account access including deletion, so prefer the list above.

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
USING_WIREGUARD Enable WireGuard VPN egress with kill-switch (requires root startup) false
WIREGUARD_CONFIG Path to the mounted wg-quick config /config/wg0.conf
WIREGUARD_INTERFACE WireGuard interface name wg0
LAN_NETWORK Comma-separated CIDRs kept off the tunnel so the WebUI / internal clients stay reachable 127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
WIREGUARD_ENFORCE_DNS Pin the resolver (via WIREGUARD_DNS, else the config's DNS =) so DNS can't silently fall back to an off-tunnel path. Designed for a trusted LAN resolver kept reachable via LAN_NETWORK (query leaves over the LAN; download still egresses via the tunnel) — it does not force queries through the tunnel. Docker's embedded resolver (127.0.0.11) is preserved when present so container-name resolution keeps working; pin its upstream via the container's dns: list. Fails closed if no resolver is available or /etc/resolv.conf is not writable. true
WIREGUARD_DNS Explicit resolver(s) to pin (comma/space separated). Use when the VPN's pushed DNS filters domains you need; point at a resolver reachable via the tunnel or an allowed LAN resolver. (unset; uses config DNS =)
WIREGUARD_DISABLE_IPV6 Strip IPv6 from the tunnel config (many container kernels lack the ip6tables raw table wg-quick needs) and remove IPv6 as a leak surface. true
WIREGUARD_ALLOW_IPV6_LEAK Escape hatch: continue even when an IPv6 kill-switch can't be installed AND IPv6 can't be disabled. Only set if the container has no IPv6 connectivity. false
WIREGUARD_ALLOW_WEBUI_OFFTUNNEL Opt-in off-tunnel WebUI reachability. Default (false) keeps the kill-switch strictly fail-closed: the only off-tunnel egress is loopback, the tunnel device and the LAN allowlist. Set true only if a non-LAN client (e.g. a public reverse proxy on another segment) must reach the WebUI; it permits app-server replies (--sport FLASK_PORT, conntrack REPLY) off-tunnel — server replies only, never client-initiated egress. LAN clients never need it (covered by LAN_NETWORK). false
WIREGUARD_STALE_AFTER Seconds since the last handshake before the healthcheck bounces the tunnel. 180

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
  • Direct Download mirrors - Supply your own Anna's Archive mirror URLs; Auto mode tries them in the order listed. The annas-archive.is domain does not currently work as a source — use annas-archive.gl instead (checked August 2026; mirror availability changes)
  • IRC - Add details for IRC book sources and download directly from the UI. Most networks serve audiobooks from the same channel as ebooks (on irc.irchighway.net that's #ebooks, while #bookz is effectively inactive), so leave the separate audiobook channel blank unless your network actually indexes one. IRC audiobooks usually arrive as ZIP/RAR archives — keep those enabled under Supported Audiobook Formats or the releases are filtered out of results
  • Soulseek (slskd) - Search the Soulseek network and download through a slskd instance. Point Shelfmark at slskd's URL with an API key (web.authentication.api_keys in slskd.yml, role readwrite), and mount slskd's downloads folder into the Shelfmark container. If the folder sits at a different path inside Shelfmark, set Downloads Path in the slskd settings or add a Remote Path Mapping for client slskd. Ebook results are single files; audiobook results group a peer's folder of audio files into one release
  • 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.

Memory Requirements

The standard image ships a real Chromium browser, which it launches to solve Cloudflare challenges for Direct Download. Chromium needs room to run:

  • 2 GB of RAM available to the container is a safe minimum; 1 GB or less is where problems usually start
  • Only relevant if you use Direct Download. Prowlarr, IRC and audiobook sources don't start the browser

When the container is starved of memory, Chromium fails to start and every Direct Download fails with unrelated-looking errors — repeated 403 detected; switching to bypasser followed by No download URL found, and downloads that never complete. If you're seeing that, check the container's memory limit and the host's free memory before suspecting your ISP or DNS.

If you can't spare the memory, use the Lite image with an external resolver (e.g. FlareSolverr) running elsewhere.

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

WireGuard VPN Routing

Optional WireGuard support to route all external egress through a VPN tunnel with a fail-closed kill-switch:

curl -O https://raw.githubusercontent.com/calibrain/shelfmark/main/compose/docker-compose.wireguard.yml
# place your wg-quick config where the compose mounts /config, as wg0.conf
docker compose -f docker-compose.wireguard.yml up -d

Notes:

  • Requires root startup
  • Requires NET_ADMIN and NET_RAW capabilities
  • Mount a standard wg-quick config at WIREGUARD_CONFIG (default /config/wg0.conf)
  • All non-LAN egress is forced through the tunnel; if the tunnel drops, external traffic fails closed while LAN ranges (WebUI, Prowlarr, qBittorrent) stay reachable
  • IPv4 and IPv6 both fail closed. On kernels without a usable ip6tables, disable IPv6 for the container (sysctls: net.ipv6.conf.all.disable_ipv6=1, as in the compose example) or the container refuses to start rather than risk an IPv6 leak
  • A supervised healthcheck bounces the tunnel if the handshake goes stale, and refreshes the endpoint allow rules so a roaming/rotated peer endpoint can reconnect
  • Mutually exclusive with USING_TOR
  • DNS trust: WIREGUARD_DNS must be a resolver you trust on a trusted network segment. When it is a LAN resolver (kept reachable off-tunnel by LAN_NETWORK), the query to that resolver leaves as plaintext UDP/53 on the LAN — the resolver is responsible for encrypting upstream. Two resolver paths exist: (1) when Docker's embedded resolver (127.0.0.11) is present it is preserved so container names (Prowlarr, qBittorrent) resolve — you MUST pin its upstream to a trusted resolver via the container's compose dns: list, since WIREGUARD_DNS cannot repoint the embedded resolver from inside the container; (2) otherwise WIREGUARD_DNS/the config DNS = line is written to /etc/resolv.conf. Setting WIREGUARD_ENFORCE_DNS=false is a foot-gun: with no embedded resolver present the container then uses its inherited resolver, which forwards to the Docker daemon's upstream off-tunnel, leaking your DNS. Leave enforcement on unless you have pinned the resolver another way.

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
  • Constrained hosts - No bundled browser, so it runs comfortably below the standard image's memory requirements
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.

See API Access to call the API with a static key from scripts and integrations.

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.

Pull requests are welcome and all of them get reviewed, new features included. If you want a feature, the fastest path is to send a PR for it rather than to file a request.

Feature requests that fall outside the project scope (library integration, automation, collection management) will be closed, and PRs implementing them won't be merged. 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 under Settings → Advanced or via the LOG_LEVEL environment variable (DEBUG, INFO, WARNING, ERROR, CRITICAL; case-insensitive, defaults to INFO). The environment variable wins over the setting, and DEBUG=true forces DEBUG regardless of either. Changes take effect on restart.

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.

S
Description
No description provided
Readme MIT
97 MiB
0 Stars 1 Watchers 0 Forks
v1.4.0
Latest
2026-09-26 02:22:42 +01:00
Languages
Python 81.2%
TypeScript 16.9%
Shell 1.3%
CSS 0.2%
Dockerfile 0.2%