A modern, open-source download manager for Windows, macOS, and Linux
Multi-segment acceleration • YouTube & media • Browser integration • System tray • Beautiful dark UI
Features • Installation • Extension • Configuration • Development • Credits
- ⚡ Multi-Segment Acceleration — Splits files into up to 32 parallel segments for maximum speed, each with its own HTTP connection and Range header
- ⏸️ Pause & Resume — Full pause/resume with persistent segment state — survives app restarts and crashes
- 🔄 Auto-Retry — Failed segments retry automatically; stalled connections recover gracefully
- 🔍 Smart Probing — HEAD request before download to detect file size, filename, and server resumability support
- 📊 Real-Time Progress — Per-segment progress visualization, speed (with exponential moving average), ETA, and downloaded bytes
- 🎬 YouTube Downloads — yt-dlp integration with in-app quality selection (Best, 1080p, 720p, 480p, 360p, Audio Only)
- 📺 HLS Streaming — Full HLS (HTTP Live Streaming) engine with AES-128 decryption and multi-bitrate support
- 🎵 DASH Streaming — MPEG-DASH parser for adaptive video/audio streams
- 🖥️ Media Grabber — Detects videos, audio, and streams from any website you browse via the extension
- 🍪 Cookie Support — Passes browser cookies to yt-dlp for age-restricted and member-only content
- 🌐 Chrome Extension (MV3) — Auto-intercepts downloads and media streams, works just like IDM
- 🔗 Context Menu — Right-click any link or media → Download with QDM ⚡
- 📋 Clipboard Monitor — Automatically detects download URLs copied to clipboard
- 🎥 YouTube Banner — Overlay banner on YouTube pages for one-click video download
- 🔔 Notifications — Desktop notifications when downloads complete
- 📂 Smart Categories — Auto-sorts by type: Videos, Music, Documents, Programs, Archives, Other
- 🔎 Search & Filter — Instant search across all downloads by filename or URL
- ⚙️ Download Queues — Create named queues with concurrency limits and scheduled execution times
- 🔐 Auth Support — Handles HTTP 401 challenges with a credential dialog
- 🔗 Expired Link Detection — Detects signed/expiring URLs and prompts to re-fetch from source
- 🗑️ Batch Actions — Pause all, resume all, clear completed, remove selected
- 🖥️ System Tray — Minimize to tray, background operation, tray icon with download status
- 🔔 OS Notifications — Native desktop notifications for completed downloads
- 🔄 Auto-Updater — In-app update check on startup; one-click download and install of new versions
- ⬇️ Tool Management — Auto-installs yt-dlp and ffmpeg on first launch; in-app updater for both
- 🎨 Frameless Dark UI — Custom titlebar, segment progress bars, clean dark theme throughout
- 🌍 Cross-Platform — Windows (x64), macOS (Apple Silicon), Linux (x64)
QDM is built with Tauri 2 — a Rust backend powering a React/TypeScript frontend, with a native Axum HTTP server for browser extension communication.
| Layer | Technology |
|---|---|
| Desktop framework | Tauri 2 (Rust) |
| UI | React 18 + TypeScript + Vite 5 |
| Styling | Tailwind CSS 3 |
| State management | Zustand |
| HTTP server (extension API) | Axum 0.7 + WebSocket |
| Download engine | Custom Rust multi-segment engine |
| Media downloader | yt-dlp (auto-managed) |
| Video processing | ffmpeg (auto-managed) |
| HLS/DASH engine | Custom Rust streaming parser |
| Clipboard | arboard |
| Icons | Lucide React |
┌──────────────────────────────────────────────────┐
│ File (e.g. 100 MB) │
├──────────┬──────────┬──────────┬─────────────────┤
│ Segment 1│ Segment 2│ Segment 3│ Segment 4 │
│ 25 MB │ 25 MB │ 25 MB │ 25 MB │
│ ████████░│ ██████░░░│ ████░░░░ │ ██░░░░░░░ │
│ Conn #1 │ Conn #2 │ Conn #3 │ Conn #4 │
└──────────┴──────────┴──────────┴─────────────────┘
- Probe — HEAD request: file size, resumability, Content-Disposition filename
- Split — Divided into N segments (configurable 1–32) with byte-range boundaries
- Parallel — Each segment downloads via a separate HTTP connection with
Rangeheader - Progress — Speed computed with exponential moving average; per-segment state persisted to disk
- Assemble — Segments merged sequentially into the final file
- Recovery — On restart, already-downloaded byte ranges are skipped; only missing parts re-fetched
Browser Extension
│
│ HTTP POST /download (port 8597)
│ HTTP POST /media
│ WebSocket /ws (real-time sync)
▼
Rust Axum Server (browser_monitor.rs)
│
│ Tauri event: browser:download
│ Tauri event: browser:vid-download
▼
lib.rs → DownloadEngine → emits download:added → React UI
The extension authenticates every request with a session token (X-QDM-Token) obtained from /sync on connection. The token rotates between sessions.
Download the latest version from the Releases page:
| Platform | File | Notes |
|---|---|---|
| 🪟 Windows | *_x64-setup.exe |
NSIS installer — recommended |
| 🪟 Windows | *_x64_en-US.msi |
MSI installer |
| 🍎 macOS | *.dmg |
Apple Silicon (M1/M2/M3) |
| 🐧 Linux | *.AppImage |
Universal, no install needed |
| 🐧 Linux | *.deb |
Debian / Ubuntu |
macOS: The app is not code-signed. If macOS blocks it, run:
xattr -cr /Applications/Quantum\ Download\ Manager.app
Linux AppImage: Make executable before running:
chmod +x Quantum_Download_Manager_*.AppImage ./Quantum_Download_Manager_*.AppImage
QDM auto-installs yt-dlp and ffmpeg on first launch if they are not found. A progress banner is shown while they download. You can also manage them manually via Settings → Tools.
The Chrome extension integrates QDM with your browser — intercepting file downloads and detecting media streams automatically, just like IDM.
- Open
chrome://extensions - Enable Developer mode (top-right toggle)
- Click Load unpacked
- Select the
extension/chrome/folder from the QDM repository
Firefox users:
extension/firefox/is a Manifest V2 version (load viaabout:debugging).
When QDM is running, the extension connects to it over WebSocket on port 8597. A session token is exchanged at startup for all subsequent requests.
| Feature | Description |
|---|---|
| Auto-intercept | Captures .zip, .exe, .pdf, .mp4, .mkv, .dmg, .iso and more |
| Toggle | Enable/disable auto-intercept from the popup without reloading |
| YouTube | Hover over any YouTube video for a QDM download banner |
| Context menu | Right-click any link or media → Download with QDM ⚡ |
| Manual URL | Paste any URL directly in the popup to queue it |
| HLS/DASH detection | inject.js runs in the page context to detect media streams before they load |
| Cookie passing | Passes cookies to QDM for authenticated/age-restricted downloads |
| Notifications | Chrome notification when a queued download completes |
| Permission | Purpose |
|---|---|
webRequest |
Intercept and inspect network requests |
downloads |
Monitor browser-initiated downloads |
cookies |
Pass site cookies to yt-dlp for auth |
contextMenus |
Right-click "Download with QDM" |
notifications |
Download completion alerts |
storage |
Persist settings and session token |
tabs, scripting |
Inject YouTube banner and media detector |
Open Settings (sidebar or Ctrl+,) to configure QDM.
| Option | Default | Description |
|---|---|---|
| Download Directory | ~/Downloads |
Default save location for all downloads |
| Option | Default | Range | Description |
|---|---|---|---|
| Max Concurrent Downloads | 3 | 1–10 | How many files download simultaneously |
| Segments Per Download | 8 | 1–32 | Parallel connections per file (1 = safe/no splitting) |
| Speed Limit | 0 (unlimited) | KB/s | Global bandwidth cap across all downloads |
| Option | Default | Description |
|---|---|---|
| Show Notifications | On | OS notification when a download completes |
| Minimize to Tray | On | Close button minimizes to system tray instead of quitting |
| Tool | Description |
|---|---|
| yt-dlp | Video downloader binary — install, update, or check version |
| ffmpeg | Video processing — required for 1080p+ quality merging |
| Browser for cookies | Choose which browser's cookie jar yt-dlp uses (Chrome, Firefox, Edge, Brave, Opera, Chromium) |
- Click + New Download or press
Ctrl+N - Paste the URL — QDM probes it instantly for filename, size, and resumability
- Edit filename or save path if needed
- Adjust segment count (default 8; use 1 for servers that block parallel requests)
- Click Download
QDM auto-detects YouTube, Shorts, Reels, and other yt-dlp-supported URLs and shows quality presets:
| Preset | Notes |
|---|---|
| Best Quality | Highest available resolution + audio, ffmpeg required |
| 1080p HD | Full HD, ffmpeg required for muxing |
| 720p HD | HD, ffmpeg required |
| 480p SD | Standard definition, no ffmpeg needed |
| 360p | Low quality, no ffmpeg needed |
| Audio Only | MP3 / M4A audio extraction |
- Click the QDM icon in your toolbar → paste a URL or it auto-fills from the active tab
- Right-click any download link → Download with QDM ⚡
- Visit YouTube → hover the video → click the QDM banner
QDM checks for updates automatically on startup. If a new version is available:
- A banner appears at the top: "QDM v1.x.x is available — Install now"
- Click Install now to download and run the installer in-place
- On Windows: the NSIS installer launches and QDM exits to allow replacement
- On macOS: the
.dmgopens — drag to Applications to complete - On Linux: the
.AppImageis downloaded and the folder opens
You can also check manually: About → Check for Updates.
- Node.js 24+
- Rust (stable, 1.77.2+)
- Tauri v2 prerequisites for your platform
Linux extra:
sudo apt-get install -y \
libwebkit2gtk-4.1-dev librsvg2-dev patchelf \
libgtk-3-dev libayatana-appindicator3-devgit clone https://github.com/PBhadoo/QDM.git
cd QDM
npm installnpm run tauri:devThis starts the Vite dev server with hot-reload and the Tauri Rust backend simultaneously.
# Current platform
npm run tauri:build
# Platform-specific
npm run tauri:build:win # Windows — MSI + NSIS (.exe)
npm run tauri:build:mac # macOS — .dmg (Apple Silicon)
npm run tauri:build:linux # Linux — .AppImage + .deb| Command | Description |
|---|---|
npm run dev |
Vite dev server only (UI preview, no Tauri) |
npm run tauri:dev |
Full Tauri dev mode with Rust backend + hot-reload |
npm run tauri:build |
Production build for current platform |
npm run tauri:build:win |
Windows cross-target (x86_64-pc-windows-msvc) |
npm run tauri:build:linux |
Linux cross-target (x86_64-unknown-linux-gnu) |
npm run tauri:build:mac |
macOS cross-target (aarch64-apple-darwin) |
npm run fetch-yt-dlp |
Download platform yt-dlp binary into src-tauri/resources/ |
QDM/
├── src/ # React frontend (TypeScript)
│ ├── App.tsx # Root — event listeners, update banner, layout
│ ├── components/
│ │ ├── TitleBar.tsx # Custom frameless title bar (minimize/maximize/close)
│ │ ├── Sidebar.tsx # Category navigation + status counts
│ │ ├── Toolbar.tsx # Actions: new, pause-all, resume-all, search
│ │ ├── DownloadList.tsx # Download rows with segment progress bars
│ │ ├── NewDownloadDialog.tsx # Add download — probe + quality + segments
│ │ ├── VideoQualityDialog.tsx# yt-dlp quality picker
│ │ ├── VideoGrabber.tsx # Media grabber panel (intercepted streams)
│ │ ├── SettingsDialog.tsx # All app settings + tools management
│ │ ├── AboutDialog.tsx # Version info + update checker
│ │ ├── AuthDialog.tsx # HTTP 401 credential prompt
│ │ ├── LinkExpiredDialog.tsx # Expired/signed URL recovery
│ │ └── YtdlpLogPanel.tsx # yt-dlp stdout/stderr log viewer
│ ├── store/
│ │ └── useDownloadStore.ts # Zustand global state
│ └── types/
│ └── download.ts # Shared TypeScript types
│
├── src-tauri/ # Rust/Tauri backend
│ ├── src/
│ │ ├── lib.rs # All Tauri commands + app setup + event wiring
│ │ ├── download_engine.rs # Multi-segment download engine with retry/recover
│ │ ├── hls_engine.rs # HLS/DASH parser with AES-128 decryption
│ │ ├── yt_dlp.rs # yt-dlp binary integration + progress parsing
│ │ ├── browser_monitor.rs # Axum HTTP server + WebSocket hub (port 8597)
│ │ ├── clipboard_monitor.rs # Clipboard URL watcher
│ │ ├── queue_manager.rs # Download queue scheduler
│ │ ├── tools.rs # yt-dlp + ffmpeg auto-install with progress
│ │ ├── types.rs # Shared Rust types (serde)
│ │ └── main.rs # Tauri entry point
│ ├── capabilities/
│ │ └── default.json # Tauri permission capabilities
│ ├── icons/ # App icons (all platforms)
│ ├── tauri.conf.json # Tauri app config
│ └── Cargo.toml # Rust dependencies
│
├── extension/
│ ├── chrome/ # Chrome MV3 extension
│ │ ├── background.js # Service worker: intercept, WebSocket, context menu
│ │ ├── content.js # Content script: YouTube banner, link hover
│ │ ├── inject.js # Page-world script: early media stream detection
│ │ ├── popup.html # Extension popup UI
│ │ ├── popup.js # Popup logic: URL input, status, settings
│ │ ├── manifest.json # MV3 manifest
│ │ └── icons/ # Extension icons
│ └── firefox/
│ └── manifest.json # Firefox MV2 manifest
│
└── scripts/
└── fetch-yt-dlp.js # Downloads correct yt-dlp binary into resources/
View all backend commands
| Command | Description |
|---|---|
download_add |
Queue a new download (URL, filename, path, segments) |
download_start |
Start a queued download |
download_pause |
Pause an active download |
download_resume |
Resume a paused download |
download_cancel |
Cancel and clean up a download |
download_remove |
Remove from list (optionally delete file) |
download_retry |
Retry a failed download |
download_get_all |
Fetch all download records |
download_open_file |
Open completed file with default app |
download_open_folder |
Reveal file in Finder/Explorer |
download_pause_all |
Pause all active downloads |
download_resume_all |
Resume all paused downloads |
download_probe |
Probe URL: size, resumability, filename |
download_provide_auth |
Submit credentials for a 401 challenge |
download_reopen_source |
Open original source page to refresh expired link |
browser_get_media_list |
Get list of media intercepted by extension |
browser_clear_media |
Clear the intercepted media list |
browser_download_media |
Send intercepted media to download engine |
browser_get_status |
Check browser monitor connectivity |
browser_set_config |
Enable/disable browser interception |
clipboard_get_enabled |
Is clipboard monitoring on? |
clipboard_set_enabled |
Toggle clipboard monitoring |
queue_get_all |
Fetch all download queues |
queue_create |
Create a new named queue |
queue_update |
Update queue settings |
queue_delete |
Delete a queue |
queue_add_downloads |
Assign downloads to a queue |
queue_set_schedule |
Set scheduled start time for a queue |
config_get |
Read app configuration |
config_set |
Write app configuration |
update_check |
Check GitHub for a newer QDM release |
update_download_install |
Download + run platform installer for a release |
ytdlp_list_formats |
List available quality formats for a URL |
ytdlp_get_version |
Get installed yt-dlp version |
ytdlp_check_update |
Check if yt-dlp has a newer release |
ytdlp_download_update |
Download and install latest yt-dlp |
tools_get_status |
Check yt-dlp + ffmpeg install status |
tools_install_ytdlp |
Auto-install yt-dlp |
tools_install_ffmpeg |
Auto-install ffmpeg |
Bump the version in these three files to the new version number:
package.json→"version"src-tauri/Cargo.toml→versionsrc-tauri/tauri.conf.json→"version"
Then tag and push:
git tag v1.0.4
git push origin v1.0.4GitHub Actions will build all three platforms and publish the release automatically.
By subhra74 — github.com/subhra74/xdm
QDM's multi-segment download architecture, segment splitting, Range-header resumption, and crash-recovery patterns are directly inspired by XDM's brilliant open-source engine. QDM is a spiritual successor built on a modern Rust + Tauri stack.
By Tonec Inc.
IDM pioneered the browser-integration model and established the gold standard for segmented download acceleration. QDM's extension design, context menu integration, and IDM-style popup follow the patterns they established.
| Project | Use |
|---|---|
| Tauri | Cross-platform desktop framework |
| React | UI library |
| yt-dlp | Video & media downloader |
| ffmpeg | Video processing and muxing |
| Axum | Async Rust web framework |
| Tokio | Async runtime |
| reqwest | HTTP client |
| Tailwind CSS | Utility-first CSS |
| Zustand | State management |
| Lucide Icons | Icon library |
| m3u8-rs | HLS playlist parsing |
MIT License — see LICENSE for details.
Made with ❤️ by Parveen Bhadoo