A fast, modern, open-source download manager built with Rust & Iced.
Website • Features • Download • Build from Source • Contributing
- Segmented multi-connection HTTP/HTTPS — splits files into up to 32 parallel chunks for maximum throughput.
- Mirror support — add multiple mirror URLs for automatic failover and load balancing.
- Resumable downloads — respects
Range,ETag, andLast-Modifiedheaders for seamless resume after interruption.
- Built on librqbit, a high-performance pure-Rust BitTorrent engine.
- Magnet URI resolution,
.torrentfile support, selective file downloads, DHT, and seeding. - Live peer/seed counts, upload speed, and piece-level progress tracking.
- Auto-pause on disconnect — detects network loss and pauses active transfers automatically.
- Auto-resume on reconnect — resumes all paused downloads the moment connectivity is restored.
- Automatic retry — configurable retry with exponential backoff for transient failures.
- Smart queue system — configurable concurrent download limits with automatic promotion of queued items.
- Bandwidth throttler — global and per-download speed limiting with a token-bucket algorithm.
- Download scheduler — define active time windows for downloads (e.g., overnight only).
- File conflict resolution — auto-rename, overwrite, or prompt when destination files already exist.
- Duplicate detection — identifies duplicate downloads by URL, magnet info-hash, or destination path.
- Custom frameless window with a dark theme built entirely with Iced.
- Real-time per-chunk progress visualization, live speed/ETA display, and visual file type icons.
- Download details dialog with per-thread, per-connection, and per-chunk breakdowns.
- System tray integration with Pause All / Resume All / Show / Quit controls.
- Built-in update system that checks for new releases, downloads update payloads, verifies SHA-256 integrity, and launches the installer — all from within the app.
- Opening the "Add Download" dialog automatically detects valid URLs, magnet links, or
.torrentfile paths in your clipboard and begins metadata probing immediately.
Visit qdm.shahstudioz.store to download the latest installer for your platform — Windows, Linux, or macOS.
Alternatively, you can grab installers directly from GitHub Releases.
| Platform | Format | Link |
|---|---|---|
| Windows (x64) | .exe installer |
Website · GitHub |
| Linux (x64) | .deb / .AppImage |
Website · GitHub |
| macOS (x64) | .dmg |
Website · GitHub |
| macOS (Apple Silicon) | .dmg |
Website · GitHub |
Since QDM is not signed with an Apple Developer certificate, macOS Gatekeeper may show "QDM is damaged and can't be opened" or "QDM can't be opened because Apple cannot check it for malicious software" when you first launch the app. This is expected for open-source software distributed outside the Mac App Store.
To open QDM, use one of these methods:
Method 1 — Right-click to Open (easiest)
- Open Finder and navigate to the QDM app.
- Right-click (or Control-click) on QDM.app and select Open.
- Click Open in the confirmation dialog. You only need to do this once.
Method 2 — Remove the quarantine attribute (Terminal)
xattr -dr com.apple.quarantine /Applications/QDM.appMethod 3 — System Settings
- Go to System Settings → Privacy & Security.
- Scroll down to the Security section.
- You should see a message about QDM being blocked — click "Open Anyway".
- Rust (stable toolchain, 1.75+)
- Platform-specific system libraries (see below)
No extra system dependencies are required — just Rust and the MSVC build tools that come with Visual Studio or the Visual Studio Build Tools installer.
cargo build --release --bin qdmInstall the required system libraries first:
sudo apt-get update
sudo apt-get install -y \
libgtk-3-dev \
libayatana-appindicator3-dev \
libssl-dev \
pkg-config \
libasound2-dev \
libxdo-devThen build:
cargo build --release --bin qdmcargo build --release --bin qdm# Debug build (faster compilation)
cargo run --bin qdm
# Release build (optimized)
cargo run --release --bin qdmcargo test --all-targetssrc/
├── main.rs # Entry point, single-instance guard, Iced window setup
├── lib.rs # Library target exposing backend modules
├── icons.rs # FontAwesome glyph bindings
│
├── app/ # Application state, message routing, lifecycle
│ ├── mod.rs # QdmApp struct, Message enum
│ ├── view.rs # Main window layout composition
│ ├── subscriptions.rs # Event streams (ticks, engine events, keyboard)
│ └── handlers/ # Message handlers (downloads, dialogs, engine, queue, …)
│
├── core/ # Platform & utility layer
│ ├── single_instance.rs # IPC-based single-instance enforcement
│ ├── version.rs # Compile-time version constants from Cargo.toml
│ ├── window_sys.rs # Windows-specific frameless window behaviors
│ └── utils/ # Path helpers, platform detection
│
├── models/ # Data structures
│ ├── download.rs # DownloadItem, state machine, HTTP/Torrent metadata
│ └── schedule.rs # Time-based scheduler rules
│
├── services/ # Backend engines
│ ├── engine.rs # Unified facade coordinating HTTP + Torrent subsystems
│ ├── http/ # Segmented HTTP engine (metadata, workers, writer, throttler)
│ ├── torrent/ # BitTorrent engine (librqbit wrapper, DHT, staging)
│ ├── shared/ # Network monitor, scheduler, JSON persistence
│ ├── updater/ # Auto-update check, download, verify, install
│ └── tray.rs # System tray service
│
├── theme/ # Visual theming
│ ├── colors.rs # Color palette
│ └── styles.rs # Widget style functions
│
└── views/ # UI components
├── components/ # Title bar, sidebar, toolbar
├── downloads/ # Download list & item cards
├── dialogues/ # Add, delete, conflict, detail, mirror, update dialogs
├── settings/ # General, downloads, torrents, scheduler, updates tabs
└── preferences/ # Queue reordering view
QDM stores all user data in ~/.qdm/:
| File | Purpose |
|---|---|
downloads.json |
Serialized download list (survives restarts) |
settings.json |
User preferences and configuration |
dht.json |
Persistent DHT routing table for BitTorrent |
updates/ |
Staging directory for downloaded update installers |
Contributions are welcome and appreciated! Whether it's a bug fix, new feature, documentation improvement, or UI polish — all PRs are valued.
- Fork the repository and create a feature branch from
main. - Make your changes and ensure they follow the project's code style.
- Run the checks locally before pushing:
cargo fmt --all -- --check # Code formatting cargo clippy --all-targets -- -D warnings # Linting cargo test --all-targets # Automated tests
- Open a Pull Request against
mainwith a clear description of what you changed and why.
All pull requests are automatically validated by CI. Your PR must pass:
- ✅ Formatting —
cargo fmtcompliance - ✅ Linting — zero Clippy warnings
- ✅ Tests — all existing tests must pass
- ✅ Cross-platform check — code must compile on Windows, Linux, and macOS
- Keep PRs focused — one feature or fix per PR is ideal.
- Add tests for new functionality when possible.
- Follow existing code patterns and naming conventions.
- Update documentation or comments if your change affects public behavior.
This project is licensed under the MIT License.
Built with ❤️ in Rust by ShahStudioz
