Offload slow file-host downloads to a cloud server, then grab the finished file at full speed.
Free tiers of many file hosts throttle downloads to a crawl — often ~50 KB/s. A single multi-gigabyte file can take 10–12 hours, during which you have to keep your home computer on and your connection tied up. If the download drops, you start over.
Don't download on your slow, always-on-only-if-you-leave-it-on home machine. Download on a cloud server instead:
- the server has fast, unmetered bandwidth and is always on, so a 12-hour trickle runs unattended;
- when it's done, you pull the finished file to your browser at full speed whenever you like — minutes instead of hours;
- you can even resume or use a multi-segment download manager (IDM, aria2, …) for the final hop.
WDownloader is a small web app that orchestrates exactly this. You paste a download command, it runs on one of your remote servers, shows you live progress, and hands the file back to you when it's ready.
┌────────────┐ paste wget cmd ┌──────────────┐ SSH + screen ┌───────────────┐
│ Browser │ ──────────────────▶ │ WDownloader │ ───────────────▶ │ Cloud server │
│ (you) │ ◀────────────────── │ (this app) │ ◀─────────────── │ runs wget │
└────────────┘ pull finished └──────────────┘ live progress └───────────────┘
▲ file at full speed │
└──────────────────────────────────────────────────────────────────────┘
file streamed back over SSH, on demand
- Paste a command. Grab a ready-made
wgetcommand from your browser with cliget (it captures the cookies and headers a logged-in file host needs), paste it, and the download starts by itself. - It runs remotely. The command is launched inside a
screensession on the first available server over SSH, with failover to the next one if a server is down. The app is stateless — the truth lives in the remotescreensessions, not in a database. - Watch progress. The dashboard polls every few seconds and shows the state of each download: percentage, size, speed, ETA.
- Get your file. When it's done, click download and the file is streamed from the server straight to your browser — optionally deleting it from the server afterwards.
- Paste-and-go — paste a
wgetcommand and it starts automatically; optional failover across multiple servers. - Live dashboard — percentage, size, speed, ETA, updated in place (no flicker).
- Pull to your device — stream a finished file from the server to your browser over SSH. Supports HTTP Range, so resuming and multi-segment download managers (IDM, aria2) work.
- Free disk per server — a strip shows how much room each server has left; it turns amber, then red, before a disk fills up and a download fails silently.
- Retry a failed download — one button relaunches it (the original command is remembered), no need to paste anything again.
- Completion notifications — optional browser notifications when a download finishes or fails.
- Bulk actions — delete all completed downloads, or pull them all, in one click.
- Concurrency limit & queue — cap how many downloads run per server; extra ones wait in a queue and start on their own as slots free up.
- Rename on the fly — give the file a different name; it keeps the real extension from the original command.
- Auto-delete after transfer (optional) — remove the file from the server once it has been fully delivered to you.
- English & Italian UI — auto-detected from the browser (English by default), switchable any time in Settings.
- Self-updating UI — an open tab notices a new deploy and reloads itself.
Dashboard: live downloads, free disk per server, queue, and one-click retry / pull.
Settings: SSH key, servers, per-server concurrency limit, auto-delete.
- One or more servers you can reach over SSH (any cheap VPS works), each with
wget,screen, and standard coreutils. - An SSH private key whose public half is in each server's
authorized_keys. - A host to run the app: a LazyCat NAS (packaged as an
.lpk), or any machine with Docker.
cd wdownloader-lzc
lzc-cli project build
lzc-cli app install cloud.lazycat.app.wdownloader-v*.lpkdocker run -d --name wdownloader \
-p 8000:8000 \
-e WD_VAR_DIR=/data \
-v wdownloader-data:/data \
fliva/wdownloader:latestThen open http://localhost:8000.
- Open Settings.
- Paste your SSH private key (it is never sent back to the browser after saving,
and is stored
0600on disk). - Add your servers (name, host, user, port, download directory).
- Optionally set the max downloads per server (0 = unlimited) and whether to auto-delete files after they've been pulled.
Downloading from a file host that requires a login is easiest with cliget (Firefox/Chrome extension):
- Start the download in your browser and cancel it.
- cliget gives you a full
wget/curlcommand including the session cookies and headers. - Paste it into WDownloader. Done.
pip3 install --user -r requirements.txt
WD_VAR_DIR=/tmp/wd-dev python3 -m uvicorn app.main:app --reload --port 8099Run the tests (plain assert, no framework — they monkeypatch SSH, so no servers
are needed). httpx is only required by fastapi.testclient:
pip3 install --user httpx
for t in tests/test_*.py; do python3 "$t"; doneThe stack is FastAPI + uvicorn, a single self-contained HTML page (no build step, no
external assets), and SSH/screen on the remote side.
WDownloader is a bandwidth-offloading tool. Use it only to download files you are entitled to — your own backups, legitimately purchased media, public datasets, Linux ISOs, and the like. You are responsible for what you download and for complying with the terms of the services you use.
MIT © 2026 Federico Liva


