Fast, cross-platform and reliable multipart downloader with UI for MacOS, Linux and Windows
C#
46
900 commits
updated Oct 4, 2026
A fast, reliable, cross-platform download manager with a clean desktop UI for Windows, macOS and Linux. It splits each file into multiple connections for maximum speed, lets you pause and resume any time, and organizes your downloads with queues and a scheduler — all in a simple interface anyone can use.
Built with Avalonia UI on .NET and powered by the Downloader engine.
.m3u8 streams → a single playable video via the HLS plugin). Multi-part downloads show live "Part 3/10" progress and an "Assembling…" step, and resume where they left off after a restart.ollama.com link or just type a model name like gemma3:12b, download it at full multi-connection speed, then click Add to Ollama to install it into your local Ollama in one step (checksum-verified). Ships built-in, together with the GitHub Releases plugin (paste github.com/owner/repo → get the latest release for your OS).
The app is fully self-contained — every release ships with everything it needs bundled in, so there are no prerequisites to install (no .NET runtime, no FFmpeg, no extra libraries).
macOS (Homebrew):
brew tap bezzad/tap && brew install --cask downloader
This installs Downloader.app into your Applications folder — open it from Launchpad, Spotlight (⌘-Space → "Downloader"), or Finder like any other app.
- Recent Homebrew versions ask you to trust a third-party tap before installing. If you see that prompt, run
brew trust bezzad/tap(or setHOMEBREW_NO_REQUIRE_TAP_TRUST=1) and re-run the install.- The app isn't notarized yet. The Homebrew cask removes the quarantine flag automatically on install, so it should launch normally — you do not need to run
xattrby hand. If macOS still blocks the first launch, right-click Downloader in Applications → Open, or runxattr -dr com.apple.quarantine "/Applications/Downloader.app".
Linux (Snap) — recommended; auto-updates via the Snap Store:
sudo snap install downloader
Installs from the Snap Store and keeps itself up to date automatically. If
snapisn't available on your distro, use the install script below or Manual download.
Linux (script) — downloads the latest release and adds a menu entry + icon:
curl -fsSL https://raw.githubusercontent.com/bezzad/Downloader.Desktop/main/scripts/install.sh | bash
Debian / Ubuntu (APT) — apt install + updates via apt upgrade:
curl -fsSL https://bezzad.github.io/Downloader.Desktop/apt/pubkey.gpg \
| sudo gpg --dearmor -o /usr/share/keyrings/downloader.gpg
echo "deb [signed-by=/usr/share/keyrings/downloader.gpg] https://bezzad.github.io/Downloader.Desktop/apt stable main" \
| sudo tee /etc/apt/sources.list.d/downloader.list
sudo apt update && sudo apt install downloader
Or grab the
.debfrom a release and runsudo apt install ./Downloader_*_amd64.deb. See packaging/apt.
Arch Linux (AUR):
yay -S downloader-bin
Windows (winget):
winget install bezzad.Downloader --source winget
This installs the portable app and puts Downloader on your PATH — launch it from the Start menu or a terminal. Update later with winget upgrade bezzad.Downloader.
--source wingetis recommended: it tells winget to look only in the community package repository, which is where this app lives. Without it, winget also queries the Microsoft Store source, and if that source is unreachable it stops and asks you to pick a source instead of installing.- The short form
winget install downloader --source wingetalso works, via the package's moniker.- Seeing
SSL Error: ... failed to check revocation statusorSSL invalid CAfor themsstoresource? That's your network or machine (a corporate TLS proxy, VPN, or a blocked certificate-revocation check), not the package —--source wingetavoids it entirely.
Windows (script) — downloads the latest release, adds a Start-menu shortcut, and puts Downloader on your PATH. Run in PowerShell:
iex (irm https://raw.githubusercontent.com/bezzad/Downloader.Desktop/main/scripts/install.ps1)
Downloader-osx-*.tar.gz and drag Downloader.app into your Applications folder, then launch it from Launchpad/Spotlight.Downloader executable. That's it.The version number is shown under Settings → About and increases automatically with every release. With Settings → Check for updates automatically on, the app downloads a newer release in the background, then shows an “Update Downloader” button at the bottom of the left menu plus a system notification. Click it (or just close the app) to install — it restarts into the new version. Snap builds update through the Snap Store instead, so the in-app updater is disabled there.
First launch on an unsigned build: Windows SmartScreen → More info → Run anyway; macOS Gatekeeper → right-click → Open (or
xattr -dr com.apple.quarantine <app>).
Ctrl+N). In the dialog you can choose the save folder, optionally set a name, and pick a queue. To add several at once, paste multiple links (one per line).Esc to close).Your downloads list and settings are saved automatically. Config file location:
~/.config/Downloader/config.json~/Library/Application Support/Downloader/config.json%APPDATA%\Downloader\config.jsonPlugins teach the app to turn links that aren't direct file URLs into real downloads — just copy & paste the link, the plugin does the rest. Download HLS .m3u8 video streams as one playable file, pull AI models straight into Ollama, or fetch the right GitHub release for your OS — all at full multi-connection speed, with pause/resume and live per-part progress.
| Plugin | What it does | How it works |
|---|---|---|
| HLS video streams | Downloads raw HLS .m3u8 streams — you get one normal, playable video file. | Paste an .m3u8 link. For a master playlist the plugin lets you pick the quality; it then downloads all the segments in parallel and assembles them into a single file. FFmpeg is fetched automatically on first use. Optional — add it once under Settings → Plugins → More plugins. |
| Video sites | Gets the video behind a page on YouTube, X, Instagram, TikTok, Vimeo and other video sites, in the quality you pick. | Send the page from the browser extension (recommended — it passes your signed-in browser session, which some videos need), or paste the page link. The plugin uses the third-party tool yt-dlp to find the video, and FFmpeg to join video and audio. Both are fetched and checksum-verified on first use. Optional — add it once under Settings → Plugins → More plugins. |
| Website offline copy | Saves a web page — or a whole site — as one .zip you can read offline: pages, styles, images, scripts and fonts, with links rewired to work from disk. | Paste a page link and pick “Offline copy (.zip)” in the Add window. The plugin crawls the page (and same-site pages it links to), grabs everything the pages need, and packs it all into a single zip — no extra tools. Optional — add it once under Settings → Plugins → More plugins. |
| Ollama models | Downloads AI models for Ollama at full speed, then installs them locally in one click. | Paste an ollama.com model link — or just type a name like gemma3:12b — and download. When it finishes, click Add to Ollama: the model is checksum-verified and registered in your local Ollama, ready to run. Built-in. |
| GitHub Releases | Turns a GitHub repository link into a download of its latest release, picking the right asset for your operating system. | Paste github.com/owner/repo (no digging through the Releases page) — the plugin looks up the newest release and downloads the asset that matches your OS. Built-in. |
Note: the Downloader app itself does not download from video sites such as YouTube. That is done only by the optional Video sites plugin, which you choose to install, and it relies on the third-party tool yt-dlp. DRM-protected (encrypted) videos are not supported. You are responsible for following each site’s terms and copyright rules.
Manage plugins under Settings → Plugins: toggle them on/off, install optional ones with one click (downloads are checksum-verified before loading), and get an Update button right on the plugin when a newer version ships.
A plugin is just a .NET class library that references one tiny package — Downloader.Desktop.Plugins.Abstractions — no app internals, no Avalonia. Every download flows through three phases, and your plugin hooks whichever it needs:
user input ──▶ RESOLVE ──▶ TRANSFER ──▶ POST-PROCESS ──▶ final file
ILinkResolver ITransfer IPostProcessor
In short: implement IDownloaderPlugin, register your pieces in Initialize, build the DLL, and drop its folder into the app's plugins/ directory — it appears in Settings → Plugins on the next start. The bundled GitHub Releases plugin implements every interface and doubles as the reference example.
📖 Full step-by-step guide: Writing a Downloader plugin — project setup, each interface with code, packaging, and debugging tips.
A companion browser extension (Chrome, Edge, Firefox) sends links straight to the app:
.m3u8) media.Install it from the app — Settings → Browser extension & local API → Get the files. The app finds the browsers installed on your computer, downloads and checks the right build for each, and shows you the folder plus the two or three steps to add it in your browser. It marks a browser connected once the extension actually reaches the app, so you can see it worked.
A few honest caveats while the store listings are still pending review:
The app never installs an extension into your browser by itself, and never asks for administrator
rights to do it — that is your browser's decision to make, not ours. Prefer to do it entirely by hand?
src/browser-extension/README.md has the manual steps.
Other programs on your computer can add and manage downloads — handy for batch jobs and scripts (the most-requested developer feature, #2):
# From a terminal / script: add a download (starts the app if it isn't running)
Downloader add --url https://example.com/file.zip --path ~/Downloads
# Or over the local HTTP API from any language (Node.js, Bun, Python, curl, …)
curl -X POST http://127.0.0.1:15151/api/add -d '{"url":"https://example.com/file.zip"}'
You can also list all downloads (with progress and status) and pause / resume / cancel / retry / remove each one. Everything is local-only (loopback, never exposed to the network) and gated by
the same Settings → Browser extension & local API toggle, on by default. If another program is
already using port 15151, the app automatically switches to the next port in 15151–15155 — the
extension and CLI find it on their own, and Settings shows the current address.
📖 Full reference with examples: docs/local-api.md
Please report bugs and request features through GitHub Issues — not by Telegram or email. Issues are tracked, searchable, and handled through an automated workflow, so this is the fastest way to get a response (and it lets others find the same fix). Before opening one, search existing issues to avoid duplicates.
git clone https://github.com/bezzad/Downloader.Desktop.git
cd Downloader.Desktop/src
dotnet run --project Downloader.Desktop/Downloader.Desktop.csproj
Needs the .NET 10 SDK. Full developer docs — publishing, packaging, releasing and macOS bundling — are in CONTRIBUTING.md.
217 followers · starred Sep 2026
C#
86.6%
JavaScript
9.7%
Shell
2.5%
Fast, cross-platform and reliable multipart downloader with UI for MacOS, Linux and Windows
C#
46
900 commits
updated Oct 4, 2026
A fast, reliable, cross-platform download manager with a clean desktop UI for Windows, macOS and Linux. It splits each file into multiple connections for maximum speed, lets you pause and resume any time, and organizes your downloads with queues and a scheduler — all in a simple interface anyone can use.
Built with Avalonia UI on .NET and powered by the Downloader engine.
.m3u8 streams → a single playable video via the HLS plugin). Multi-part downloads show live "Part 3/10" progress and an "Assembling…" step, and resume where they left off after a restart.ollama.com link or just type a model name like gemma3:12b, download it at full multi-connection speed, then click Add to Ollama to install it into your local Ollama in one step (checksum-verified). Ships built-in, together with the GitHub Releases plugin (paste github.com/owner/repo → get the latest release for your OS).
The app is fully self-contained — every release ships with everything it needs bundled in, so there are no prerequisites to install (no .NET runtime, no FFmpeg, no extra libraries).
macOS (Homebrew):
brew tap bezzad/tap && brew install --cask downloader
This installs Downloader.app into your Applications folder — open it from Launchpad, Spotlight (⌘-Space → "Downloader"), or Finder like any other app.
- Recent Homebrew versions ask you to trust a third-party tap before installing. If you see that prompt, run
brew trust bezzad/tap(or setHOMEBREW_NO_REQUIRE_TAP_TRUST=1) and re-run the install.- The app isn't notarized yet. The Homebrew cask removes the quarantine flag automatically on install, so it should launch normally — you do not need to run
xattrby hand. If macOS still blocks the first launch, right-click Downloader in Applications → Open, or runxattr -dr com.apple.quarantine "/Applications/Downloader.app".
Linux (Snap) — recommended; auto-updates via the Snap Store:
sudo snap install downloader
Installs from the Snap Store and keeps itself up to date automatically. If
snapisn't available on your distro, use the install script below or Manual download.
Linux (script) — downloads the latest release and adds a menu entry + icon:
curl -fsSL https://raw.githubusercontent.com/bezzad/Downloader.Desktop/main/scripts/install.sh | bash
Debian / Ubuntu (APT) — apt install + updates via apt upgrade:
curl -fsSL https://bezzad.github.io/Downloader.Desktop/apt/pubkey.gpg \
| sudo gpg --dearmor -o /usr/share/keyrings/downloader.gpg
echo "deb [signed-by=/usr/share/keyrings/downloader.gpg] https://bezzad.github.io/Downloader.Desktop/apt stable main" \
| sudo tee /etc/apt/sources.list.d/downloader.list
sudo apt update && sudo apt install downloader
Or grab the
.debfrom a release and runsudo apt install ./Downloader_*_amd64.deb. See packaging/apt.
Arch Linux (AUR):
yay -S downloader-bin
Windows (winget):
winget install bezzad.Downloader --source winget
This installs the portable app and puts Downloader on your PATH — launch it from the Start menu or a terminal. Update later with winget upgrade bezzad.Downloader.
--source wingetis recommended: it tells winget to look only in the community package repository, which is where this app lives. Without it, winget also queries the Microsoft Store source, and if that source is unreachable it stops and asks you to pick a source instead of installing.- The short form
winget install downloader --source wingetalso works, via the package's moniker.- Seeing
SSL Error: ... failed to check revocation statusorSSL invalid CAfor themsstoresource? That's your network or machine (a corporate TLS proxy, VPN, or a blocked certificate-revocation check), not the package —--source wingetavoids it entirely.
Windows (script) — downloads the latest release, adds a Start-menu shortcut, and puts Downloader on your PATH. Run in PowerShell:
iex (irm https://raw.githubusercontent.com/bezzad/Downloader.Desktop/main/scripts/install.ps1)
Downloader-osx-*.tar.gz and drag Downloader.app into your Applications folder, then launch it from Launchpad/Spotlight.Downloader executable. That's it.The version number is shown under Settings → About and increases automatically with every release. With Settings → Check for updates automatically on, the app downloads a newer release in the background, then shows an “Update Downloader” button at the bottom of the left menu plus a system notification. Click it (or just close the app) to install — it restarts into the new version. Snap builds update through the Snap Store instead, so the in-app updater is disabled there.
First launch on an unsigned build: Windows SmartScreen → More info → Run anyway; macOS Gatekeeper → right-click → Open (or
xattr -dr com.apple.quarantine <app>).
Ctrl+N). In the dialog you can choose the save folder, optionally set a name, and pick a queue. To add several at once, paste multiple links (one per line).Esc to close).Your downloads list and settings are saved automatically. Config file location:
~/.config/Downloader/config.json~/Library/Application Support/Downloader/config.json%APPDATA%\Downloader\config.jsonPlugins teach the app to turn links that aren't direct file URLs into real downloads — just copy & paste the link, the plugin does the rest. Download HLS .m3u8 video streams as one playable file, pull AI models straight into Ollama, or fetch the right GitHub release for your OS — all at full multi-connection speed, with pause/resume and live per-part progress.
| Plugin | What it does | How it works |
|---|---|---|
| HLS video streams | Downloads raw HLS .m3u8 streams — you get one normal, playable video file. | Paste an .m3u8 link. For a master playlist the plugin lets you pick the quality; it then downloads all the segments in parallel and assembles them into a single file. FFmpeg is fetched automatically on first use. Optional — add it once under Settings → Plugins → More plugins. |
| Video sites | Gets the video behind a page on YouTube, X, Instagram, TikTok, Vimeo and other video sites, in the quality you pick. | Send the page from the browser extension (recommended — it passes your signed-in browser session, which some videos need), or paste the page link. The plugin uses the third-party tool yt-dlp to find the video, and FFmpeg to join video and audio. Both are fetched and checksum-verified on first use. Optional — add it once under Settings → Plugins → More plugins. |
| Website offline copy | Saves a web page — or a whole site — as one .zip you can read offline: pages, styles, images, scripts and fonts, with links rewired to work from disk. | Paste a page link and pick “Offline copy (.zip)” in the Add window. The plugin crawls the page (and same-site pages it links to), grabs everything the pages need, and packs it all into a single zip — no extra tools. Optional — add it once under Settings → Plugins → More plugins. |
| Ollama models | Downloads AI models for Ollama at full speed, then installs them locally in one click. | Paste an ollama.com model link — or just type a name like gemma3:12b — and download. When it finishes, click Add to Ollama: the model is checksum-verified and registered in your local Ollama, ready to run. Built-in. |
| GitHub Releases | Turns a GitHub repository link into a download of its latest release, picking the right asset for your operating system. | Paste github.com/owner/repo (no digging through the Releases page) — the plugin looks up the newest release and downloads the asset that matches your OS. Built-in. |
Note: the Downloader app itself does not download from video sites such as YouTube. That is done only by the optional Video sites plugin, which you choose to install, and it relies on the third-party tool yt-dlp. DRM-protected (encrypted) videos are not supported. You are responsible for following each site’s terms and copyright rules.
Manage plugins under Settings → Plugins: toggle them on/off, install optional ones with one click (downloads are checksum-verified before loading), and get an Update button right on the plugin when a newer version ships.
A plugin is just a .NET class library that references one tiny package — Downloader.Desktop.Plugins.Abstractions — no app internals, no Avalonia. Every download flows through three phases, and your plugin hooks whichever it needs:
user input ──▶ RESOLVE ──▶ TRANSFER ──▶ POST-PROCESS ──▶ final file
ILinkResolver ITransfer IPostProcessor
In short: implement IDownloaderPlugin, register your pieces in Initialize, build the DLL, and drop its folder into the app's plugins/ directory — it appears in Settings → Plugins on the next start. The bundled GitHub Releases plugin implements every interface and doubles as the reference example.
📖 Full step-by-step guide: Writing a Downloader plugin — project setup, each interface with code, packaging, and debugging tips.
A companion browser extension (Chrome, Edge, Firefox) sends links straight to the app:
.m3u8) media.Install it from the app — Settings → Browser extension & local API → Get the files. The app finds the browsers installed on your computer, downloads and checks the right build for each, and shows you the folder plus the two or three steps to add it in your browser. It marks a browser connected once the extension actually reaches the app, so you can see it worked.
A few honest caveats while the store listings are still pending review:
The app never installs an extension into your browser by itself, and never asks for administrator
rights to do it — that is your browser's decision to make, not ours. Prefer to do it entirely by hand?
src/browser-extension/README.md has the manual steps.
Other programs on your computer can add and manage downloads — handy for batch jobs and scripts (the most-requested developer feature, #2):
# From a terminal / script: add a download (starts the app if it isn't running)
Downloader add --url https://example.com/file.zip --path ~/Downloads
# Or over the local HTTP API from any language (Node.js, Bun, Python, curl, …)
curl -X POST http://127.0.0.1:15151/api/add -d '{"url":"https://example.com/file.zip"}'
You can also list all downloads (with progress and status) and pause / resume / cancel / retry / remove each one. Everything is local-only (loopback, never exposed to the network) and gated by
the same Settings → Browser extension & local API toggle, on by default. If another program is
already using port 15151, the app automatically switches to the next port in 15151–15155 — the
extension and CLI find it on their own, and Settings shows the current address.
📖 Full reference with examples: docs/local-api.md
Please report bugs and request features through GitHub Issues — not by Telegram or email. Issues are tracked, searchable, and handled through an automated workflow, so this is the fastest way to get a response (and it lets others find the same fix). Before opening one, search existing issues to avoid duplicates.
git clone https://github.com/bezzad/Downloader.Desktop.git
cd Downloader.Desktop/src
dotnet run --project Downloader.Desktop/Downloader.Desktop.csproj
Needs the .NET 10 SDK. Full developer docs — publishing, packaging, releasing and macOS bundling — are in CONTRIBUTING.md.
217 followers · starred Sep 2026
C#
86.6%
JavaScript
9.7%
Shell
2.5%