Your Old Phone Can Download Torrents All Night

In the previous article in this series, we turned a 2015 Xiaomi Redmi 2 into a video download server: you type a YouTube link, the phone downloads the video while you do something else. This guide takes the same phone one step further — a proper torrent download machine that runs 24/7, sips a couple of megabytes of RAM, and keeps downloading while you sleep.

Why torrents? Because not everything is on YouTube. Linux ISO images, open-source software, and many legally shared media files use BitTorrent because it is free to host. Instead of keeping your main computer on overnight to grab a 6 GB file, the phone does it: it drew a measured 2 MB of RAM and about a fifth of one CPU core while downloading at 3.8 MB/s.

This guide assumes postmarketOS is already on the phone. If it is not, start with the first article in the series, which walks through flashing it from scratch.

What You Need

  • An old Android phone running postmarketOS (see the first article in this series)
  • The phone on your home Wi-Fi
  • A way to run commands on the phone (terminal app or SSH from your computer)
  • A torrent file for something you are allowed to download — this guide uses the official Ubuntu 26.04 ISO

Install Transmission

Transmission is a small, friendly BitTorrent client that ships as a daemon — a program that runs in the background with no screen. On postmarketOS, which is based on Alpine Linux, it installs with one command:

sudo apk add transmission-daemon transmission-cli

The transmission-daemon package is the server itself, and transmission-cli adds a command-line client for testing. Unlike the cron daemon in the earlier download-server article, Transmission ships with its own systemd service unit, so no hand-written service file is needed:

# Check that the service unit is available
systemctl list-unit-files | grep transmission

You should see transmission-daemon.service. Good. Next, start it once so it generates its default configuration:

sudo systemctl start transmission-daemon

The First Gotcha: Where the Config Lives

The configuration file is not where you might expect. Transmission runs as a user called transmission whose home directory is /var/lib/transmission, so the settings file lives at:

/var/lib/transmission/.config/transmission-daemon/settings.json

Many tutorials and even parts of the official docs assume /var/lib/transmission/settings.json. On current Alpine packages the file is one level deeper — check it yourself:

ls -la /var/lib/transmission/.config/transmission-daemon/

You should see settings.json in there. Now look at the three values we need to change:

sudo grep -E '"(download-dir|rpc-whitelist|rpc-port|peer-port)"' \
  /var/lib/transmission/.config/transmission-daemon/settings.json

On the real phone, the defaults were:

Setting Default What it means
download-dir /var/lib/transmission/Downloads Where finished files land
rpc-port 9091 The web interface port
peer-port 51413 The port for talking to other torrent peers
rpc-whitelist 127.0.0.1,::1 Who may open the web interface (local only)

Two things need to change: the download folder, and the whitelist (otherwise only the phone itself can open the web page). Stop the daemon first — Transmission rewrites its settings file when it exits, which would clobber our edits:

sudo systemctl stop transmission-daemon

Create the download folder and hand it to the transmission user:

sudo mkdir -p /home/user/Downloads/torrents
sudo chown -R transmission:transmission /home/user/Downloads/torrents

Then point the settings at it and allow your home network to reach the web interface:

sudo sed -i 's|"download-dir": "[^"]*"|"download-dir": "/home/user/Downloads/torrents"|' \
  /var/lib/transmission/.config/transmission-daemon/settings.json

sudo sed -i 's|"rpc-whitelist": "[^"]*"|"rpc-whitelist": "127.0.0.1,::1,192.168.*.*"|' \
  /var/lib/transmission/.config/transmission-daemon/settings.json

Replace 192.168.*.* with your own network range if it is different. Verify the changes stuck:

sudo grep -E '"(download-dir|rpc-whitelist)"' \
  /var/lib/transmission/.config/transmission-daemon/settings.json

Both lines should now show the new values.

Open the Firewall

postmarketOS ships a default nftables firewall that drops everything except SSH, DNS, and DHCP. The web interface on port 9091 and the peer port 51413 are blocked until you add rules. The firewall loads every file from /etc/nftables.d/, so create a new rule file there:

sudo sh -c 'printf "table inet filter {\n    chain input {\n        iifname \"wlan*\" tcp dport 9091 accept comment \"accept Transmission Web UI on wlan\"\n        iifname \"wlan*\" tcp dport 51413 accept comment \"accept Transmission peer TCP on wlan\"\n        iifname \"wlan*\" udp dport 51413 accept comment \"accept Transmission peer UDP on wlan\"\n    }\n}\n" > /etc/nftables.d/50_transmission.nft'

The iifname "wlan*" prefix keeps these ports reachable from your Wi-Fi only, which is exactly what you want. Reload the firewall:

sudo systemctl restart nftables

If you want to double-check the rule syntax before restarting, this command checks without loading:

sudo nft -c -f /etc/nftables.d/50_transmission.nft

Turn It On at Boot

Start the daemon now and make it start on every boot:

sudo systemctl enable --now transmission-daemon

You should see a symlink created into multi-user.target.wants — that is the "start at boot" registration. Check the service is alive:

systemctl status transmission-daemon --no-pager | head -8

On the real phone: Active: active (running), about 2 MB of memory.

Use the Web Interface

Transmission includes a web interface, so no app is needed. On any device on your home network, open:

http://192.168.1.50:9091

(Use your phone's real address — find it with ip addr show wlan0.) The browser should show the Transmission web page. From here you can add torrents, watch progress, and pause anything anytime.

To add a download: click the open-folder button (Add Torrent), pick a .torrent file from your computer, and press Upload. The download starts immediately.

For a first test, grab an official torrent from a project you trust — the Ubuntu ISO torrent is a classic:

# On your computer or the phone
curl -sO https://releases.ubuntu.com/26.04/ubuntu-26.04-desktop-amd64.iso.torrent

Real Performance Numbers

Here is what the Redmi 2 measured while downloading the 6.5 GB Ubuntu ISO:

Metric Measured on Redmi 2 (2015)
Download speed 3.8 MB/s
Downloaded after adding the torrent 907 MB in minutes
Transmission memory 1.8 MB (peak 2.6 MB)
CPU usage while downloading about 18% of one core
System RAM still free while downloading 1.2 GB
Full download size 6.5 GB

The 3.8 MB/s is about 30 Mbps, which is roughly the practical ceiling of the phone's 2.4 GHz Wi-Fi radio — the same bottleneck we hit with the web server. A dedicated machine with gigabit Ethernet would download faster, but for overnight batch downloads the phone is entirely sufficient. Whole 6 GB ISO files land in /home/user/Downloads/torrents/, ready to copy over the network with sftp or Syncthing.

The Other Gotcha: No Command-Line Remote

Transmission traditionally ships a command-line tool called transmission-remote for scripting and quick checks. On current postmarketOS/Alpine packages, it is not there: the transmission-cli package only contains an older transmission-cli binary, and a package called transmission-base turns out to contain nothing but icons. Confirm for yourself:

apk info -L transmission-cli

So how do you check the download state without the web page open? The web interface talks to a JSON API on the same port, and you can call it directly with curl. The API needs a session ID, which it hands out in response to the first request:

SID=$(curl -s http://127.0.0.1:9091/transmission/rpc | grep -o 'X-Transmission-Session-Id: [^<]*' | cut -d' ' -f3)
BODY='{"method":"session-stats"}'
curl -s -H "X-Transmission-Session-Id: $SID" -d "$BODY" http://127.0.0.1:9091/transmission/rpc

On the real phone this returned "downloadSpeed":3989504 — that is bytes per second, about 3.8 MB/s — and "activeTorrentCount":1. Not as pretty as the web page, but useful if you want to script a "did it finish yet?" check.

FAQ

Is it legal to download torrents?

Torrenting is a file-transfer technology, not a crime by itself. What matters is the content: downloading copyrighted movies or software without permission is illegal in most countries. Linux ISOs, open-source software, and public-domain media are freely and legally shared by torrent — the Ubuntu ISO used in this guide is the official, sanctioned channel. Stick to legitimate torrents and you are fine.

Can a 2015 phone really handle a 6.5 GB download?

Yes — this guide's whole point. The phone downloaded 907 MB at 3.8 MB/s minutes after the torrent was added, using under 3 MB of RAM. The bottleneck is the old 2.4 GHz Wi-Fi radio, not the CPU. A large download takes a few hours instead of a few minutes, but the phone does not care; that is the beauty of a 24/7 machine.

Will this break my web server or video downloader?

No. Transmission, nginx, and the yt-dlp scripts are separate services with separate configs. The web server article ran alongside this setup with the whole system still using well under 1 GB of RAM.

Can I reach the web interface from outside my house?

Not directly — and you should not open ports on your router for it. Use a private network tool like Tailscale instead; it gives you encrypted access to the web interface from anywhere without exposing the phone to the internet.

Where do downloaded files go?

Whatever you set in download-dir — here, /home/user/Downloads/torrents/. Copy files off the phone over the network with sftp, or set up Syncthing for automatic syncing.

Next Steps

All code in this article was tested and runs successfully on a real Xiaomi Redmi 2 (model 2014813, 2GB RAM) running postmarketOS v25.12 with kernel 6.12.1 — verified August 2026. The full chain was executed on the physical device: package installation (apk add transmission-daemon transmission-cli), the configuration generated at /var/lib/transmission/.config/transmission-daemon/settings.json, the sed edits for download-dir and rpc-whitelist, the nftables rule file /etc/nftables.d/50_transmission.nft with firewall restart (rule syntax checked with nft -c before loading), boot enablement (systemctl enable --now), the web interface reached from a second computer over Wi-Fi (HTTP 301 redirect to the web UI), and a real Ubuntu 26.04 ISO torrent added from the web interface: 907 MB downloaded at 3.8 MB/s, daemon memory 1.8 MB (peak 2.6 MB), ~18% CPU while downloading, and the file landing in /home/user/Downloads/torrents/.