Download one file from several mirrors at once, after checking that they all serve the same file.
MirrorDL can also continue unfinished downloads that Firefox or aria2 left behind. It runs on Windows 10 and 11, as a window app and as a terminal program.
-
All links at once. Each link gets several connections. Faster links keep taking over work from slower ones until the end.
-
Finds the best number of connections by itself. It adds connections to a link as long as they make the whole download faster, and stops where the server or your internet line is the limit, at most 16 per link. Nothing to set.
-
Checks the links first. Links with a different size are skipped. MirrorDL also compares 64 KB pieces from several places in the file across all links and skips links whose content differs, so you never get a file stitched together from two different versions.
-
Continues unfinished downloads, also ones from other programs:
- Firefox
.partfiles, including Firefox's random names (setup.Ab3-xY_z.exe.part) - aria2 downloads: reads the
.aria2control file to find the missing pieces - its own downloads, even after a crash or a power cut
- several unfinished files of the same download at once, also under other names: it puts together what they hold and downloads only the rest
Before continuing, it compares what is already on disk with the links. A file that doesn't match is never changed. Continuing reads only the progress file and a few pieces, not the whole file, so even a 50 GB download goes on right away.
- Firefox
-
Verifies the result against a checksum (MD5, SHA-1, SHA-256, SHA-384 or SHA-512) if you paste one with the links.
-
Shows the details: percent, downloaded and remaining size, current and average speed, time spent and left, connections, a line per link, and a map of which parts of the file are done.
-
Copes with real servers: retries dropped connections, uses fewer connections on servers that allow only a few, and saves the progress every 10 seconds and when you pause or close the window.
The window app from the Microsoft Store, which installs it and keeps it up to date:
or in a terminal: winget install 9P94PN403J5W
Or from the latest release:
MirrorDL-win-x64.zip is the window app, mirrordl-terminal-win-x64.zip the terminal program.
Unzip and start; nothing gets installed.
They need Windows 10 (1809 or newer) or Windows 11, 64-bit, and the .NET 10 Runtime. The window app brings the Windows App SDK along.
Updates: the Store version gets them from the Store. The window app from the zip tells you when a newer release is out, with a link to it. It asks GitHub once at start and sends nothing else (privacy policy).
Start MirrorDL.exe, paste the links (one per line), and press Start.
- Paste a checksum into the same box to have the file checked at the end.
- Drag links, a folder (where to save) or an unfinished file (to continue it) onto the window.
- Pause saves the progress. Closing the window during a download does the same. Press Start again later to continue.
MirrorDL.exe --start <links…> fills in the links and starts at once.
mirrordl asks you to paste the links
mirrordl "https://a/file.iso" "https://b/file.iso" -o D:\Downloads
mirrordl links.txt
mirrordl "C:\Users\me\Downloads\file.Ab12-xYz.iso.part" "https://a/file.iso"
| Option | Meaning |
|---|---|
-o <folder> |
where to save (default: Downloads, or next to the unfinished file) |
-c <n> |
at most n connections in total (default: no limit) |
-m <n> |
at most n connections per link (default: 16) |
Ctrl+C pauses. Run the same command again to continue.
MirrorDL looks in the save folder for an unfinished download of the same file. You can also choose one yourself.
- Firefox saves
name.Ab12-xYz.ext.partand an emptyname.extnext to it. MirrorDL continues the.partfile and puts the finished file in place of the empty one. Pause the download in Firefox or close Firefox first. Don't cancel it in Firefox: that deletes the.partfile. - aria2 writes pieces all over the file, so the file size says nothing about how much is done.
MirrorDL reads the
.aria2file to find the missing pieces. Stop aria2 first.
A file you choose keeps its name and folder, also when the links give another name. Only a .part
file gets its final name once it is done.
If the file you choose is complete already, MirrorDL only checks it: against the links, and against the checksum if you paste one. It doesn't write to it, rename it or move it. That makes it a quick way to check a finished download. If the links can't send parts of the file and you paste no checksum, only its size can be checked, and MirrorDL says so.
Browsers download a file from the start to the end, so of two Firefox .part files of the same
download the bigger one already holds everything the smaller one has. aria2 and MirrorDL download
pieces all over the file, so their unfinished files can hold different parts. MirrorDL uses them all:
- It finds the unfinished files of the download in the save folder, also numbered copies like
name(1).ext.part. Files under other names you add yourself (several at once: one per line in Continue, or drop them on the window). - It compares each one with the links. A different file is left as it is.
- The one holding the most is continued; what the others hold beyond it is copied into it. Copying on the disk is much faster than downloading.
- Only the rest is downloaded. Once the finished file checks out, the other unfinished files go to the Recycle Bin, with their progress files.
What "checks out" means: the download finished with the right size, and the file matches the checksum you pasted, or, without one, the links at every piece compared before. A file is only removed if it was found to be this download, hasn't changed since, and no other program has it open. If anything fails, a download stops, is paused or comes out damaged, nothing is removed.
Only unfinished downloads are removed: .part files, and files with a .aria2 or .mirrordl
progress file. Any other file you added stays, since it may be one of your own.
MirrorDL only moves them to the Recycle Bin. Windows deletes a file that doesn't fit in the Recycle Bin for good, without asking, so MirrorDL keeps such a file where it is and tells you. (Should Windows still delete one for good, MirrorDL says so too.) The Recycle Bin of a drive holds a few percent of it at first. For big downloads, make it bigger: right-click it, Properties, Custom size.
A file from aria2 or MirrorDL needs its progress file (.aria2 or .mirrordl) next to it, since
only that tells which parts are downloaded. Without it, MirrorDL doesn't use the file.
- Direct download links only (HTTP and HTTPS). Pages that need a login, cookies or a captcha before the download starts won't work.
- The servers must support range requests to use more than one connection and to resume. For servers that don't, MirrorDL falls back to one connection.
Needs the .NET 10 SDK. Open MirrorDL.slnx in Visual Studio, or:
.\build.ps1
This builds both programs into publish\app and publish\terminal and zips them.
In VS Code (with the recommended extensions it offers): Ctrl+Shift+B builds, F5 starts the window app or the terminal program in the debugger, and Terminal > Run Task has the unit tests, the end-to-end test, the release zips and the Store package.
| Project | What it is |
|---|---|
MirrorDL.Core |
the downloader: link checks, segmented download, resume formats |
MirrorDL.App |
the window app (WinUI 3) |
MirrorDL |
the terminal program |
tests/MirrorDL.Tests |
unit tests |
dotnet test --project tests/MirrorDL.Tests/MirrorDL.Tests.csproj
pwsh tools/e2e-test.ps1 -Exe MirrorDL/bin/Debug/net10.0/win-x64/mirrordl.exe
The end-to-end test starts local test mirrors (tools/testserver.py, which needs Python) that are
slow, drop connections, limit connections, serve another file or ignore range requests, downloads
from them, and checks every result by its SHA-256. With aria2 installed, it also continues a
download that aria2 started.
Releases are automatic. Once CI has passed on a push to main, the commit messages since the last
release decide, written as Conventional Commits: fix: makes
a patch release, feat: a minor one, feat!: a major one, and docs:, test:, ci: and the like
release nothing. Neither does any commit that changes nothing that goes into the program (docs,
tests, tools, workflows). The release gets the zips, and the Microsoft Store gets the same version
(how that is set up). Each release's page shows where it is, GitHub and
the Store, and a failing step opens an issue (more).
Copyright (C) 2026 Nawid Salehie
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See LICENSE.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Additional permission under GNU GPL version 3 section 7: If you modify this program, or any covered work, by linking or combining it with the Windows App SDK (or a modified version of that library), containing parts covered by the terms of the Microsoft Software License Terms for the Windows App SDK, the licensors of this program grant you additional permission to convey the resulting work.

