HyperDM
A fast, open-source download manager for Linux — a clean-room alternative to IDM. It splits every download across multiple connections, catches downloads straight out of your browser, and grabs video from YouTube and ~35 other sites at whatever quality you pick.
- Multi-connection downloads — each file is split into segments fetched in parallel, with work-stealing rebalancing so a single slow connection can't hold the whole download back.
- Pause, resume, retry — progress is kept in a
.hdmsidecar file, so a paused (or crashed, or rebooted) download resumes from exactly where it stopped. - Browser integration — a Manifest V3 extension for Chrome/Brave/Edge and Firefox. Clicking a download in the browser hands it to HyperDM; the popup also lists media it detected on the current page.
- Video sites — YouTube, Vimeo, X/Twitter, TikTok, Reddit, Twitch,
Dailymotion, SoundCloud, Bilibili, Odysee, Rumble and more, via
yt-dlp. - Pick your quality — the extension and the desktop dialog both ask
yt-dlpwhat the page actually offers and let you choose: 4K down to 360p, or audio-only. - HLS/DASH capture —
.m3u8and.mpdstreams are remuxed to a real file withffmpeg. - Queue and scheduler — concurrency limits, sequential mode, a global speed cap, and an "only download between 00:00 and 07:00" window.
- Clipboard monitor — copy a URL, get an offer to download it.
- Native GUI — PySide6/Qt, dark and light themes, live speed graph, system tray, desktop notifications.
- Automatic filing — finished files are sorted into
Video/,Music/,Documents/,Programs/,Compressed/by type.
License: LGPL-3.0-or-later.
Requirements
| Linux | any modern distro (X11 or Wayland) |
| Python | 3.11 or newer |
ffmpeg |
needed for HLS/DASH and for merging high-quality video+audio |
yt-dlp |
installed automatically into HyperDM's virtualenv |
ffmpeg is a system package — install it with your package manager:
sudo apt install ffmpeg # Debian / Ubuntu
sudo pacman -S ffmpeg # Arch
sudo dnf install ffmpeg # Fedora
Everything else (PySide6, httpx, yt-dlp) is pulled into a local .venv by the
scripts below — nothing is installed system-wide.
Install
git clone <this-repo> HyperDM
cd HyperDM
./install.sh
This creates .venv, installs the app and yt-dlp, adds a hyperdm launcher
to ~/.local/bin, installs a desktop entry and icon, registers the browser
native-messaging host, and stages the browser extensions in dist-extension/.
Then launch it from your application menu, or:
hyperdm
Make sure ~/.local/bin is on your PATH.
From PyPI
No clone needed:
pip install "hyperdm[gui,video]"
This installs the same launchers as install.sh — hyperdm for the GUI and
hyperdm-cli for the headless downloader. The browser native-messaging host
still needs registering; run hyperdm-install-host once, or use the source
install above which does it for you.
Or run it without installing
./run.sh
First run builds the virtualenv; after that it starts immediately. No launcher, no desktop entry, no host registration.
Uninstall
./uninstall.sh
Browser extension
The extension talks to the app over native messaging, so HyperDM must be
installed (./install.sh) for it to work — run.sh alone doesn't register
the messaging host.
Chrome / Brave / Edge
- Go to
chrome://extensions, enable Developer mode. - Load unpacked → select
dist-extension/chrome. - Copy the extension ID shown on the card, then authorise it:
./install.sh --chrome-id <ID>
Firefox
- Go to
about:debugging#/runtime/this-firefox. - Load Temporary Add-on → select
dist-extension/firefox/manifest.json.
(If dist-extension/ is missing, run ./packaging/build-extension.sh.)
Using it
- Any download you start in the browser is handed to HyperDM instead.
- On a video page, the popup shows the video with a quality dropdown — populated with the formats that page actually has — and a Download button. A floating button on the page itself does the same thing.
- Other media on the page (direct
.mp4,.mp3, HLS streams) is listed in the popup, each with its own grab button. - The popup's status pill tells you whether the app is running.
Extension settings (right-click the icon → Options) cover the default video quality, whether to intercept every file type or only media, whether to include audio and HLS/DASH streams in detection, an ad-network filter, a minimum file size, and a per-site disable list.
Configuration
Settings live in the GUI under Settings, and are stored at
~/.config/hyperdm/config.json:
| Setting | Default | |
|---|---|---|
| Download folder | ~/Downloads |
where finished files land |
| Max concurrent downloads | 4 |
or switch to strict sequential mode |
| Connections per download | 8 |
segments fetched in parallel |
| Speed limit | unlimited | global cap in bytes/sec |
| Organise by category | on | sort into Video/, Music/, … |
| Confirm browser downloads | on | show a prefilled dialog instead of queueing silently |
| Video site quality | Best available | default for yt-dlp downloads |
| Video site cookies | off | lift cookies from Firefox/Chrome/Brave/… for age-restricted or login-walled videos |
| Theme | dark | dark or light |
| Proxy | none | |
| Schedule | off | e.g. only download 00:00–07:00 |
Other paths: database at ~/.local/share/hyperdm/hyperdm.db, IPC socket at
$XDG_RUNTIME_DIR/hyperdm/ipc.sock (mode 0600, user-only).
Age-restricted or members-only videos usually fail with "Sign in to confirm…". Set Video site cookies to the browser you're logged into and try again.
Command line
A minimal downloader is available without the GUI:
hyperdm-cli <url> -o out.iso -n 16
-o, --output |
destination path |
-n, --connections |
parallel connections (default 8) |
--referrer |
send a Referer header |
Packaging
- Arch / AUR —
packaging/pkgbuild/PKGBUILD - AppImage —
packaging/appimage/build-appimage.sh - Wheel —
python -m build(extras:[gui],[video],[dev])
Development
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
QT_QPA_PLATFORM=offscreen .venv/bin/python -m pytest -q # Python tests
node --test extension/tests/*.js # extension tests
QT_QPA_PLATFORM=offscreen lets the GUI tests run without a display.
Layout
hyperdm/core/ segmented engine, chunk manager, queue, scheduler,
SQLite DAO, HLS/DASH + yt-dlp downloaders
hyperdm/gui/ PySide6 window, dialogs, tray, theming
hyperdm/native_host/ native-messaging host + Unix-socket IPC to the app
extension/ Manifest V3 extension (Chrome + Firefox)
packaging/ desktop entry, icon, PKGBUILD, AppImage, extension build
tests/ pytest suite
One thing to know if you touch site detection: the "is this a video page?"
logic exists twice — hyperdm/core/ytdlp_downloader.py::is_video_page_url and
extension/common.js::isVideoPage. They must stay in sync; if they diverge, a
download silently goes to the wrong engine and produces a broken file. Both
files carry a comment pointing at the other, and both are covered by tests.
Troubleshooting
"App not running" in the extension. Start HyperDM. If it is running, the
native-messaging host may not be registered for your browser — re-run
./install.sh (and --chrome-id <ID> for Chrome).
A video downloads without sound, or fails at "merging". ffmpeg is
missing. High-quality streams are stored as separate video and audio tracks and
need it to combine them.
A YouTube download fails with an extractor error. yt-dlp goes stale when
sites change. Update it:
.venv/bin/pip install -U yt-dlp
Downloads are slower than expected. Some servers cap per-connection speed (more connections help) and others cap per-IP (they won't). Try raising Connections per download; if nothing changes, the server is the limit.
Metadata
Release files for hyperdm 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hyperdm-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Release files / hyperdm-0.2.0-py3-none-any.whl
| Download URL | hyperdm-0.2.0-py3-none-any.whl |
|---|---|
| Size | 104.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e23cfb7492f46cc82312283c130811f95980bac22463364ce82f08c047b68276
|
|
BLAKE2b-256 checksum How to use checksums |
203a5a9f65b2e1fb5b469c41b087bcfb35545298bba63485ffed1a10fe30958c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|