Downloader Behzad Khosravifar
winget install --id=bezzad.Downloader -e Fast cross-platform multi-connection download manager.
winget install --id=bezzad.Downloader -e Fast cross-platform multi-connection download manager.
<img src="https://snapcraft.io/en/light/install.svg" />
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 plugin (paste → 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 set HOMEBREW_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 xattr by hand. If macOS still blocks the first launch, right-click Downloader in Applications → Open, or run xattr -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 snap isn'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 .deb from a release and run sudo 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 winget is 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 winget also works, via the package's moniker.
> - Seeing SSL Error: ... failed to check revocation status or SSL invalid CA for the msstore source? That's your network or machine (a corporate TLS proxy, VPN, or a blocked certificate-revocation check), not the package — --source winget avoids 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 ).
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. Grab videos from YouTube, X (Twitter) and other video sites, 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 sites | Downloads videos from YouTube, x.com (Twitter) and many other sites, plus raw HLS .m3u8 streams — you get one normal, playable video file. | Paste the page URL of the video (or an .m3u8 link) exactly as you'd share it. The plugin finds the media, lets you pick the quality (or audio-only), downloads all the parts in parallel and assembles them into a single file. Needed tools (yt-dlp/FFmpeg) are fetched automatically 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. |
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 (store listings pending review — see src/browser-extension):
src/browser-extension/README.md to load the unpacked extension.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.
github.com/owner/repo