In this episode we'll connect aria2 with the world around it: building a personal download center with AriaNg and browser extensions, interoperating with other download tools, and automating checksum verification and file moves for large downloads on servers.

In episode 20 aria2 stood as a production daemon — but a lonely daemon is a half-useful daemon. This episode 21 connects it to the ecosystem: the AriaNg web UI as the control screen, browser extensions as the URL entry point, interoperability with other download tools, and modern server workflows — checksum verification and automatic file moves. By the end of the episode you'll have a complete personal download center.
AriaNg is a modern web UI that talks to the daemon over RPC. It isn't a server — it's a client that shows status, queue, and download options in one page. Because it's purely static, you can run it from anywhere: opened directly as a file, served by nginx, or already bundled in the wappjzdstar/aria2 image from episode 20.
The complete workflow becomes:
Notice the division of roles: aria2 does the work, AriaNg displays it. Understanding this boundary matters — when the UI doesn't show something, the problem is almost always the RPC connection or the secret, not the daemon.
Tip
AriaNg only needs an RPC address and secret to connect: http://localhost:6800/jsonrpc with the secret token:RAHASIA. If AriaNg shows a connection error, check the secret first, then the port 6800 firewall — these two causes cover nearly all cases.
The most practical way to use a download center: when you find a file in the browser, click one button and the URL is sent straight to the daemon. That's how extensions like Aria2 Explorer on Chrome and Chromium, and similar extensions on Firefox, work — they intercept the browser's downloads and forward them to RPC.
The payoff is big: the browser no longer handles large files that can drop when the laptop sleeps, and the always-on daemon finishes the job. For users who dislike extensions, the alternative is simple — paste the URL into AriaNg manually, or write it to an input file:
printf '%s\n' \
"https://cdn.example.com/dataset.zip" \
"https://mirror.example.com/os.iso" > /tmp/queue.txt
aria2c -i /tmp/queue.txt --dir=/srv/downloadsThe input file from episode 6 becomes an interoperable format: you can build a URL list from scripts, spreadsheets, or bookmarks, and the daemon consumes it as-is.
aria2 is often the engine behind other tools. Motrix, for example, is a desktop download manager built on top of aria2 — you open its GUI for convenience, while the engine underneath is still aria2. This is a valuable pattern: the interface may change; the engine stays the same.
Conversely, if you're moving from another tool, URL lists can usually be exported and imported:
| Tool | How to join aria2 |
|---|---|
| wget or curl | URLs taken from history or scripts, put into an input file |
| GUI download manager | Link lists exported as text, then aria2c -i |
| yt-dlp | Directed to use aria2 as its downloader (see the next section) |
| Motrix | Already aria2-based — RPC can be pointed directly |
--input-file is the bridge format: almost every tool can produce a text URL list, and aria2 accepts it unchanged.
The most common real-world scenario: research datasets, distro mirrors, or large videos must be downloaded on a server — not a laptop. The principles are the same as since episode 1, plus two disciplines: verification and automatic moves.
Large files from the internet almost always come with a checksum published by the source. aria2 can verify it natively as soon as the download finishes:
aria2c --checksum=sha-256=4d5f...9a1c \
https://cdn.example.com/dataset.zipThe format is sha-256=HASH. If the verification result doesn't match, the download is considered failed and aria2 exits with code 32 (from episode 18). This is the best safety net for files that will feed a pipeline — far better than discovering corruption mid-process.
After the file lands and is verified, it must move to its final place. Combine verification with the --on-download-complete hook from episode 18 into one script:
#!/usr/bin/env bash
GID="$1"
NUM_FILES="$2"
FILE_PATH="$3"
DEST="/srv/data/datasets"
if sha256sum --status -c "sha256sums.txt"; then
mv "$FILE_PATH" "$DEST/"
echo "$(date +%F_%T) OK: $GID -> $DEST" >> /var/log/dataset.log
else
echo "$(date +%F_%T) GAGAL: $GID" >&2
fiThis flow mimics how big repositories like Linux distros manage mirrors: download, verify, then move to the location other users consume. Unverified files never reach their consumers' hands.
For mirrors updated periodically, schedule the script with cron. The script follows the same pattern as episode 18 — reading exit codes and printing logs — only now it runs every day:
0 2 * * * /opt/mirror/sync.sh >> /var/log/mirror.log 2>&1At 02:00 every day, the server checks the URL list, downloads what changed, verifies checksums, moves the final files, and records everything to the log. No one needs to wait or remember. For videos from streaming platforms, remember that aria2 can't parse web pages — that's where yt-dlp comes in, which we'll compare in episode 22.
Episode 21 connected aria2 with its ecosystem: building a personal download center with AriaNg and browser extensions, using the input file as an interoperability bridge with other tools, and automating large server download workflows with checksum verification and file moves.
The key takeaway: a download isn't the goal — it's a stage in a workflow. A file that lands unverified and without a destination is just garbage on the disk; a verified and automatically moved file is an asset the next pipeline can consume.
In episode 22 — the final episode — we'll close out the whole journey: alternative ecosystems and final reflection across 23 episodes of Learn Aria2. See you then!