Skip to content

feat(qbit-compat): expand qBittorrent WebUI API v2 parity 19→64 endpoints - #65

Merged
thedancingdeveloper merged 7 commits into
devfrom
qbit-webapi-parity-expansion
Sep 1, 2026
Merged

feat(qbit-compat): expand qBittorrent WebUI API v2 parity 19→64 endpoints#65
thedancingdeveloper merged 7 commits into
devfrom
qbit-webapi-parity-expansion

Conversation

@thedancingdeveloper

Copy link
Copy Markdown
Collaborator

Summary

Expands the qBittorrent WebUI API v2 compatibility layer (crates/librtbit/src/http_api/handlers/qbit_compat.rs, mounted at /api/v2) from 19 → 64 of 93 in-scope endpoints routed (~69%) — 26 full, 38 partial — driven by the spec-enforced parity checker (qbit_parity.rs + qbit_parity_spec.json).

Every routed endpoint is backed by real behavior; nothing is a fake-success stub. Work that required new engine capability was built deliberately (design → implementation → adversarial review → fix); the two subsystems that move user data on disk were reviewed for data-safety before landing.

What's included (by commit)

  1. Compat expansion 19→54 — the 2.11 rename-family fix (torrents/start/stop, stopped* states, stopped/running filters, stopped add-field); sync/maindata; tag CRUD (in-memory store + tag filter); trackers/pieceStates/pieceHashes/count/export/webseeds; addTrackers/addPeers/filePrio; the transfer rate-limit + speed-limits-mode family + session pause/resume; per-torrent rate limits (new ratelimit_override, enforced by the live limiter); reannounce; app/defaultSavePath; offset/limit pagination fix. Adds the naming-convention rule to CLAUDE.md.
  2. File/folder/display rename 54→57 — new TorrentStorage::rename_file primitive (moves on disk + reopens the cached handle), stopped-only ManagedTorrent::rename_files() with validation + rollback + metadata rebuild, and a name_override for the display name.
  3. rename clobber fix — adversarial review found renameFile could overwrite an unrelated file at the destination; the storage primitive now refuses a rename onto an existing path.
  4. Whole-torrent relocation setLocation/setSavePath 57→59 — new TorrentStorage::move_root, a mutable output_folder_override root-of-truth, stopped-only + same-filesystem (cross-device refused). Review-driven anchor-consistency fixes (completed-move, native list/details, delete cleanup all read the current root).
  5. torrentcreator task API 59→63 — completes the controller (0→4): an in-memory task store over the native create_torrent, gated by allow_create.
  6. setShareLimits 63→64 — stores + reports ratio/seeding-time limits in torrents/info (clients apply their own removal); not auto-enforced.

Testing

  • Parity checker (spec_matches_router, every_compat_route_is_tracked_in_spec, spec_is_well_formed) green; scoreboard 64/130 (26 full, 38 partial, 29 missing, 37 out of scope).
  • New unit + integration tests: storage-level rename/relocate/rollback/clobber, paused-torrent rename & relocation, per-torrent-limit round-trip, tag & share-limit & creator stores, and an end-to-end torrentcreator addTask.
  • cargo clippy clean on both --features http-api and default; core (default-feature) build clean.

Run: cargo test -p swarmforge --lib --features http-api qbit_.

Documented v1 limitations

  • Rename and relocation are in-session only — the overrides aren't persisted, so after a rename/relocation and a restart the torrent reverts to its original layout and would re-check/re-download (see the ⚠️ caveat in docs/QBIT-API-PARITY.md). Persistence, cross-filesystem relocation, and live rename are the documented v2.
  • setShareLimits is not auto-enforced; torrentcreator tasks and the tag/share-limit stores are not persisted across restarts.

Not included (need behavioral subsystems)

Queueing, share-limit auto-enforcement, setSuperSeeding/toggleSequentialDownload/setForceStart/setAutoManagement, and low-value app/log plumbing — all tracked in docs/QBIT-API-PARITY.md.

🤖 Generated with Claude Code

thedancingdeveloper and others added 6 commits August 31, 2026 01:12
Grow the qBittorrent WebUI API v2 compatibility layer from 19 to 54 of 93
in-scope endpoints (22 full, 32 partial), driven by the spec-enforced parity
checker (qbit_parity.rs + qbit_parity_spec.json).

Compat layer (qbit_compat.rs):
- Fix the 2.11 rename-family bug: route torrents/start+stop (aliasing
  resume/pause), emit stoppedDL/stoppedUP states, accept stopped/running
  filters, read the `stopped` add-field.
- Add sync/maindata (full-update snapshots) via a shared build_torrent_info.
- Add an in-memory tag store + tags/createTags/deleteTags/addTags/removeTags/
  setTags, a `tag` filter, and maindata tags.
- Bridge trackers/pieceStates/pieceHashes/count/export/webseeds and
  addTrackers/addPeers/filePrio.
- Add the transfer rate-limit + speed-limits-mode family and session
  pause/resume; report real session limits in transfer/info.
- Fix offset/limit pagination (offset past end -> empty; limit 0 -> unlimited).

Engine methods (session, torrent_state):
- Per-torrent rate limits: a runtime ratelimit_override on
  ManagedTorrentShared, read at live construction and applied to the live
  limiter, backing torrents/{download,upload}Limit + set*Limit.
- ManagedTorrent::reannounce() signals live re-discovery (torrents/reannounce).
- Session::remove_trackers() backs torrents/removeTrackers and editTracker
  (validates newUrl before removing origUrl).

Also: add a repo coding-convention rule (don't spell the upstream brand name
in code; use the `qbit` abbreviation), unit + integration tests for the new
pure logic and the per-torrent-limit round-trip, and refresh the parity doc.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd
Implement torrents/renameFile, renameFolder, and rename (display name),
routing 3 more in-scope endpoints (57/130).

Storage seam:
- New TorrentStorage::rename_file(file_id, new_relative) primitive. The
  filesystem backend moves the file on disk and re-points its cached open
  handle (OpenedFile::rename_to reopens at the new path); mmap forwards; other
  backends default to an error. Box + middleware forward.

Engine:
- ManagedTorrent::rename_files() is stopped-only (409 when live, sidestepping
  live-handle/Windows/mmap-remap hazards): validates the batch (relative paths,
  no './..'/root, no collisions), moves each file, swaps in rebuilt
  TorrentMetadata with updated file_infos (via TorrentMetadata::with_renamed_files),
  and prunes emptied source dirs. All-or-nothing with rollback.
- ManagedTorrent::set_display_name() + a name_override on ManagedTorrentShared,
  preferred by name() and surfaced in torrents/info and sync/maindata.

Compat layer:
- renameFile/renameFolder resolve paths against file_infos; the torrents/files
  listing now sources names from file_infos (reflecting renames) when its count
  aligns with the details list.

Limitations (documented): renames are not persisted across restarts and require
the torrent stopped; live rename is the harness-gated v2. Adds storage-level and
paused-torrent integration tests; parity doc updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd
…nation

Adversarial review found a data-loss path: torrents/renameFile mapped through
fs::rename, which atomically replaces an existing destination, so renaming a
torrent file onto an unrelated file already in the download directory silently
destroyed that file (validate_renames only checks the torrent's own file_infos,
not unrelated on-disk files). The same non-atomic overwrite made a cyclic
rename batch clobber intermediates.

OpenedFile::rename_to now refuses the move when the destination already exists
(and isn't this file), so a rename never overwrites unrelated data and a
colliding/cyclic batch fails safely (rejected before/at the first clobbering
move, triggering the existing rollback). Add a storage-level test asserting an
unrelated file at the target path is left intact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd
…57→59)

Implement torrents/setLocation and torrents/setSavePath (same handler),
routing 2 more in-scope endpoints (59/130).

Storage seam:
- New TorrentStorage::move_root(new_root): the filesystem backend moves every
  file to the same relative path under a new root (OpenedFile::rebase, reusing
  the shared no-clobber rename_locked core) and re-anchors its now
  RwLock<PathBuf> output_folder; mmap forwards. All-or-nothing with rollback;
  cross-filesystem (EXDEV) is refused, not copied.

Engine:
- New output_folder_override on ManagedTorrentShared (seeded from
  options.output_folder, read by the storage factory's create) as the mutable
  root-of-truth, rather than unfreezing the immutable options.
- ManagedTorrent::set_location() is stopped-only (409 when live), same-filesystem
  only. New ManagedTorrent::output_folder() accessor returns the current root.

Consistency (from adversarial review — options.output_folder is now stale after
a relocation):
- move_completed_torrent, the native torrent list/details save-path, the
  delete-time empty-dir cleanup gate, and qbit_save_path all now read the
  current root via output_folder(), so a relocated torrent isn't operated on at
  its old (empty) path.
- move_root rollback failures are now warn-logged instead of silently swallowed.

Adds storage-level (relocate + partial-failure rollback) and paused-torrent
integration tests. Documents the same-filesystem/stopped-only scope and a louder
restart caveat (renames/relocations are in-session only until v2 persistence).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd
Complete the torrentcreator controller (0→4 of 4) by bridging the native
create_torrent behind qBittorrent's task-lifecycle model:

- New in-memory QbitTorrentCreator store on QbitState (Running/Finished/Failed
  tasks keyed by a random task id; not persisted across restarts).
- torrentcreator/addTask spawns create_torrent off the request path (mapping
  sourcePath/trackers/pieceSize/name; other options ignored) and records the
  result; gated by the same allow_create flag as the native create endpoint,
  returning 403 when disabled.
- torrentcreator/status returns task status (one task with taskID, else all),
  torrentcreator/torrentFile returns the generated .torrent bytes for a finished
  task (409 if unfinished, 404 if unknown), and torrentcreator/deleteTask drops
  a task.

Adds a store-lifecycle unit test and an end-to-end addTask test (creates a real
torrent from a temp directory and polls the task to completion). Parity 63/130
(26 full, 37 partial); doc updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd
…s) (63→64)

Add torrents/setShareLimits as a reporting-only bridge (64/130): an in-memory
per-torrent store (QbitShareLimits) records the ratio and seeding-time limits a
client sets, and they are surfaced in torrents/info and sync/maindata
(ratio_limit/max_ratio now f64, seeding_time_limit/max_seeding_time). rtbit does
not auto-enforce them — clients such as Sonarr/Radarr read ratio/seeding_time
and apply their own removal policy — which is the target use case; auto-pause
enforcement is deferred to a v2 periodic session task. Not persisted across
restarts.

Adds a share-limit store test; parity 64/130 (26 full, 38 partial); doc updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd
@thedancingdeveloper
thedancingdeveloper changed the base branch from main to dev August 31, 2026 04:43
The rust CI job failed on `cargo fmt --all -- --check`; apply rustfmt
line-wrapping and import ordering. No functional changes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bk5yAWYouGDBjrJVsv9hKV
@thedancingdeveloper
thedancingdeveloper merged commit 2ffc42a into dev Sep 1, 2026
7 checks passed
@thedancingdeveloper
thedancingdeveloper deleted the qbit-webapi-parity-expansion branch September 1, 2026 02:25
thedancingdeveloper added a commit that referenced this pull request Sep 1, 2026
* ci: dev → main → release promotion flow

Introduce a `dev` integration branch and wire the pipeline for a
dev → main → cut-release (v* tag) → prod promotion flow:

- container.yml: publish per stage — dev branch -> :dev (preview), main branch
  -> :staging (promoted/pre-release), v* tag -> prod (:latest/:beta/:<tag>);
  every build keeps an immutable :sha-<commit> tag. Verify the matching
  anonymous manifest per stage.
- ci.yml + runner-policy.yml: also run on `dev` pushes (PRs already run
  regardless of base).
- ReleaseProcess.md: document the branching model and the tag re-mapping.

Note: `…:dev` now follows the `dev` branch; a deployment that tracked `…:dev`
for "latest main" should repoint to `…:staging`.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd

* ci(dependabot): target the dev branch for version updates

Point all six Dependabot update configs at `dev` so dependency PRs land on the
integration branch and promote to main via the normal flow. Takes effect once
this reaches the default branch (main).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd

* chore(deps-dev): bump the root-npm-minor-patch group across 1 directory with 2 updates (#49)

Bumps the root-npm-minor-patch group with 2 updates in the / directory: [prettier](https://github.com/prettier/prettier) and [@tauri-apps/cli](https://github.com/tauri-apps/tauri).


Updates `prettier` from 3.8.4 to 3.9.6
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](prettier/prettier@3.8.4...3.9.6)

Updates `@tauri-apps/cli` from 2.11.2 to 2.11.4
- [Release notes](https://github.com/tauri-apps/tauri/releases)
- [Commits](https://github.com/tauri-apps/tauri/compare/@tauri-apps/cli-v2.11.2...@tauri-apps/cli-v2.11.4)

---
updated-dependencies:
- dependency-name: "@tauri-apps/cli"
  dependency-version: 2.11.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: root-npm-minor-patch
- dependency-name: prettier
  dependency-version: 3.9.6
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: root-npm-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump actions/setup-node (#50)

Bumps the actions-all group with 1 update in the / directory: [actions/setup-node](https://github.com/actions/setup-node).


Updates `actions/setup-node` from 6 to 7
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@v6...v7)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions-all
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump the fuzz-minor-patch group across 1 directory with 4 updates (#51)

Bumps the fuzz-minor-patch group with 4 updates in the /fuzz directory: [aws-lc-rs](https://github.com/aws/aws-lc-rs), [data-encoding](https://github.com/ia0/data-encoding), [futures](https://github.com/rust-lang/futures-rs) and [thiserror](https://github.com/dtolnay/thiserror).


Updates `aws-lc-rs` from 1.17.3 to 1.18.0
- [Release notes](https://github.com/aws/aws-lc-rs/releases)
- [Commits](aws/aws-lc-rs@v1.17.3...v1.18.0)

Updates `data-encoding` from 2.11.0 to 2.11.1
- [Commits](ia0/data-encoding@v2.11.0...v2.11.1)

Updates `futures` from 0.3.33 to 0.3.34
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/main/CHANGELOG.md)
- [Commits](rust-lang/futures-rs@0.3.33...0.3.34)

Updates `thiserror` from 2.0.19 to 2.0.20
- [Release notes](https://github.com/dtolnay/thiserror/releases)
- [Commits](dtolnay/thiserror@2.0.19...2.0.20)

---
updated-dependencies:
- dependency-name: aws-lc-rs
  dependency-version: 1.18.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: fuzz-minor-patch
- dependency-name: data-encoding
  dependency-version: 2.11.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: fuzz-minor-patch
- dependency-name: futures
  dependency-version: 0.3.34
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: fuzz-minor-patch
- dependency-name: thiserror
  dependency-version: 2.0.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: fuzz-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump the webui-minor-patch group across 1 directory with 18 updates (#56)

Bumps the webui-minor-patch group with 17 updates in the /crates/librtbit/webui directory:

| Package | From | To |
| --- | --- | --- |
| [react](https://github.com/react/react/tree/HEAD/packages/react) | `19.2.7` | `19.2.8` |
| [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) | `19.2.17` | `19.2.18` |
| [react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom) | `19.2.7` | `19.2.8` |
| [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) | `19.2.3` | `19.2.5` |
| [react-icons](https://github.com/react-icons/react-icons) | `5.6.0` | `5.7.0` |
| [react-virtuoso](https://github.com/petyosi/react-virtuoso/tree/HEAD/packages/react-virtuoso) | `4.18.7` | `4.18.12` |
| [zustand](https://github.com/pmndrs/zustand) | `5.0.14` | `5.0.15` |
| [@playwright/test](https://github.com/microsoft/playwright) | `1.61.1` | `1.62.1` |
| [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) | `4.3.0` | `4.3.3` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.1.1` | `26.4.0` |
| [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `6.0.2` | `6.1.1` |
| [autoprefixer](https://github.com/postcss/autoprefixer) | `10.5.0` | `10.5.4` |
| [eslint](https://github.com/eslint/eslint) | `10.4.1` | `10.9.1` |
| [eslint-plugin-react-refresh](https://github.com/ArnaudBarre/eslint-plugin-react-refresh) | `0.5.2` | `0.5.5` |
| [prettier](https://github.com/prettier/prettier) | `3.8.4` | `3.9.6` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.61.0` | `8.68.0` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.0.16` | `8.2.2` |



Updates `react` from 19.2.7 to 19.2.8
- [Release notes](https://github.com/react/react/releases)
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/react/react/commits/v19.2.8/packages/react)

Updates `@types/react` from 19.2.17 to 19.2.18
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `react-dom` from 19.2.7 to 19.2.8
- [Release notes](https://github.com/react/react/releases)
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/react/react/commits/v19.2.8/packages/react-dom)

Updates `@types/react-dom` from 19.2.3 to 19.2.5
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

Updates `react-icons` from 5.6.0 to 5.7.0
- [Release notes](https://github.com/react-icons/react-icons/releases)
- [Commits](react-icons/react-icons@v5.6.0...v5.7.0)

Updates `react-virtuoso` from 4.18.7 to 4.18.12
- [Release notes](https://github.com/petyosi/react-virtuoso/releases)
- [Changelog](https://github.com/petyosi/react-virtuoso/blob/main/packages/react-virtuoso/CHANGELOG.md)
- [Commits](https://github.com/petyosi/react-virtuoso/commits/react-virtuoso@4.18.12/packages/react-virtuoso)

Updates `zustand` from 5.0.14 to 5.0.15
- [Release notes](https://github.com/pmndrs/zustand/releases)
- [Commits](pmndrs/zustand@v5.0.14...v5.0.15)

Updates `@playwright/test` from 1.61.1 to 1.62.1
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](microsoft/playwright@v1.61.1...v1.62.1)

Updates `@tailwindcss/vite` from 4.3.0 to 4.3.3
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.3/packages/@tailwindcss-vite)

Updates `@types/node` from 26.1.1 to 26.4.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@types/react` from 19.2.17 to 19.2.18
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/react-dom` from 19.2.3 to 19.2.5
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom)

Updates `@vitejs/plugin-react` from 6.0.2 to 6.1.1
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.1/packages/plugin-react)

Updates `autoprefixer` from 10.5.0 to 10.5.4
- [Release notes](https://github.com/postcss/autoprefixer/releases)
- [Changelog](https://github.com/postcss/autoprefixer/blob/main/CHANGELOG.md)
- [Commits](postcss/autoprefixer@10.5.0...10.5.4)

Updates `eslint` from 10.4.1 to 10.9.1
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](eslint/eslint@v10.4.1...v10.9.1)

Updates `eslint-plugin-react-refresh` from 0.5.2 to 0.5.5
- [Release notes](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/releases)
- [Changelog](https://github.com/ArnaudBarre/eslint-plugin-react-refresh/blob/main/CHANGELOG.md)
- [Commits](ArnaudBarre/eslint-plugin-react-refresh@v0.5.2...v0.5.5)

Updates `prettier` from 3.8.4 to 3.9.6
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](prettier/prettier@3.8.4...3.9.6)

Updates `tailwindcss` from 4.3.0 to 4.3.3
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.3/packages/tailwindcss)

Updates `typescript-eslint` from 8.61.0 to 8.68.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.68.0/packages/typescript-eslint)

Updates `vite` from 8.0.16 to 8.2.2
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.2.2/packages/vite)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.62.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: webui-minor-patch
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.3.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: webui-minor-patch
- dependency-name: "@types/node"
  dependency-version: 26.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: webui-minor-patch
- dependency-name: "@types/react"
  dependency-version: 19.2.18
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: webui-minor-patch
- dependency-name: "@types/react"
  dependency-version: 19.2.18
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: webui-minor-patch
- dependency-name: "@types/react-dom"
  dependency-version: 19.2.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: webui-minor-patch
- dependency-name: "@types/react-dom"
  dependency-version: 19.2.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: webui-minor-patch
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: webui-minor-patch
- dependency-name: autoprefixer
  dependency-version: 10.5.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: webui-minor-patch
- dependency-name: eslint
  dependency-version: 10.9.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: webui-minor-patch
- dependency-name: eslint-plugin-react-refresh
  dependency-version: 0.5.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: webui-minor-patch
- dependency-name: prettier
  dependency-version: 3.9.6
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: webui-minor-patch
- dependency-name: react
  dependency-version: 19.2.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: webui-minor-patch
- dependency-name: react-dom
  dependency-version: 19.2.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: webui-minor-patch
- dependency-name: react-icons
  dependency-version: 5.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: webui-minor-patch
- dependency-name: react-virtuoso
  dependency-version: 4.18.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: webui-minor-patch
- dependency-name: tailwindcss
  dependency-version: 4.3.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: webui-minor-patch
- dependency-name: typescript-eslint
  dependency-version: 8.68.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: webui-minor-patch
- dependency-name: vite
  dependency-version: 8.2.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: webui-minor-patch
- dependency-name: zustand
  dependency-version: 5.0.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: webui-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump the benchv2-minor-patch group across 1 directory with 10 updates (#52)

Bumps the benchv2-minor-patch group with 10 updates in the /benchv2 directory:

| Package | From | To |
| --- | --- | --- |
| [tokio](https://github.com/tokio-rs/tokio) | `1.50.0` | `1.53.1` |
| [serde](https://github.com/serde-rs/serde) | `1.0.228` | `1.0.229` |
| [serde_json](https://github.com/serde-rs/json) | `1.0.149` | `1.0.151` |
| [clap](https://github.com/clap-rs/clap) | `4.6.0` | `4.6.6` |
| [chrono](https://github.com/chronotope/chrono) | `0.4.44` | `0.4.45` |
| [anyhow](https://github.com/dtolnay/anyhow) | `1.0.102` | `1.0.104` |
| [dashmap](https://github.com/xacrimon/dashmap) | `6.1.0` | `6.2.1` |
| [futures-util](https://github.com/rust-lang/futures-rs) | `0.3.32` | `0.3.34` |
| [tokio-util](https://github.com/tokio-rs/tokio) | `0.7.18` | `0.7.19` |
| [memmap2](https://github.com/RazrFalcon/memmap2-rs) | `0.9.10` | `0.9.11` |



Updates `tokio` from 1.50.0 to 1.53.1
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](tokio-rs/tokio@tokio-1.50.0...tokio-1.53.1)

Updates `serde` from 1.0.228 to 1.0.229
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](serde-rs/serde@v1.0.228...v1.0.229)

Updates `serde_json` from 1.0.149 to 1.0.151
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](serde-rs/json@v1.0.149...v1.0.151)

Updates `clap` from 4.6.0 to 4.6.6
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](clap-rs/clap@clap_complete-v4.6.0...clap_complete-v4.6.6)

Updates `chrono` from 0.4.44 to 0.4.45
- [Release notes](https://github.com/chronotope/chrono/releases)
- [Changelog](https://github.com/chronotope/chrono/blob/main/CHANGELOG.md)
- [Commits](chronotope/chrono@v0.4.44...v0.4.45)

Updates `anyhow` from 1.0.102 to 1.0.104
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](dtolnay/anyhow@1.0.102...1.0.104)

Updates `dashmap` from 6.1.0 to 6.2.1
- [Release notes](https://github.com/xacrimon/dashmap/releases)
- [Commits](xacrimon/dashmap@v6.1.0...v6.2.1)

Updates `futures-util` from 0.3.32 to 0.3.34
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/main/CHANGELOG.md)
- [Commits](rust-lang/futures-rs@0.3.32...0.3.34)

Updates `tokio-util` from 0.7.18 to 0.7.19
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](tokio-rs/tokio@tokio-util-0.7.18...tokio-util-0.7.19)

Updates `memmap2` from 0.9.10 to 0.9.11
- [Changelog](https://github.com/RazrFalcon/memmap2-rs/blob/master/CHANGELOG.md)
- [Commits](RazrFalcon/memmap2-rs@v0.9.10...v0.9.11)

---
updated-dependencies:
- dependency-name: anyhow
  dependency-version: 1.0.104
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: benchv2-minor-patch
- dependency-name: chrono
  dependency-version: 0.4.45
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: benchv2-minor-patch
- dependency-name: clap
  dependency-version: 4.6.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: benchv2-minor-patch
- dependency-name: dashmap
  dependency-version: 6.2.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: benchv2-minor-patch
- dependency-name: futures-util
  dependency-version: 0.3.34
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: benchv2-minor-patch
- dependency-name: memmap2
  dependency-version: 0.9.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: benchv2-minor-patch
- dependency-name: serde
  dependency-version: 1.0.229
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: benchv2-minor-patch
- dependency-name: serde_json
  dependency-version: 1.0.151
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: benchv2-minor-patch
- dependency-name: tokio
  dependency-version: 1.53.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: benchv2-minor-patch
- dependency-name: tokio-util
  dependency-version: 0.7.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: benchv2-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump rand from 0.8.6 to 0.9.3 in /benchv2 (#53)

Bumps [rand](https://github.com/rust-random/rand) from 0.8.6 to 0.9.3.
- [Release notes](https://github.com/rust-random/rand/releases)
- [Changelog](https://github.com/rust-random/rand/blob/0.9.3/CHANGELOG.md)
- [Commits](rust-random/rand@0.8.6...0.9.3)

---
updated-dependencies:
- dependency-name: rand
  dependency-version: 0.9.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(qbit-compat): expand qBittorrent WebUI API v2 parity 19→64 endpoints (#65)

* feat(qbit-compat): expand WebUI API v2 parity 19→54 endpoints

Grow the qBittorrent WebUI API v2 compatibility layer from 19 to 54 of 93
in-scope endpoints (22 full, 32 partial), driven by the spec-enforced parity
checker (qbit_parity.rs + qbit_parity_spec.json).

Compat layer (qbit_compat.rs):
- Fix the 2.11 rename-family bug: route torrents/start+stop (aliasing
  resume/pause), emit stoppedDL/stoppedUP states, accept stopped/running
  filters, read the `stopped` add-field.
- Add sync/maindata (full-update snapshots) via a shared build_torrent_info.
- Add an in-memory tag store + tags/createTags/deleteTags/addTags/removeTags/
  setTags, a `tag` filter, and maindata tags.
- Bridge trackers/pieceStates/pieceHashes/count/export/webseeds and
  addTrackers/addPeers/filePrio.
- Add the transfer rate-limit + speed-limits-mode family and session
  pause/resume; report real session limits in transfer/info.
- Fix offset/limit pagination (offset past end -> empty; limit 0 -> unlimited).

Engine methods (session, torrent_state):
- Per-torrent rate limits: a runtime ratelimit_override on
  ManagedTorrentShared, read at live construction and applied to the live
  limiter, backing torrents/{download,upload}Limit + set*Limit.
- ManagedTorrent::reannounce() signals live re-discovery (torrents/reannounce).
- Session::remove_trackers() backs torrents/removeTrackers and editTracker
  (validates newUrl before removing origUrl).

Also: add a repo coding-convention rule (don't spell the upstream brand name
in code; use the `qbit` abbreviation), unit + integration tests for the new
pure logic and the per-torrent-limit round-trip, and refresh the parity doc.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd

* feat(qbit-compat): file/folder/display rename (parity 54→57)

Implement torrents/renameFile, renameFolder, and rename (display name),
routing 3 more in-scope endpoints (57/130).

Storage seam:
- New TorrentStorage::rename_file(file_id, new_relative) primitive. The
  filesystem backend moves the file on disk and re-points its cached open
  handle (OpenedFile::rename_to reopens at the new path); mmap forwards; other
  backends default to an error. Box + middleware forward.

Engine:
- ManagedTorrent::rename_files() is stopped-only (409 when live, sidestepping
  live-handle/Windows/mmap-remap hazards): validates the batch (relative paths,
  no './..'/root, no collisions), moves each file, swaps in rebuilt
  TorrentMetadata with updated file_infos (via TorrentMetadata::with_renamed_files),
  and prunes emptied source dirs. All-or-nothing with rollback.
- ManagedTorrent::set_display_name() + a name_override on ManagedTorrentShared,
  preferred by name() and surfaced in torrents/info and sync/maindata.

Compat layer:
- renameFile/renameFolder resolve paths against file_infos; the torrents/files
  listing now sources names from file_infos (reflecting renames) when its count
  aligns with the details list.

Limitations (documented): renames are not persisted across restarts and require
the torrent stopped; live rename is the harness-gated v2. Adds storage-level and
paused-torrent integration tests; parity doc updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd

* fix(storage): refuse file rename that would clobber an existing destination

Adversarial review found a data-loss path: torrents/renameFile mapped through
fs::rename, which atomically replaces an existing destination, so renaming a
torrent file onto an unrelated file already in the download directory silently
destroyed that file (validate_renames only checks the torrent's own file_infos,
not unrelated on-disk files). The same non-atomic overwrite made a cyclic
rename batch clobber intermediates.

OpenedFile::rename_to now refuses the move when the destination already exists
(and isn't this file), so a rename never overwrites unrelated data and a
colliding/cyclic batch fails safely (rejected before/at the first clobbering
move, triggering the existing rollback). Add a storage-level test asserting an
unrelated file at the target path is left intact.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd

* feat(qbit-compat): whole-torrent relocation setLocation/setSavePath (57→59)

Implement torrents/setLocation and torrents/setSavePath (same handler),
routing 2 more in-scope endpoints (59/130).

Storage seam:
- New TorrentStorage::move_root(new_root): the filesystem backend moves every
  file to the same relative path under a new root (OpenedFile::rebase, reusing
  the shared no-clobber rename_locked core) and re-anchors its now
  RwLock<PathBuf> output_folder; mmap forwards. All-or-nothing with rollback;
  cross-filesystem (EXDEV) is refused, not copied.

Engine:
- New output_folder_override on ManagedTorrentShared (seeded from
  options.output_folder, read by the storage factory's create) as the mutable
  root-of-truth, rather than unfreezing the immutable options.
- ManagedTorrent::set_location() is stopped-only (409 when live), same-filesystem
  only. New ManagedTorrent::output_folder() accessor returns the current root.

Consistency (from adversarial review — options.output_folder is now stale after
a relocation):
- move_completed_torrent, the native torrent list/details save-path, the
  delete-time empty-dir cleanup gate, and qbit_save_path all now read the
  current root via output_folder(), so a relocated torrent isn't operated on at
  its old (empty) path.
- move_root rollback failures are now warn-logged instead of silently swallowed.

Adds storage-level (relocate + partial-failure rollback) and paused-torrent
integration tests. Documents the same-filesystem/stopped-only scope and a louder
restart caveat (renames/relocations are in-session only until v2 persistence).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd

* feat(qbit-compat): torrentcreator task API (parity 59→63)

Complete the torrentcreator controller (0→4 of 4) by bridging the native
create_torrent behind qBittorrent's task-lifecycle model:

- New in-memory QbitTorrentCreator store on QbitState (Running/Finished/Failed
  tasks keyed by a random task id; not persisted across restarts).
- torrentcreator/addTask spawns create_torrent off the request path (mapping
  sourcePath/trackers/pieceSize/name; other options ignored) and records the
  result; gated by the same allow_create flag as the native create endpoint,
  returning 403 when disabled.
- torrentcreator/status returns task status (one task with taskID, else all),
  torrentcreator/torrentFile returns the generated .torrent bytes for a finished
  task (409 if unfinished, 404 if unknown), and torrentcreator/deleteTask drops
  a task.

Adds a store-lifecycle unit test and an end-to-end addTask test (creates a real
torrent from a temp directory and polls the task to completion). Parity 63/130
(26 full, 37 partial); doc updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd

* feat(qbit-compat): setShareLimits (store + report ratio/seeding limits) (63→64)

Add torrents/setShareLimits as a reporting-only bridge (64/130): an in-memory
per-torrent store (QbitShareLimits) records the ratio and seeding-time limits a
client sets, and they are surfaced in torrents/info and sync/maindata
(ratio_limit/max_ratio now f64, seeding_time_limit/max_seeding_time). rtbit does
not auto-enforce them — clients such as Sonarr/Radarr read ratio/seeding_time
and apply their own removal policy — which is the target use case; auto-pause
enforcement is deferred to a v2 periodic session task. Not persisted across
restarts.

Adds a share-limit store test; parity 64/130 (26 full, 38 partial); doc updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKifWkRa73PGrp9acFWeyd

* style: cargo fmt to satisfy CI fmt check

The rust CI job failed on `cargo fmt --all -- --check`; apply rustfmt
line-wrapping and import ordering. No functional changes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bk5yAWYouGDBjrJVsv9hKV

---------

Co-authored-by: thedancingdeveloper <306930456+thedancingdeveloper@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>

* chore(deps): bump the cargo-minor-patch group across 1 directory with 36 updates (#58)

Bumps the cargo-minor-patch group with 34 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [anyhow](https://github.com/dtolnay/anyhow) | `1.0.102` | `1.0.104` |
| [arc-swap](https://github.com/vorner/arc-swap) | `1.9.1` | `1.9.2` |
| [arrayvec](https://github.com/bluss/arrayvec) | `0.7.6` | `0.7.8` |
| [async-compression](https://github.com/Nullus157/async-compression) | `0.4.42` | `0.4.43` |
| [async-trait](https://github.com/dtolnay/async-trait) | `0.1.89` | `0.1.92` |
| [atoi](https://github.com/pacman82/atoi-rs) | `3.0.0` | `3.1.0` |
| [aws-lc-rs](https://github.com/aws/aws-lc-rs) | `1.17.0` | `1.18.0` |
| [bitvec](https://github.com/bitvecto-rs/bitvec) | `1.0.1` | `1.1.1` |
| [bstr](https://github.com/BurntSushi/bstr) | `1.12.1` | `1.13.1` |
| [bytes](https://github.com/tokio-rs/bytes) | `1.11.1` | `1.12.1` |
| [clap](https://github.com/clap-rs/clap) | `4.6.1` | `4.6.6` |
| [clap_complete](https://github.com/clap-rs/clap) | `4.6.5` | `4.6.9` |
| [crc32fast](https://github.com/srijs/rust-crc32fast) | `1.5.0` | `1.5.1` |
| [data-encoding](https://github.com/ia0/data-encoding) | `2.11.0` | `2.11.1` |
| [feed-rs](https://github.com/feed-rs/feed-rs) | `2.3.1` | `2.4.0` |
| [futures](https://github.com/rust-lang/futures-rs) | `0.3.32` | `0.3.34` |
| [http](https://github.com/hyperium/http) | `1.4.2` | `1.5.0` |
| [humantime](https://github.com/chronotope/humantime) | `2.3.0` | `2.4.0` |
| [libc](https://github.com/rust-lang/libc) | `0.2.186` | `0.2.189` |
| [lru](https://github.com/jeromefroe/lru-rs) | `0.18.0` | `0.18.3` |
| [memchr](https://github.com/BurntSushi/memchr) | `2.8.2` | `2.8.3` |
| [memmap2](https://github.com/RazrFalcon/memmap2-rs) | `0.9.10` | `0.9.11` |
| [openssl](https://github.com/rust-openssl/rust-openssl) | `0.10.80` | `0.10.81` |
| [rand](https://github.com/rust-random/rand) | `0.10.1` | `0.10.2` |
| [regex](https://github.com/rust-lang/regex) | `1.12.4` | `1.13.1` |
| [serde](https://github.com/serde-rs/serde) | `1.0.228` | `1.0.229` |
| [serde_json](https://github.com/serde-rs/json) | `1.0.150` | `1.0.151` |
| [serde_with](https://github.com/jonasbb/serde_with) | `3.21.0` | `3.22.0` |
| [socket2](https://github.com/rust-lang/socket2) | `0.6.4` | `0.6.5` |
| [thiserror](https://github.com/dtolnay/thiserror) | `2.0.18` | `2.0.20` |
| [tokio](https://github.com/tokio-rs/tokio) | `1.52.3` | `1.53.1` |
| [tokio-stream](https://github.com/tokio-rs/tokio) | `0.1.18` | `0.1.19` |
| [tokio-util](https://github.com/tokio-rs/tokio) | `0.7.18` | `0.7.19` |
| [open](https://github.com/Byron/open-rs) | `5.4.0` | `5.4.2` |



Updates `anyhow` from 1.0.102 to 1.0.104
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](dtolnay/anyhow@1.0.102...1.0.104)

Updates `arc-swap` from 1.9.1 to 1.9.2
- [Changelog](https://github.com/vorner/arc-swap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vorner/arc-swap/commits)

Updates `arrayvec` from 0.7.6 to 0.7.8
- [Release notes](https://github.com/bluss/arrayvec/releases)
- [Changelog](https://github.com/bluss/arrayvec/blob/master/CHANGELOG.md)
- [Commits](bluss/arrayvec@0.7.6...0.7.8)

Updates `async-compression` from 0.4.42 to 0.4.43
- [Release notes](https://github.com/Nullus157/async-compression/releases)
- [Commits](Nullus157/async-compression@async-compression-v0.4.42...async-compression-v0.4.43)

Updates `async-trait` from 0.1.89 to 0.1.92
- [Release notes](https://github.com/dtolnay/async-trait/releases)
- [Commits](dtolnay/async-trait@0.1.89...0.1.92)

Updates `atoi` from 3.0.0 to 3.1.0
- [Release notes](https://github.com/pacman82/atoi-rs/releases)
- [Changelog](https://github.com/pacman82/atoi-rs/blob/main/CHANGELOG.md)
- [Commits](pacman82/atoi-rs@v3.0.0...v3.1.0)

Updates `aws-lc-rs` from 1.17.0 to 1.18.0
- [Release notes](https://github.com/aws/aws-lc-rs/releases)
- [Commits](aws/aws-lc-rs@v1.17.0...v1.18.0)

Updates `bitvec` from 1.0.1 to 1.1.1
- [Changelog](https://github.com/ferrilab/bitvec/blob/main/CHANGELOG.md)
- [Commits](https://github.com/bitvecto-rs/bitvec/commits)

Updates `bstr` from 1.12.1 to 1.13.1
- [Commits](BurntSushi/bstr@1.12.1...1.13.1)

Updates `bytes` from 1.11.1 to 1.12.1
- [Release notes](https://github.com/tokio-rs/bytes/releases)
- [Changelog](https://github.com/tokio-rs/bytes/blob/master/CHANGELOG.md)
- [Commits](tokio-rs/bytes@v1.11.1...v1.12.1)

Updates `clap` from 4.6.1 to 4.6.6
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](clap-rs/clap@clap_complete-v4.6.1...clap_complete-v4.6.6)

Updates `clap_complete` from 4.6.5 to 4.6.9
- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](clap-rs/clap@clap_complete-v4.6.5...clap_complete-v4.6.9)

Updates `crc32fast` from 1.5.0 to 1.5.1
- [Commits](srijs/rust-crc32fast@v1.5.0...v1.5.1)

Updates `data-encoding` from 2.11.0 to 2.11.1
- [Commits](ia0/data-encoding@v2.11.0...v2.11.1)

Updates `feed-rs` from 2.3.1 to 2.4.0
- [Release notes](https://github.com/feed-rs/feed-rs/releases)
- [Commits](feed-rs/feed-rs@v2.3.1...v2.4.0)

Updates `futures` from 0.3.32 to 0.3.34
- [Release notes](https://github.com/rust-lang/futures-rs/releases)
- [Changelog](https://github.com/rust-lang/futures-rs/blob/main/CHANGELOG.md)
- [Commits](rust-lang/futures-rs@0.3.32...0.3.34)

Updates `http` from 1.4.2 to 1.5.0
- [Release notes](https://github.com/hyperium/http/releases)
- [Changelog](https://github.com/hyperium/http/blob/master/CHANGELOG.md)
- [Commits](hyperium/http@v1.4.2...v1.5.0)

Updates `humantime` from 2.3.0 to 2.4.0
- [Release notes](https://github.com/chronotope/humantime/releases)
- [Commits](chronotope/humantime@v2.3.0...v2.4.0)

Updates `libc` from 0.2.186 to 0.2.189
- [Release notes](https://github.com/rust-lang/libc/releases)
- [Changelog](https://github.com/rust-lang/libc/blob/0.2.189/CHANGELOG.md)
- [Commits](rust-lang/libc@0.2.186...0.2.189)

Updates `lru` from 0.18.0 to 0.18.3
- [Changelog](https://github.com/jeromefroe/lru-rs/blob/master/CHANGELOG.md)
- [Commits](jeromefroe/lru-rs@0.18.0...0.18.3)

Updates `memchr` from 2.8.2 to 2.8.3
- [Commits](BurntSushi/memchr@2.8.2...2.8.3)

Updates `memmap2` from 0.9.10 to 0.9.11
- [Changelog](https://github.com/RazrFalcon/memmap2-rs/blob/master/CHANGELOG.md)
- [Commits](RazrFalcon/memmap2-rs@v0.9.10...v0.9.11)

Updates `openssl` from 0.10.80 to 0.10.81
- [Release notes](https://github.com/rust-openssl/rust-openssl/releases)
- [Commits](rust-openssl/rust-openssl@openssl-v0.10.80...openssl-v0.10.81)

Updates `rand` from 0.10.1 to 0.10.2
- [Release notes](https://github.com/rust-random/rand/releases)
- [Changelog](https://github.com/rust-random/rand/blob/master/CHANGELOG.md)
- [Commits](rust-random/rand@0.10.1...0.10.2)

Updates `regex` from 1.12.4 to 1.13.1
- [Release notes](https://github.com/rust-lang/regex/releases)
- [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md)
- [Commits](rust-lang/regex@1.12.4...1.13.1)

Updates `serde` from 1.0.228 to 1.0.229
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](serde-rs/serde@v1.0.228...v1.0.229)

Updates `serde_derive` from 1.0.228 to 1.0.229
- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](serde-rs/serde@v1.0.228...v1.0.229)

Updates `serde_json` from 1.0.150 to 1.0.151
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](serde-rs/json@v1.0.150...v1.0.151)

Updates `serde_with` from 3.21.0 to 3.22.0
- [Release notes](https://github.com/jonasbb/serde_with/releases)
- [Commits](jonasbb/serde_with@v3.21.0...v3.22.0)

Updates `socket2` from 0.6.4 to 0.6.5
- [Release notes](https://github.com/rust-lang/socket2/releases)
- [Changelog](https://github.com/rust-lang/socket2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rust-lang/socket2/commits/v0.6.5)

Updates `thiserror` from 2.0.18 to 2.0.20
- [Release notes](https://github.com/dtolnay/thiserror/releases)
- [Commits](dtolnay/thiserror@2.0.18...2.0.20)

Updates `tokio` from 1.52.3 to 1.53.1
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](tokio-rs/tokio@tokio-1.52.3...tokio-1.53.1)

Updates `tokio-stream` from 0.1.18 to 0.1.19
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](tokio-rs/tokio@tokio-stream-0.1.18...tokio-stream-0.1.19)

Updates `tokio-util` from 0.7.18 to 0.7.19
- [Release notes](https://github.com/tokio-rs/tokio/releases)
- [Commits](tokio-rs/tokio@tokio-util-0.7.18...tokio-util-0.7.19)

Updates `uuid` from 1.23.3 to 1.26.0
- [Release notes](https://github.com/uuid-rs/uuid/releases)
- [Commits](uuid-rs/uuid@v1.23.3...v1.26.0)

Updates `open` from 5.4.0 to 5.4.2
- [Release notes](https://github.com/Byron/open-rs/releases)
- [Changelog](https://github.com/Byron/open-rs/blob/main/changelog.md)
- [Commits](Byron/open-rs@v5.4.0...v5.4.2)

---
updated-dependencies:
- dependency-name: anyhow
  dependency-version: 1.0.104
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: arc-swap
  dependency-version: 1.9.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: arrayvec
  dependency-version: 0.7.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: async-compression
  dependency-version: 0.4.43
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: async-trait
  dependency-version: 0.1.92
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: atoi
  dependency-version: 3.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
- dependency-name: aws-lc-rs
  dependency-version: 1.18.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
- dependency-name: bitvec
  dependency-version: 1.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
- dependency-name: bstr
  dependency-version: 1.13.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
- dependency-name: bytes
  dependency-version: 1.12.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
- dependency-name: clap
  dependency-version: 4.6.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: clap_complete
  dependency-version: 4.6.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: crc32fast
  dependency-version: 1.5.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: data-encoding
  dependency-version: 2.11.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: feed-rs
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
- dependency-name: futures
  dependency-version: 0.3.34
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: http
  dependency-version: 1.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
- dependency-name: humantime
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
- dependency-name: libc
  dependency-version: 0.2.189
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: lru
  dependency-version: 0.18.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: memchr
  dependency-version: 2.8.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: memmap2
  dependency-version: 0.9.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: open
  dependency-version: 5.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: openssl
  dependency-version: 0.10.81
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: rand
  dependency-version: 0.10.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: regex
  dependency-version: 1.13.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
- dependency-name: serde
  dependency-version: 1.0.229
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: serde_derive
  dependency-version: 1.0.229
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: serde_json
  dependency-version: 1.0.151
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: serde_with
  dependency-version: 3.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
- dependency-name: socket2
  dependency-version: 0.6.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: thiserror
  dependency-version: 2.0.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: tokio
  dependency-version: 1.53.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
- dependency-name: tokio-stream
  dependency-version: 0.1.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: tokio-util
  dependency-version: 0.7.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-minor-patch
- dependency-name: uuid
  dependency-version: 1.26.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: cargo-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump pollster from 0.4.0 to 1.0.1 (#60)

Bumps [pollster](https://github.com/zesterer/pollster) from 0.4.0 to 1.0.1.
- [Changelog](https://github.com/zesterer/pollster/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zesterer/pollster/commits)

---
updated-dependencies:
- dependency-name: pollster
  dependency-version: 1.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump itertools from 0.14.0 to 0.15.0 (#62)

Bumps [itertools](https://github.com/rust-itertools/itertools) from 0.14.0 to 0.15.0.
- [Changelog](https://github.com/rust-itertools/itertools/blob/master/CHANGELOG.md)
- [Commits](rust-itertools/itertools@v0.14.0...v0.15.0)

---
updated-dependencies:
- dependency-name: itertools
  dependency-version: 0.15.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump base64 from 0.22.1 to 0.23.1 (#63)

Bumps [base64](https://github.com/marshallpierce/rust-base64) from 0.22.1 to 0.23.1.
- [Changelog](https://github.com/marshallpierce/rust-base64/blob/master/RELEASE-NOTES.md)
- [Commits](marshallpierce/rust-base64@v0.22.1...v0.23.1)

---
updated-dependencies:
- dependency-name: base64
  dependency-version: 0.23.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump quick-xml from 0.40.1 to 0.41.0 (#59)

Bumps [quick-xml](https://github.com/tafia/quick-xml) from 0.40.1 to 0.41.0.
- [Release notes](https://github.com/tafia/quick-xml/releases)
- [Changelog](https://github.com/tafia/quick-xml/blob/master/Changelog.md)
- [Commits](tafia/quick-xml@v0.40.1...v0.41.0)

---
updated-dependencies:
- dependency-name: quick-xml
  dependency-version: 0.41.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump tower-http from 0.6.11 to 0.7.0 (#61)

Bumps [tower-http](https://github.com/tower-rs/tower-http) from 0.6.11 to 0.7.0.
- [Release notes](https://github.com/tower-rs/tower-http/releases)
- [Commits](tower-rs/tower-http@tower-http-0.6.11...tower-http-0.7.0)

---
updated-dependencies:
- dependency-name: tower-http
  dependency-version: 0.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump sha1 from 0.10.6 to 0.11.0 in /benchv2 (#54)

Bumps [sha1](https://github.com/RustCrypto/hashes) from 0.10.6 to 0.11.0.
- [Commits](RustCrypto/hashes@sha1-v0.10.6...sha1-v0.11.0)

---
updated-dependencies:
- dependency-name: sha1
  dependency-version: 0.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(release): v0.1.0-rc.1

Bump rtbit to 0.1.0-rc.1 and add RELEASE_NOTES_v0.1.0-rc.1.md ahead of
cutting the first 0.1.0 release candidate. Headlines since beta.3: the
qBittorrent WebUI API v2 parity expansion (19->64 endpoints), the security
fixes (parse_duration->humantime, quinn-proto, web UI + benchv2 deps), and
the dev -> main -> tag promotion pipeline.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bk5yAWYouGDBjrJVsv9hKV

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: thedancingdeveloper <306930456+thedancingdeveloper@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant