plexo README

The project's README from github.com/anmolkapil/plexo. As one markdown file: README.md.

Plexo

Sponsor

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

Download Plexo

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.

What Plexo does

Plexo splits each download across every network you select, so a second connection adds to your speed instead of sitting idle.

Direct downloads

Torrents

Queue and downloads list

Limits and networks

Set up more than one network

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:

On 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.

Manage your downloads

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.

Set speed and data limits

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:

Schedule overnight downloads

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.

How Plexo combines networks

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.

Direct downloads use HTTP range requests

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' }
})

Streams share one queue of blocks

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:

  1. Each stream takes the next block in the queue, fetches it, then takes another. It keeps its connection to the server open between blocks, so it connects only once.
  2. A faster network finishes its blocks sooner and takes more of them. If a network slows down or drops, the others keep draining the queue.
  3. Once the queue is empty, a free stream can race a block that another stream is fetching too slowly. The first to finish wins. The streams table marks the racing stream BACKUP.

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.

Torrents pin each peer to a network

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.

Resuming checks the file hasn't changed

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.

Use an Android phone over USB on macOS

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.

  1. Install TetherKit:

    brew install XiaoMiku01/tap/tetherkit
    
  2. Connect your phone over USB.

  3. On the phone, open Settings › Network & internet › Hotspot & tethering and turn on USB tethering.

  4. Open Plexo. The phone appears in the networks list.

Thanks to @XiaoMiku01 for building and open-sourcing TetherKit.

Build Plexo from source

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:

Local builds are unsigned.

Contributing

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.

Built with

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.

Support Plexo

If Plexo is useful to you:

Credits

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.

License

MIT. See LICENSE.

plexo (anmolkapil/plexo)

downloader
Searching Database…

4.6K ·GitHub
What is this?Plexo is a desktop download manager for Windows, macOS, and Linux that speeds up a single download by pulling it over multiple network connections at once, like Wi-Fi plus a phone tethered over USB, instead of letting the extra connection sit idle.
How is this different from a regular download manager or just using my browser?A normal download uses whatever single connection your OS picks as default and leaves other adapters idle. Plexo opens its own connections on each network you choose and splits the file into blocks fetched in parallel across all of them, so a second connection actually adds speed.
How do I get it running?Download the installer for your OS from getplexo.app or from GitHub Releases - builds exist for macOS (Apple Silicon and Intel), Windows 10/11 (x64 and ARM64), and Linux (AppImage and .deb, x86_64 and ARM64). After that Plexo updates itself in the background.
Do I actually need two separate internet connections for it to help?Yes - Plexo only gains speed when each network you select reaches the internet through its own separate connection, like home Wi-Fi plus a USB-tethered phone. Two adapters sharing the same router (e.g. Wi-Fi and Ethernet on the same router) won't add any speed.
Any install pitfalls or features that don't fully work yet?The Windows installer isn't code-signed yet, so on first launch you'll see a 'Windows protected your PC' warning and need to click 'More info' then 'Run anyway'. Torrents that are v2-only also aren't supported yet.
Can I limit how much speed or data Plexo uses on each network?Yes - you can set a total speed limit, per-network speed limits in KB/s or MB/s, a one-click Slow mode, and daily/weekly/monthly data allowances per network; Plexo stops using a network once its allowance runs out.
Can downloads be scheduled to run only overnight?Yes - under Speed & data limits you can enable a Download schedule with start/stop times, repeat days, and an optional end date, for example a free-data window from midnight to 7 AM.
How do I use my Android phone's USB tethering as a second network on macOS?macOS has no built-in driver for Android's RNDIS USB tethering, so you need to install the open-source TetherKit driver first; after that, turning on USB tethering on the phone makes it appear as a network in Plexo.
What happens if a server throttles or blocks some of the extra connections?If a server returns errors like 403, 429, or 503 to some streams, that network drops to however many streams the server accepted and gets one more stream back each minute.
Creator
anmolkapil
Size
2.9 MB
Stars
4.6K
Age
1mo
Commits · 90 Days