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.
- Multi-connection downloads — each file is split into several parts and downloaded in parallel for higher speed.
- Pause / resume / stop any download, any time. Incomplete downloads resume after you restart the app.
- Add one or many links — paste a single URL or many at once (one per line) and send them all to the same folder.
- Clipboard suggestions — copied a link? The Add dialog offers it automatically; press Enter to use it, or just type over it.
- Automatic file names — leave the name blank and the app detects it from the link or server.
- Queues — group downloads and control how many run at the same time.
- Scheduler — start and stop a queue automatically at set times (e.g. download overnight).
- File-type icons at a glance — video, audio, image, document, archive, app, disc.
- Clear status — live progress and speed, a friendly reason when something fails, and a details view with per-connection progress.
- Light & dark themes with a modern ocean-blue look.
- Desktop notifications when a download completes or fails (uses your OS's native notifications where available).
- Dynamic Island (notch) — an optional slim pill at the top-center of your screen showing the clock and live download speed; hover it to peek at active downloads without opening the app (Settings → Dynamic Island, off by default).
- System tray — closing the window keeps downloads running in the background; reopen, mute notifications, or quit from the tray menu. Optionally launch at startup (hidden in the tray).
- Automatic update check — get an in-app prompt when a new version ships, and update with one click.
- Extensible via plugins — a plugin can turn a link the engine can't grab directly into a real download: the app downloads all the parts and assembles them into one file for you (e.g. HLS
.m3u8streams → 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. - Download Ollama models — paste an
ollama.comlink or just type a model name likegemma3: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 (pastegithub.com/owner/repo→ get the latest release for your OS). - Automation-friendly — add and manage downloads from scripts or the terminal via a local API and CLI (see Automation).
- Multi-language UI — English, فارسی (Persian), Español, Français, العربية (Arabic), Esperanto — with full right-to-left layout for Persian/Arabic. Switch under Settings → App language.
- No installation, no dependencies — fully self-contained. You do not need to install .NET, FFmpeg, or anything else; just download and run.
- Your settings, your way — sensible defaults out of the box, saved the moment you change them, with every engine option available under Settings → Advanced. Dialogs are resizable and reopen at the size you left them.
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 downloaderThis 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 downloaderPending first publish to the Snap Store. Until it's live, 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 | bashWindows (winget):
winget install bezzad.DownloaderThis 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.
The short form
winget install downloaderalso resolves to this package via its moniker (if another package matches first, use the full id above).
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)- Download the build for your operating system from the Releases page.
- Unpack it:
- macOS — open
Downloader-osx-*.tar.gzand drag Downloader.app into your Applications folder, then launch it from Launchpad/Spotlight. - Windows / Linux — unzip anywhere and run the
Downloaderexecutable. That's it.
- macOS — open
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>).
- Add a download — paste a link into the top bar and click Add (or press
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). - Control downloads — each row has pause/resume/stop and, when finished, an open-folder button. Tick the checkboxes and use the toolbar to Start / Pause / Stop / Remove several at once.
- See details — double-click a row to open the details window: overall progress, speed, the failure reason (if any), a live speed limit, and a per-connection progress strip that updates live as connections come and go (press
Escto close). - Filter — the left sidebar filters by All / Active / Completed / Failed. Collapse the sidebar to icons with the ☰ button.
- Queues & Scheduler — under Manage, create queues with a concurrency limit (only that many downloads run at once; the rest wait their turn) and schedules that run them at chosen times.
- Settings — set your default save folder, connections per download, speed limit and theme; everything else lives under Advanced.
Your downloads list and settings are saved automatically. Config file location:
- Linux:
~/.config/Downloader/config.json - macOS:
~/Library/Application Support/Downloader/config.json - Windows:
%APPDATA%\Downloader\config.json
Plugins 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
- Resolve — turn a pasted link (a page, a short-link, a repo URL…) into real download URLs. The core engine still does the downloading, so you keep multipart speed, pause/resume and progress for free. Most plugins only need this.
- Transfer — take over the byte transfer itself, only when plain HTTP can't (e.g. a torrent).
- Post-process — transform the finished files (mux video+audio, verify a checksum, unpack…). You can also add a one-click action button on completed downloads (that's how "Add to Ollama" works).
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:
- Right-click a link/image/video/audio → “Download with Downloader.”
- A popup to paste a link, scan the page for links, or grab detected video / audio / HLS (
.m3u8) media. - Captured links go straight into the app and start downloading — no dialog. Prefer to review each link first? Untick Add silently in the extension popup.
- Links are sent only to the desktop app on your own machine (Settings → Browser extension & local API, on by default). DRM/encrypted sites like YouTube aren’t supported.
Install (store listings pending review — see src/browser-extension):
- Chrome Web Store / Edge Add-ons / Firefox AMO — links added here once published.
- Load it now (developer mode): see
src/browser-extension/README.mdto 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.csprojNeeds the .NET 10 SDK. Full developer docs — publishing, packaging, releasing and macOS bundling — are in CONTRIBUTING.md.