A fast BitTorrent client with a Node.js CLI and an anacrolix-powered Go engine.
- Torrent files & magnet links — download from
.torrentfiles or resolvemagnet:links. - Mature BitTorrent engine — anacrolix provides TCP/uTP peers, trackers, DHT, PEX, inbound connections, end-game behavior, and piece verification.
- Bandwidth utilization — concurrent peer requests and upload reciprocity keep healthy swarms productive without seeding after completion.
- Pause & resume — partial files are checked and resumed; legacy
.torl.statefiles are retained during migration. - NAT traversal — automatic port mapping is enabled where the network supports it.
- Interactive TUI — running
torlopens a dashboard where downloads can be added, monitored, paused, and resumed; incomplete items are restored as paused on the next launch. - Multiple downloads — queue or run several torrents and magnet links concurrently.
- Fully tested — fast, deterministic mock tests for the peer wire protocol, trackers, DHT, and NAT.
Install or update to the latest published version from npm:
npm install --global torl-client@latestCheck the installed version with torl-cli --version.
Or clone and install locally:
git clone https://github.com/mibienpanjoe/torL.git
cd torL
npm installThe torl command opens the TUI; the underlying TUI and download-engine binary (torl-tui) is downloaded automatically during npm install for your platform from the matching GitHub release. If a prebuilt binary is not available, building from source requires Go 1.25.13 or newer.
Running torl without arguments opens the interactive dashboard:
torlFrom there, paste a magnet link, type a .torrent path, or browse for a torrent file. Positional inputs remain available as a faster way to preload one or more downloads:
# preload a single torrent
torl debian-13.6.0-amd64-netinst.iso.torrent
# preload several inputs
torl a.torrent b.torrent "magnet:?xt=urn:btih:..."
# override the output directory
torl file.torrent -o ~/Downloads
# override the path to the downloader backend
torl file.torrent -torl-path ./bin/torl-cli.jsInside the TUI:
aopens a field for pasting a magnet link or entering a.torrentpath.fopens the integrated.torrentfile picker.ochanges the output directory for downloads added afterward.↑/↓select a torrent.ptoggles pause/resume for the selected torrent.qorCtrl+Cpauses all active downloads and exits.Esccloses the active input or picker without changing anything.- Incomplete downloads are remembered in the TUI queue (
~/.config/torl/queue.jsonon Linux; the platform user config dir elsewhere) and reappear as Paused next launch — presspto resume. - Partial files remain in the output directory and are verified when the download resumes. Older
.torl.statefiles are left untouched for rollback compatibility.
For scripts or headless environments, use torl-cli instead of the TUI.
torl-cli <torrent-file|magnet-link>... [options] -o, --output <dir> Output directory (default: Downloads)
-c, --concurrency <n> Max simultaneous downloads (default: 1)
-q, --quiet Suppress progress output
-h, --help Show help
-v, --version Show version
Download a single torrent:
torl-cli debian-13.6.0-amd64-netinst.iso.torrentDownload from a magnet link:
torl-cli "magnet:?xt=urn:btih:...&dn=example"Download multiple torrents concurrently:
torl-cli a.torrent b.torrent "magnet:?xt=urn:btih:..." -c 3Output is written to a directory named after the torrent inside the output directory.
Starting with v1.4.0, torl-cli delegates each torrent to the bundled
torl-tui binary's headless anacrolix engine. The public commands and flags do
not change: Node.js continues to coordinate multiple inputs while Go handles
peer discovery, piece scheduling, verification, disk I/O, inbound peers, and
upload reciprocity.
Progress is measured from useful payload bytes and sampled once per second.
The JSON stream keeps its existing fields and additively reports uploaded,
downloadRate, and uploadRate. torL uploads while a download is active but
exits when it completes; it does not remain running as a seeder.
During the v1.4.0 canary release only, set TORL_DOWNLOAD_ENGINE=node to use
the previous downloader if the new engine causes a compatibility problem:
TORL_DOWNLOAD_ENGINE=node torl-cli file.torrentThis rollback switch is temporary. It does not delete partial files or legacy
.torl.state files.
Run the test suite:
npm testRun the Go engine and TUI tests (Go 1.25.13+):
cd tui
go test ./...Run a single test file:
npm test -- tests/download.test.jsBuild the TUI binary from source:
npm run build-tuiSee CONTRIBUTING.md for setup, conventions, and how to submit changes.
MIT. Distributed binaries also contain third-party components; see THIRD_PARTY_NOTICES.md.
Built with anacrolix/torrent for the BitTorrent engine, bencode for the temporary Node rollback engine, and Bubble Tea for the TUI.

