Hank's Android Torrent Downloader
A plain, complete BitTorrent client for your phone — the libtorrent engine, a live transfer list, background downloads, and every proxy, seeding and rate-limit setting exposed instead of hidden. Free, no ads, no account, no tracking.
tech.hankelsner.torrent · sideloaded APK, not a Play Store listing · built and signed on hankelsner.tech
A transfer tool, and nothing else stapled on
Add a torrent three ways
- Paste a magnet link, or tap a
magnet:link in any other app and choose this one. - Open a .torrent file from your device.
- Give it a .torrent URL and it fetches the file itself.
There is no search box and no index inside the app. You bring the link.
A live transfer list
- Name, state and a progress bar with the percent.
- Download and upload speed, updating as it runs.
- Seeds and peers, total size, and an ETA.
One screen. What is happening is on it.
Per-torrent controls
- Pause and resume.
- Force recheck the files on disk against the torrent.
- Sequential download toggle, per torrent.
- Copy magnet link back out.
- Remove — optionally deleting the downloaded files with it.
Removing without deleting leaves your files exactly where they are.
Keeps running with the screen off
Transfers run in a foreground service with a persistent notification showing the combined download and upload speed, so Android does not quietly stop them when you lock the phone.
The notification is how Android requires a background transfer to announce itself; it is not dismissible while the engine is running.
The engine
libtorrent4j 2.1.0-39 — the Java binding around the same libtorrent C++ engine that qBittorrent and LibreTorrent are built on. Native libraries ship for arm64-v8a, armeabi-v7a and x86_64. Minimum Android 7.0 (minSdk 24).
Every option on this page is a real libtorrent setting the app passes through, not a decorative switch.
What using it looks like
The panels below are drawn in HTML and CSS on this page as an illustration of the interface. They are mock-ups, not screenshots, and the numbers in them are made up.
-
Paste a magnet link
Tap +, pick Add magnet, and paste. Or tap a
magnet:link anywhere else on the phone and choose this app from the share sheet — the same dialog opens with the link already filled in.Add torrentmagnetMagnet linkmagnet:?xt=urn:btih:<infohash>&dn=debian-13-netinst.iso&tr=udp://tracker.example:6969Save to/storage/emulated/0/Download/torrentsCancelAddA .torrent file or a .torrent URL goes in through the same + menu.
-
Watch it run
The list is the app. Each row carries the name, the state, a progress bar and percent, both speeds, seeds and peers, the size, and the ETA — refreshed while you watch.
Transfers↓ 4.8 MB/s ↑ 612 KB/sdebian-13.0.0-amd64-netinst.isoDownloading63.4%blender-open-movie-project-4k.tarChecking18.0%nasa-apollo-public-domain-archive.zipPaused41.9%ubuntu-24.04.3-live-server-amd64.isoSeeding100% -
Work on one transfer
Tap a row for its actions: pause or resume it, force a recheck against the files on disk, flip sequential download on for that torrent, copy its magnet link back out, or remove it — with or without deleting what it downloaded.
debian-13.0.0-amd64-netinst.isoDownloading63.4%PauseForce recheckSequential: offCopy magnetRemoveRemove + delete filesSequential download writes the pieces in order — useful when you want the head of a large file usable early. It usually costs some speed.
-
Lock the phone; it keeps going
The engine runs as a foreground service. Its notification shows the combined speeds, and tapping it comes straight back to the transfer list.
Torrent Downloader4 transfers · ↓ 4.8 MB/s ↑ 612 KB/s -
Set it up the way you want it
Settings is where the engine is exposed: proxy, seeding rules, rate limits, network conditions, protocol toggles, listen port and the save folder. The full reference is in the next section.
Wi-Fi only (pause on mobile data)Download rate limit2048 KB/sUpload rate limit256 KB/sStop after completionSeed until ratio2.00Protocol encryptionrequireForce proxy (anonymous mode)
Every setting, and what it actually changes
These are libtorrent settings passed through to the session. Wide tables scroll sideways inside their own box.
| Setting | Values | What it does |
|---|---|---|
| Proxy type | none · SOCKS4 · SOCKS5 · SOCKS5 with auth · HTTP · HTTP with auth | Which kind of proxy the session speaks. The two "with auth" variants are the ones that send the username and password. |
| Host | hostname or IP | Address of the proxy server. |
| Port | 1–65535 | Port on the proxy server. |
| Username | text | Sent only by the SOCKS5-with-auth and HTTP-with-auth types. |
| Password | text | Sent only by the SOCKS5-with-auth and HTTP-with-auth types. |
| Proxy peer connections | on / off | Send peer traffic through the proxy as well as everything else. |
| Proxy tracker connections | on / off | Send tracker announces through the proxy. |
| Resolve hostnames through the proxy | on / off | Hand names to the proxy to look up instead of resolving them on the device. |
| Force proxy (anonymous mode) | on / off | Refuse to make any connection that would bypass the proxy. If the proxy is unreachable, nothing connects. |
| Setting | Values | What it does |
|---|---|---|
| Stop after completion | on / off | Do not seed once a download finishes. |
| Seed until ratio | ratio | Stop seeding a torrent once it has uploaded this multiple of its size. |
| Seed time limit | minutes | Stop seeding a torrent after this long. |
| Shut down when finished | on / off | Shut the engine down once every download has finished. |
| Setting | Values | What it does |
|---|---|---|
| Download rate limit | KB/s · 0 = unlimited | Ceiling on total download speed across all transfers. |
| Upload rate limit | KB/s · 0 = unlimited | Ceiling on total upload speed across all transfers. |
| Max active downloads | count | How many torrents may download at once; the rest queue. |
| Max connections | count | Ceiling on simultaneous peer connections for the whole session. |
| Setting | Values | What it does |
|---|---|---|
| Wi-Fi only | on / off | Pause transfers whenever the phone is on mobile data, and resume on Wi-Fi. |
| Pause below battery percentage | percent | Pause transfers once the battery drops under this level. |
| Setting | Values | What it does |
|---|---|---|
| Start torrents paused | on / off | Newly added torrents wait for you to press resume. |
| Sequential download by default | on / off | New torrents start in sequential mode. Still togglable per torrent afterwards. |
| Setting | Values | What it does |
|---|---|---|
| Protocol encryption | prefer · require · disable | Whether peer connections are encrypted. require refuses unencrypted peers; prefer takes them if that is all there is. |
| DHT | on / off | The distributed hash table — finds peers without a tracker. |
| Local peer discovery (LSD) | on / off | Find peers for the same torrent on the local network. |
| UPnP | on / off | Ask the router to map the listen port automatically. |
| NAT-PMP | on / off | The other automatic port-mapping protocol, for routers that speak it. |
| uTP | on / off | BitTorrent's transport over UDP, which yields to other traffic on the link. |
| Listen port | fixed port · random | Pin the incoming port to a number you choose, or let the app pick a random one each session. |
| Setting | Values | What it does |
|---|---|---|
| Save folder | folder chooser | Where downloaded files are written. Picked with the system folder chooser. |
If a setting is not on this page, the app does not have it.
Sideloading the APK
- Check the phone runs Android 7.0 or newer.
- Download the APK on the phone: torrent-latest.apk.
- Android will ask to allow installs from this source. On Android 8 and newer that is a per-app permission — Settings → Apps → your browser or file manager → Install unknown apps → Allow. On Android 7 it is the single Unknown sources switch under Security.
- Open the downloaded APK and confirm the install.
- Grant notification permission when asked, so the transfer notification can be shown on Android 13 and newer.
This is a sideloaded build, not a Play Store listing, so it does not update itself — come back here for a newer APK. Installing over the existing app keeps your settings and transfers; uninstalling does not delete files you already downloaded.
A file-transfer tool
BitTorrent is how Linux distributions ship their ISOs, how games hand out multi-gigabyte patches, and how research datasets and public-domain archives get moved without one server paying for every copy. That is the job this app does: it moves a file you already have a link to.
Use it for content you have the right to download. The app has no built-in search, no index, no catalogue, and no bundled content of any kind — it cannot find anything for you, and nothing ships inside it. You supply the magnet link, the .torrent file, or the URL; the app transfers what that points at. What you point it at is yours to answer for.
It is free, has no ads and needs no account. There is no analytics and no telemetry: the app does not report what you download, when you use it, or that you use it at all. Your transfer traffic goes to the trackers and peers of the torrents you add, and to a proxy if you configure one.
One exception, stated plainly: crash reports. If the app crashes, it saves the error and sends that one report, automatically, the next time you open it. It goes to this site’s own server (download.hankelsner.tech) and nowhere else — it is private, it is not published, and it does not go to Google or any third-party crash service. It exists so a crash on a real device can actually be found and fixed instead of guessed at.
A crash report contains only: the error and where in the code it happened, the app’s version, your device model, your Android version and its processor type. It contains nothing about what you were downloading — no torrent names, no magnet links, no file names, no addresses, no account and no location. The same note is in the app under Settings → About → Crash reports, and the report is shown to you in full the next time you open the app, with a button to copy it.
A proxy is only as private as the proxy. "Force proxy (anonymous mode)" makes the app refuse connections that would bypass it, which is the honest version of that promise — it is not a claim that the app hides you by itself.