The project's README from github.com/anmolkapil/plexo. As one markdown file: README.md.
Plexo is a download manager for Windows, macOS, and Linux that downloads one file over several internet connections at the same time. If your computer has Wi-Fi and a phone tethered over USB, Plexo uses both for the same download. It handles direct links, magnet links, and .torrent files, with a queue, a downloads list, and speed and data limits for each network.
https://github.com/user-attachments/assets/e57728f4-fb63-441f-839c-174eef954b17
Get the installer for your computer from getplexo.app, or pick a file from GitHub Releases. Builds are available for macOS (Apple silicon and Intel), Windows 10 and 11 (x64 and ARM64), and Linux (AppImage and .deb, x86_64 and ARM64).
The Mac app is signed with an Apple Developer ID (see Credits) and notarized by Apple, so it opens like any other app. On Windows, the first launch needs one extra step: when it shows "Windows protected your PC", click More info, then Run anyway. The installer isn't code-signed yet.
Plexo updates itself after that: new versions download in the background and install when you restart.
Plexo splits each download across every network you select, so a second connection adds to your speed instead of sitting idle.
.torrent files: paste a link or open a file in Plexo. You can also open a .torrent with Plexo from your file manager, and on macOS and Linux, a magnet link from your browser. Plexo never makes itself the default over a torrent client you already have.en0. You can rename and recolor them.Plexo adds speed only when each network reaches the internet through its own connection. Wi-Fi from your home router plus a phone tethered over USB works. Wi-Fi and Ethernet plugged into the same router doesn't: both share the router's single connection, so the total stays the same.
Plexo can only use a connection your operating system shows as a network adapter. Two setups need an extra step:
gpedit.msc), go to Computer Configuration › Administrative Templates › Network › Windows Connection Manager, and set Minimize the number of simultaneous connections to the Internet or a Windows domain to DisabledOn Windows, install your phone maker's driver if the phone doesn't appear in Network Settings. An adapter appearing in Plexo doesn't guarantee it reaches the internet: VPN, virtual, and isolated adapters show up too. Check each network's latency and speed in Plexo.
The menu in the header filters the list to All downloads, In progress, Finished, or Needs attention. Click a download's name to see its progress in detail.
Tick downloads to select them, or use Select all for the filtered list. The header then shows each action with how many of the selected downloads it applies to:
Cancel and Move to Trash ask you to confirm first.
Open Speed & data limits… from the networks menu. Changes apply as you make them.
Under All downloads, set the total speed limit, the Slow mode speed, and how many downloads run at once. While Slow mode is on, its speed replaces the total limit, and per-network limits still apply.
Choose a network to set its speed limit in KB/s or MB/s, and its data allowance in GB per Day, Week, or Month. The allowance counts what Plexo downloads on that network, torrents included; uploads and other apps don't count. Days reset at midnight, weeks on Monday, and months on the 1st, all in your local time, and usage is kept across restarts.
Two buttons manage a network's limits, and both ask you to confirm:
Open Networks → Speed & data limits… → All downloads and find Download schedule. Enable the schedule, choose start and stop times in your computer’s local time, pick repeat days, and optionally set an end date. For a free-data window from midnight to 7 AM, use 00:00 and 07:00.
Outside those hours, new downloads and downloads you resume wait in the queue. At the stop time, active downloads and torrent uploads stop, keeping progress for the next window. Downloads you pause yourself stay paused. Scheduled work survives restarting Plexo; when the end date passes, it stays waiting until you change or disable the schedule. Disabling the schedule lets the queue start immediately.
For a window crossing midnight, repeat days and the end date refer to the day it starts. Keep Plexo running and the computer awake for the scheduled start; Plexo keeps the computer awake while downloading, but does not wake a sleeping computer. Checking links and fetching magnet metadata when adding downloads can still use data outside the scheduled hours. The schedule controls Plexo’s transfers, not other apps or Plexo’s update check.
Your operating system sends all of a computer's traffic through one default connection and leaves the others idle. Plexo opens its own connections on each network you select, and downloads different parts of the file on each.
┌── Wi-Fi (192.168.1.40) ──────┐
│ │
File ──→ Split ─────┼── Ethernet (10.0.0.12) ──────┼──→ Assembled file
│ │
└── USB tether (172.20.10.3) ──┘
It needs no virtual adapter, VPN, kernel extension, or administrator rights.
Most servers can send any slice of a file on request. A request with Range: bytes=8388608-16777215 gets back bytes 8 MB to 16 MB with status 206 Partial Content. Plexo first asks for a single byte. A 206 answer proves the server supports ranges and tells Plexo the file's size, name, and version (ETag and Last-Modified). A server that ignores ranges gets an ordinary single-stream download.
Each stream connects from one network's own address, so its traffic goes out through that network. On Linux, Plexo also pins the socket to the network device.
https.request({
hostname: 'releases.ubuntu.com',
path: '/ubuntu-26.04.1-desktop-amd64.iso',
localAddress: '172.20.10.3', // the USB tether's address
headers: { Range: 'bytes=8388608-16777215' }
})
Splitting a file into equal halves, one per network, makes the download only as fast as the slower network. Plexo cuts the file into blocks of up to 8 MB instead, and puts them all in one queue:
8 MB keeps the queue balanced between mismatched networks, and caps what a failed stream throws away. Small files get smaller blocks, never under 1 MB, so every stream has at least two.
Each block is written straight to its place in <filename>.plexo, a staging file next to the destination. When every block is in, Plexo renames it to the final name, picking a numbered name if that one is taken. The destination needs room for one copy of the file.
Plexo runs torrents with WebTorrent and opens every peer connection from one network's address. To keep every peer on a network Plexo chose, it turns off the parts that would connect on their own: uTP, WebRTC, web seeds, UPnP and NAT-PMP port mapping, and local peer discovery. Peers are found through HTTP/UDP trackers and the DHT. Torrents that are v2-only aren't supported yet.
Pausing closes every connection and keeps the staging file plus a small progress record in Plexo's app data. Resuming asks the server for the file's ETag and Last-Modified again. If they match, each block continues from the last saved byte. If they don't, the file changed on the server, and Plexo refuses to resume instead of joining two versions into a corrupt file.
macOS has no driver for RNDIS (Remote Network Driver Interface Specification), the protocol Android's USB tethering uses. The phone charges, but no network adapter appears. TetherKit is an open-source driver that runs without a kernel extension and adds one.
Install TetherKit:
brew install XiaoMiku01/tap/tetherkit
Connect your phone over USB.
On the phone, open Settings › Network & internet › Hotspot & tethering and turn on USB tethering.
Open Plexo. The phone appears in the networks list.
Thanks to @XiaoMiku01 for building and open-sourcing TetherKit.
You need Node.js 22.12 or later and npm 9 or later.
git clone https://github.com/anmolkapil/plexo.git
cd plexo
npm install
npm run dev
Run the end-to-end tests with Playwright. CONTRIBUTING.md covers the options and debugging flags.
npm run test:e2e:smoke # smoke tests
npm run test:e2e # the full suite
Package the app for each platform:
npm run build:mac writes dist/mac/Plexo.app. A build made on your own Mac isn't quarantined, so it opens without the first-launch step.npm run build:win, from PowerShell, writes the installer to dist/. For an app you run without installing, use npm run build:unpack and open dist/win-unpacked/plexo.exe.npm run build:linux writes the AppImage and .deb packages to dist/Local builds are unsigned.
Contributions are welcome, from download engine work to testing Plexo on new network setups. Areas that need help:
See CONTRIBUTING.md for setup, code style, and how to open a pull request.
Electron, React 19, TypeScript, Tailwind CSS v4, Base UI, Zustand, WebTorrent, and Lucide icons. electron-vite builds it, electron-builder packages it, and Playwright tests it.
If Plexo is useful to you:
Plexo is developed by Anmol Kapil.
macOS code signing is provided by Dhananjay Bhosale: the Mac app is signed with his Apple Developer ID, so macOS shows his name as its developer.
MIT. See LICENSE.