When the engine starts, drop completed/stopped task records from the session. On-disk files for stopped torrent tasks are preserved (the librqbit orphan-purge step is told to keep files for those info-hashes); HTTP/FTP/etc. payloads on disk are never touched
Stalled-transfer threshold in bytes/s. If the EMA stays below this for lowest-speed-limit-timeout, the worker is aborted (and restarted when auto-retry is enabled). 0 disables the watchdog
lowest-speed-limit-timeout
30
How many seconds the transfer must stay below lowest-speed-limit before it is considered stalled
uri-selector
feedback
Mirror selection strategy when a task has multiple URIs: feedback (drop slow/failing mirrors), inorder (try left-to-right), or adaptive (prefer fastest)
A separate watchdog from lowest-speed-limit. The renderer's EngineClient
samples active task speeds, and any task whose downloadSpeed stays under
low-speed-threshold for 3 consecutive polling ticks is force-paused and
resumed (with a 30-second per-task cooldown between recovery cycles).
Key
Default
Description
auto-detect-low-speed-tasks
false
Master switch. When false, the recovery loop never runs
low-speed-threshold
20
Speed threshold in KB/s below which a task counts toward the strike count
Pause/resume only revives a single stalled TCP connection — useful for
HTTP/HTTPS, FTP/SFTP, and HTTP-segment streams (m3u8, YouTube). Peer-swarm
protocols (BitTorrent, ED2K, ADC, Gnutella, G2, giFT) are explicitly
excluded from this recovery: pause tears down peer connections, aborts
in-flight tracker announces and choke negotiations, and the swarm spends
minutes warming up again. Tasks whose kind is not in
{http, ftp, youtube, m3u8}, or whose kind is missing, are skipped.
Disk reservation strategy. falloc reserves real blocks via fallocate(2) (Linux) or fcntl(F_PREALLOCATE) (macOS), falling back to set_len. trunc only sets the file length. none lets writes grow the file as needed. The aria2 alias prealloc is accepted as a synonym for falloc
auto-file-renaming
true
When the target output file already exists, append .1, .2, … instead of overwriting
remote-time
false
Stamp the local file mtime from the server's Last-Modified header on completion (per-task)
use-remote-file-time
—
UI/global preference mirrored into per-task remote-time when set
m3u8-output-format
ts
Container produced after concatenating HLS segments (ts keeps the original transport stream; other values trigger a remux)
file-category-dirs
—
Per-category default directory overrides (object keyed by category id, e.g. { "video": "/downloads/video" }); applied as a fallback when no routing rule matches
Seed until manually stopped (overrides seed-time / seed-ratio)
seed-ratio
0
Stop seeding at this ratio (0 = no ratio limit)
seed-time
0
Seed for this many minutes after completing (0 = no time limit)
bt-tracker
—
Additional tracker URLs (comma-separated)
bt-max-peers-per-torrent
100
Max concurrent peer connections per torrent (engine restart)
bt-max-outstanding-per-peer
128
Max pipelined chunk requests per peer (engine restart)
bt-enable-upnp
true
Map the listen port on the router via UPnP IGD (engine restart)
bt-upnp-lease
300
UPnP mapping lease in seconds (engine restart)
bt-enable-lsd
true
BEP-14 Local Service Discovery via multicast (engine restart)
bt-encryption-policy
prefer
MSE/PE policy: plaintext, prefer, or require (engine restart)
bt-listen-v6
false
Also bind an IPv6 TCP listener on the same port (engine restart)
bt-create-subfolder
true
When true, multi-file torrents and magnets are placed under <dir>/<name>/. When false, files are written directly into dir. Single-file torrents are unaffected. Read on each task add (no restart needed); accepted as a per-task option override
The DHT (BEP-5) is always enabled and runs as a dual-stack client when an
IPv6 socket can be bound. The BitTorrent listener uses an ephemeral port; the
legacy aria2 keys listen-port, dht-listen-port, enable-dht,
enable-dht6, enable-peer-exchange, and bt-enable-lpd are accepted for
backwards compatibility but currently have no effect.
See the RSS Feeds guide for the full workflow. RSS subscriptions, items, and rules are persisted via the desktop app's storage; the keys below are user-level UI preferences.
Key
Default
Description
rss-auto-update
—
Enable periodic feed polling (boolean; controlled from the RSS panel)
rss-update-interval
—
Polling interval in minutes between automatic refreshes
Array of { id, label, pattern, dir, enabled } rules. The first enabled rule whose case-insensitive glob pattern matches the inferred filename wins; dir overrides the download directory and label is exposed as the task tag. Falls through to file-category-dirs then global dir
Run a script after every download finishes (success or failure). Per-task overrides are accepted via the desktop app's task options. See the Completion Scripts guide.
Key
Default
Description
completion-script-enabled
false
Master switch. When false, no script runs even if command is set
completion-script-command
—
Absolute path to the executable to invoke (no shell parsing)
completion-script-args
—
Whitespace-tokenised arguments template. Supported placeholders inside any token: {path} (final file path), {hash} (task GID), {status} (complete / error / cancelled). The same values are also exported as RISUKO_PATH, RISUKO_HASH, RISUKO_STATUS env vars
completion-script-timeout-ms
30000
Per-invocation timeout in milliseconds. Clamped to 1000–300000 (5 minutes). stdout/stderr captured into the log are truncated to 8 KiB
Non-secret credential profile metadata (id, label, scope, username). Passwords and SSH private keys are stored separately in the OS keychain (risuko-credentials service) and never written to user.json
By default the desktop app boots an embedded engine in-process. Switch to
External Engine mode to point the UI at a separately running
risuko-cli serve (or any aria2-compatible RPC server). When enabled, the
embedded engine is not started; all add_uri, polling, and config writes
are routed over JSON-RPC.
Key
Default
Description
external-engine-enabled
false
Skip the embedded engine and connect to a remote RPC server instead
The following keys are read once when the engine starts. Changing them at
runtime is accepted (the value is persisted) but does not take effect
until the engine is restarted (Quit & relaunch the desktop app, or restart
risuko serve):