Home/Blog

Braid: One Download, Every Network You Have

Braid splits one download across Wi-Fi, Ethernet and your phone's 5G at once, hashes every chunk as it lands, and survives a crash without losing the file. Free software for macOS, Windows and Linux, with an Android companion.

Braid: One Download, Every Network You Have

Braid: One Download, Every Network You Have

Most desks have more internet than they use. A laptop on Wi-Fi with an Ethernet dongle in the drawer, a phone with a 5G plan sitting next to it, sometimes a second connection for backup. A big download still goes down exactly one of them, because that is what the operating system's routing table picks, and a typical download manager opens its eight connections down that same road.

So we built Braid, a download manager that splits one file across every network path you have, and Braid for Android, which lends your phone's mobile data to it. The desktop app is free software under GPL-3.0, for macOS, Windows and Linux. Braid 0.1.0 beta and Braid for Android 0.1.1 are out today.

dl add https://releases.ubuntu.com/26.04/ubuntu-26.04-desktop-amd64.iso \
  --all-interfaces --verify sha256:9d3f...

More connections is not more paths

"Segmented" or "accelerated" downloading has been around for twenty years. It opens several HTTP range requests to the same server and runs them in parallel. That helps when one TCP connection cannot fill your link, and does nothing when the link itself is full.

Braid binds each connection to a specific network interface: IP_BOUND_IF on macOS, SO_BINDTODEVICE on Linux, IP_UNICAST_IF on Windows. A connection bound to your phone's tether leaves by your phone's tether, whatever the routing table would have preferred. Three interfaces become three independent roads to the server, and their bandwidth adds up.

The scheduler does not assume which road is fastest. It measures. Chunks go to whichever path is fastest right now, a slow link gets fewer of them, a link that dies has its chunks moved to the others, and a cap you set on a metered link is a ceiling rather than a suggestion. The bar under each transfer is split by interface, so you can see what each path actually carried. A link contributing nothing is visibly contributing nothing.

We also show which binding mechanism is really in force. If an interface falls back to a plain source-address bind, the Network settings say so, because that fall back quietly turns "aggregation" into extra connections over one route.

Your phone is the second network most people have

The obvious extra path is the phone in your pocket. Plain USB tethering already works with Braid, the phone just shows up as another network card. But most people's phones are on the same Wi-Fi as their laptop, and that is not a second path at all: it goes out through the same router.

Braid for Android fixes that. It runs a small proxy on the phone, and every request Braid sends names the network it must use and carries a key from pairing. The phone sends it out exactly that network, or answers that it cannot. It never falls back to another one, because a "5G" lane that quietly went over Wi-Fi is the one lie the desktop could not detect.

Pairing is a code on the screen. Press Add phone in Braid, point the phone at it, check the name, tap Add. The phone appears in the sidebar with its own speed. If you also switch on the phone's Wi-Fi lane while it shares your network, Braid compares the public address each path leaves from, spots the duplicate, and marks it Not used instead of pretending.

The phone stays in charge of its own data plan. Nothing is shared until you switch a network on, there is an optional limit per session, and the notification always shows what has been used. The app is 511 KiB with no native code, so one APK runs on every Android phone from 8.0 up.

A download manager should never hand you a wrong file

Speed is the headline. Correctness took most of the work.

Every chunk is hashed with BLAKE3 as it lands. A bad chunk is fetched again on its own, so corruption costs 10 MiB, not a restart of a 6 GiB download. The storage layer rests on one ordering rule:

Chunk data is made durable before the journal claims the chunk.

Swap those two steps and a power cut leaves a journal that says "done" for bytes that never reached the disk. Resume trusts it, and you get a file that looks complete and is not. Braid's three durability modes (Safe, Balanced, Fast) only change how often that pair happens, never its order. A looser mode costs more re-downloading after a crash, never correctness. The test suite proves it rather than assuming it: one test SIGKILLs the CLI at a chosen byte offset and checks the resumed file's hash and that it re-downloaded only a bounded amount, and a fault-injecting file type simulates a drive that lies about fsync.

Braid also refuses the server behaviours that quietly produce a wrong file:

  • a server that advertises Range support and then sends the whole body
  • a 200 where a 206 was asked for, which means the resource changed
  • a gzipped response to a ranged request, where offsets would address compressed bytes
  • a login page served with a plausible Content-Length

Each one is a scenario in a test server that misbehaves on purpose. You can run it yourself with dl dev scenarios.

And the rest of what a download manager needs

Braid speaks BitTorrent: magnet links and .torrent files in the same list, with per-file progress, peers and seeding, under the same limits and schedule. It is a client, not an index, with no search and no bundled tracker list.

Pre-signed links from cloud storage are re-resolved before they expire. Sixteen connections hitting an expired link produce one refresh, not sixteen. Bandwidth limits follow a weekly schedule you paint on a grid, and a change reaches the transfers already running. Every package ships dl, the same engine on the command line, and Ctrl-C there pauses rather than kills.

The desktop app is Rust with a Slint interface: 15.5 MiB on macOS, with 507 tests.

What we have not verified

We build and use Braid on a Mac. CI builds and tests the Windows and Linux versions, but nobody has sat in front of a Windows desktop and used the MSI, and Windows binding follows Microsoft's documentation rather than an experiment on a two-NIC machine. Braid for Android has been run on one phone and one carrier: a Pixel 7 Pro on Jio, which is IPv6-only. The docs keep that list current. If you have a Windows or Linux machine, installing Braid and telling us what happens is the most useful contribution there is.

Try it

  • Braid, with a live simulation of the scheduler you can break
  • Braid for Android, the phone companion
  • The docs: install, pairing a phone, the dl command, building both apps

Braid is GPL-3.0. Braid for Android is source-available under PolyForm Noncommercial: free for any noncommercial use, and talk to us about anything else.