- Go 96.2%
- Nix 3.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| cmd/qbit-bridge | ||
| docs | ||
| internal | ||
| nix | ||
| .envrc | ||
| .gitignore | ||
| flake.lock | ||
| flake.nix | ||
| go.mod | ||
| go.sum | ||
| HANDOVER.md | ||
| README.md | ||
| renovate.json | ||
qbit-bridge
A qBittorrent Web API shim that sits between *arr apps (Sonarr, Radarr, …)
and a qBittorrent running on a remote seedbox. It proxies the API calls
*arr makes, pulls completed torrents to the local host over SFTP
(replacing sshfs / syncthing / rclone-mount), and rewrites /torrents/info
so *arr sees one honest progress bar covering both the seedbox
download and the seedbox→local transfer. No more "100% on seedbox,
missing locally" gap.
Single-operator, single-seedbox tool. No web UI, no multi-user support.
Quick start
Add this flake as an input in your NixOS config:
# flake.nix of your system config
{
inputs.qbit-bridge.url = "git+https://git.matt.you/matt/qbit-bridge";
inputs.qbit-bridge.inputs.nixpkgs.follows = "nixpkgs";
# ...
}
Enable the service on the host that will run the shim:
# host module
{
imports = [ inputs.qbit-bridge.nixosModules.default ];
services.qbit-bridge = {
enable = true;
upstreamUrl = "https://seedbox.example.com/qbittorrent";
seedbox = {
host = "seedbox.example.com";
user = "matt";
identityFile = "/run/secrets/qbit-bridge-ssh-key"; # sops-nix / whatever
};
outputDir = "/mnt/media/downloads";
};
}
Point *arr at http://127.0.0.1:46881 instead of the seedbox directly.
Enter any username/password — the shim accepts anything and forwards to
upstream using upstreamUrl. See docs/configuration.md
for the full option reference, *arr-side setup, and troubleshooting.
Outputs
packages.${system}.default— the shim binary.nixosModules.default— the NixOS module. Auto-wires the package; just setservices.qbit-bridge.enable = true.checks.${system}.tests— runs the Go unit suite undernix flake check.
Local dev
nix develop
go test -race ./...
Integration test (requires Docker or Podman):
# with podman:
export DOCKER_HOST=unix:///run/user/$(id -u)/podman/podman.sock
export TESTCONTAINERS_RYUK_DISABLED=true
go test -tags=integration -race ./internal/integration/...
Design
docs/specs/2026-04-19-internals.md— spec.docs/plans/2026-04-19-implementation.md— implementation plan.docs/configuration.md— operator reference.