Mister Download Manager
  1. Home
  2. Help
  3. Architecture

Architecture

How Mister Download Manager's pieces fit together.

Crates

Path Crate Role
crates/engine mdm-engine Downloads one file over HTTP(S) or FTP(S): probe, segment planner, connection workers, resume state, per-host limits, speed limiter, checksums, proxy scripts
crates/app mdm-app The desktop app (misterdownloadmanager.exe, egui): list, categories, queues, scheduler, dialogs, tray, settings
crates/cli mdm-cli Headless downloads with progress (get, resume)
crates/mcp mdm-mcp The MCP server (misterdownloadmanager-mcp): AI assistants list, add and control the running app's downloads through the automation API
crates/nmhost mdm-nmhost The browser's native messaging host: takes captured downloads from the extension and hands them to the app
crates/ipc mdm-ipc The single-instance channel (a token-protected local socket), the data folder, and the capture rules shared by the app and the host
crates/tools mdm-tools Video pages through yt-dlp and ffmpeg (run as separate programs)
crates/torrent mdm-torrent BitTorrent and magnet links through librqbit
crates/labserver mdm-labserver An HTTP Range server with a request log and fault injection, and an FTP/FTPS server with its own faults, for tests and benchmarks
extension/ — The Chromium (MV3) and Firefox extension
docs/ — The user guide and tutorials (Help opens them), this file, the benchmark data
website/ — A future website's pages (not published yet)

Dependencies point inward: app, cli, mcp and nmhost use engine and ipc; the engine knows nothing of the UI. The app sees the engine only through its events (progress, segment table snapshots, finished, failed).

Engine

Download
 ├─ probe()              size, resumable?, validators (ETag / Last-Modified), file name
 ├─ Planner (pure)       segment table: when a connection is free, the largest remaining
 │                       part is split in half (planner.rs, tested by random simulation)
 ├─ Worker × N           one HTTP/1.1 connection each, reused across segments; slow ones
 │                       are dropped and their part re-split
 │    └─ writes at its offset into <name>.mdm.part (created sparse)
 ├─ HostLimits           learns how many connections each server accepts
 ├─ Limiter (shared)     per-download and global token buckets
 ├─ State                segment table saved atomically (craft-atomic) for crash-safe resume
 └─ events → channel     Progress, Done, Failed

When every segment is done, the part file is checked against the expected size and renamed into place; the file's date can follow the server's.

FTP and FTPS (ftp.rs) go through the same planner, workers and state: a segment is REST + RETR on a control session instead of a ranged GET, SIZE and MDTM stand in for the headers, and sessions are pooled per download and reused between segments.

App

One egui window painted to fixed pixel coordinates, plus one immediate viewport per dialog. app.rs holds the state (downloads, queues, settings, the list's selection) and turns menu, toolbar, key and IPC commands into actions. Each dialog is its own module and returns an Outcome (open, closed, done with a value). Windows-only calls are confined to win32.rs and their Linux and macOS counterparts to unix.rs (starting with the session, the browsers' host, sounds, show in folder); every other file is safe, portable Rust. Fonts come from the system: Windows' Fonts folder, macOS's system fonts, fontconfig on Linux (theme.rs).

The download list and settings are saved atomically to %APPDATA%\misterdownloadmanager\ (downloads.json). The browser host reads the same file for the capture rules, so a change in Options applies to the next captured download.

Browser integration

page ──► extension ──native messaging──► mdm-nmhost ──ipc──► app

The extension asks the host which file types to take, checks each download against them, and cancels the browser's download only after the app has accepted it; otherwise the browser keeps it.

Translations

Every text the UI shows goes through crate::i18n (craft-i18n catalogs, i18n/<locale>.tsv). tools/i18n/extract.py rebuilds i18n/en.tsv from the source, with a note for translators on each text (what it is, where it shows, its placeholders).

Tests and benchmarks

cargo test runs unit tests and end-to-end downloads against mdm-labserver with injected faults (slow, dropped and refused connections, servers without ranges, changing files). tools/bench runs the published speed comparison; its raw data is in docs/bench/.

Free, open source, no ads, no trial.

Download Mister Download Manager