id = "qbittorrent-cli"
name = "qBittorrent CLI"
homepage = "https://github.com/ludviglundgren/qbittorrent-cli"
description = "Command-line interface to manage qBittorrent."
executables = ["qbt"]
[dotfiles]
paths = ["[configHome]/qbt/.qbt.toml"]
exclude = []
secret = []
[[dotfiles.secret_paths]]
file = "[configHome]/qbt/.qbt.toml"
format = "toml"
match = { key_path = ["qbittorrent.apikey", "qbittorrent.password"] }
[commands]
format = 1
label = "qBittorrent CLI"
description = "Add torrents and list torrents in a running qBittorrent. Connection settings come from the config file."
quality = "ai-draft"
parser = { end_of_options = "--", interleave = "permute", long_equals = true, short_attached = true, short_bundles = false }
[[commands.subcommand]]
path = ["torrent", "add"]
label = "Add torrents"
description = "Add torrent files or magnet links. Glob patterns work for files."
[[commands.subcommand.source]]
id = "help"
kind = "help"
url = "https://ludviglundgren.github.io/qbittorrent-cli/commands/qbt_torrent_add/"
revision = "2026-10-27"
evidence = """
Add new torrent(s) to qBittorrent from file or magnet. Supports glob pattern for files like: ./files/*.torrent
qbt torrent add [flags]
qbt torrent add my-file.torrent --category test --tags tag1
qbt torrent add ./files/*.torrent --paused --skip-hash-check
qbt torrent add magnet:?xt=urn:btih:5dee65101db281ac9c46344cd6b175cdcad53426&dn=download
--category string Add torrent to the specified category
--dry-run Run without doing anything
--first-last-piece Prioritize first and last pieces for preview
--paused Add torrent in paused state
--recheck Force recheck after adding (useful when using --paused)
--save-path string Add torrent to the specified path
--sequential Download torrent pieces in sequential order
--skip-hash-check Skip hash check
--tags stringArray Add tags to torrent
-q, --quiet suppress output
"""
[[commands.subcommand.field]]
id = "sources"
label = "Torrent files or magnet links"
type = "string"
position = 0
multiple = true
sources = ["help"]
[[commands.subcommand.field]]
id = "category"
label = "Category"
type = "string"
option = ["--category"]
sources = ["help"]
[[commands.subcommand.field]]
id = "tags"
label = "Tags"
type = "string"
option = ["--tags"]
multiple = true
sources = ["help"]
[[commands.subcommand.field]]
id = "save_path"
label = "Save path"
type = "path"
option = ["--save-path"]
path = { kind = "directory", role = "output", must_exist = false }
sources = ["help"]
[[commands.subcommand.field]]
id = "paused"
label = "Add paused"
type = "boolean"
option = ["--paused"]
sources = ["help"]
[[commands.subcommand.field]]
id = "skip_hash_check"
label = "Skip hash check"
type = "boolean"
option = ["--skip-hash-check"]
sources = ["help"]
[[commands.subcommand.field]]
id = "sequential"
label = "Sequential download"
type = "boolean"
option = ["--sequential"]
sources = ["help"]
[[commands.subcommand.field]]
id = "dry_run"
label = "Dry run"
type = "boolean"
option = ["--dry-run"]
sources = ["help"]
[[commands.subcommand.field]]
id = "quiet"
label = "Quiet"
type = "boolean"
option = ["--quiet", "-q"]
sources = ["help"]
[[commands.subcommand.task]]
id = "add"
label = "Add torrents"
fields = ["sources", "category", "tags", "save_path", "paused"]
required = ["sources"]
[[commands.subcommand.task]]
id = "add-paused"
label = "Add paused, skip hash check"
set = { paused = [true], skip_hash_check = [true] }
fields = ["sources", "paused", "skip_hash_check", "category"]
required = ["sources"]
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["sources", "category", "tags", "save_path", "paused"]
[[commands.subcommand.group]]
id = "advanced"
label = "Advanced"
fields = ["skip_hash_check", "sequential", "dry_run", "quiet"]
[[commands.subcommand]]
path = ["torrent", "list"]
label = "List torrents"
description = "List torrents, filtered by state, category, tag or hashes."
[[commands.subcommand.source]]
id = "help"
kind = "help"
url = "https://ludviglundgren.github.io/qbittorrent-cli/commands/qbt_torrent_list/"
revision = "2026-10-27"
evidence = """
qbt torrent list [flags]
qbt torrent list --filter=downloading --category=linux-iso
-c, --category string Filter by category. All categories by default.
-f, --filter string Filter by state. Available filters: all, downloading, seeding, completed, paused, active, inactive, resumed,
stalled, stalled_uploading, stalled_downloading, errored (default "all")
--hashes strings Filter by hashes. Separated by comma: "hash1,hash2".
--output string Print as [formatted text (default), json]
-t, --tag string Filter by tag. Single tag: tag1
"""
[[commands.subcommand.field]]
id = "filter"
label = "State filter"
type = "enum"
option = ["--filter", "-f"]
choices = [
{ value = "all", label = "All" },
{ value = "downloading", label = "Downloading" },
{ value = "seeding", label = "Seeding" },
{ value = "completed", label = "Completed" },
{ value = "paused", label = "Paused" },
{ value = "active", label = "Active" },
{ value = "inactive", label = "Inactive" },
{ value = "resumed", label = "Resumed" },
{ value = "stalled", label = "Stalled" },
{ value = "stalled_uploading", label = "Stalled uploading" },
{ value = "stalled_downloading", label = "Stalled downloading" },
{ value = "errored", label = "Errored" },
]
sources = ["help"]
[[commands.subcommand.field]]
id = "category"
label = "Category"
type = "string"
option = ["--category", "-c"]
sources = ["help"]
[[commands.subcommand.field]]
id = "tag"
label = "Tag"
type = "string"
option = ["--tag", "-t"]
sources = ["help"]
[[commands.subcommand.field]]
id = "hashes"
label = "Hashes"
description = "Comma-separated: hash1,hash2."
type = "string"
option = ["--hashes"]
sources = ["help"]
[[commands.subcommand.field]]
id = "output"
label = "Output format"
type = "enum"
option = ["--output"]
choices = [{ value = "json", label = "JSON" }]
sources = ["help"]
[[commands.subcommand.task]]
id = "list"
label = "List by state"
fields = ["filter", "category", "tag"]
required = []
[[commands.subcommand.task]]
id = "json"
label = "List as JSON"
set = { output = ["json"] }
lock = ["output"]
fields = ["filter", "category", "tag", "hashes", "output"]
required = []
[[commands.subcommand.group]]
id = "basic"
label = "Basic"
fields = ["filter", "category", "tag"]
[[commands.subcommand.group]]
id = "advanced"
label = "Advanced"
fields = ["hashes", "output"]