A headless JDownloader and pyLoad alternative for Docker, your home server or NAS.
Paste links or send them with Click'n'Load. Your server downloads, extracts and sorts them,
your browser shows it live. One Rust binary, a web UI and hoster plugins in TypeScript.
Features • Hosters • Plugins by an agent • Quick start • Documentation • Contributing
JDownloader has the best hoster support there is, but it is a Java desktop app; on a server it runs behind VNC or a cloud remote. pyLoad is made for servers, but many of its hoster plugins have fallen behind. Haul is one small container built for a home server:
- Headless from the start: one Rust binary with an embedded web UI, no desktop, no VNC, no account in someone's cloud.
- Light: a Debian slim image with
7zandunrar, SQLite, nothing else to run. - Hoster plugins you can fix yourself: small TypeScript files, loaded from
/config/pluginswith one click, and a debug mode that saves exactly the pages a hoster sent. - …or let an AI agent write them: the repository comes with a Claude Code skill. Name a hoster, and the agent writes the plugin and its tests, tries it on the real hoster and fixes it when the hoster changes its pages.
It runs wherever Docker or Podman runs: a Linux server, a NAS like Synology or Unraid, or an arm64 board like the Raspberry Pi. Without Docker it installs as a single binary with a systemd service.
- Downloads: parallel queue, segmented downloads over range requests, resume after restarts, retries with backoff, global bandwidth limit, live progress over Server-Sent Events
- Hoster support: premium accounts, free downloads with countdowns and waits, folder links resolved into their files, hoster-wide limits respected
- Captchas: simple ones solved by Haul, image captchas typed in the banner, reCaptcha, hCaptcha and Turnstile solved in your own browser through a userscript
- Link grabber: online check, package name, target folder and password before you start; pick single files with checkboxes
- Browser extension for Chrome and Firefox: Click'n'Load 1 and 2 without anything running on your desktop, and Send to Haul in the right-click menu
- Auto-extract of RAR, 7z and ZIP with progress, a password list that learns, and incomplete multi-part sets left alone until they are complete
- Checksums verified where the hoster publishes them (MD5, SHA-1, SHA-256, MEGA MAC)
- Done view: the download folder as it is on disk, with extract, move and delete
- Password-protected files and folders, asked for in the UI when needed
- English and German UI, including every message from the server and the plugins
| Hoster | Free | Account | Folders |
|---|---|---|---|
| 1fichier | ✅ | API key | ✅ |
| Datanodes | ✅ | ✅ | |
| ddownload | ✅ premium | ||
| FileQ | ✅ | ✅ | |
| Filekeeper | ✅ | ✅ | |
| Gofile | ✅ | API token | ✅ |
| Google Drive (incl. Docs export) | ✅ | browser cookies | ✅ |
| MEGA | ✅ | ✅ | ✅ |
| Mediafire | ✅ | ✅ | ✅ |
| Send (send.now, send.cm, tusfiles, userscloud) | ✅ | ✅ premium, API key | ✅ |
Plus every direct HTTP(S) link. Details per hoster: Hosters in the documentation.
Start Claude Code in a checkout of Haul and say which hoster you
need. The skill in .claude/skills/hoster-plugin tells
the agent how plugins are made here:
> Write a plugin for example-hoster.com: free downloads and premium accounts, with folder links.
- It starts from the closest existing plugin and reads the hoster's pages, with a browser too if you connect Playwright MCP.
- It writes the plugin with tests against those pages.
- It tries the plugin on the real hoster with
haul probe: check, resolve, download, compare name, size and checksum, and fixes it until the download works. - When a hoster changes its pages later, it repairs the plugin from the pages Haul saved.
You give it a test file and an account where one is needed, and solve the captchas. Drop the
built plugin into /config/plugins, or open a pull request so everyone gets it. How it works,
what it needs and what it may do: Plugins with Claude Code.
mkdir haul && cd haul
curl -O https://raw.githubusercontent.com/firsttris/haul/main/docker/docker-compose.yml
# set APP_SECRET (openssl rand -hex 32) and your download folders, then
docker compose up -dOpen http://localhost:8080, create your login and add your hoster accounts under Accounts & plugins.
docker run
docker run -d --name haul --restart unless-stopped \
-p 8080:8080 -p 127.0.0.1:9666:9666 \
-v ./config:/config \
-v ./downloads/tmp:/downloads/tmp \
-v ./downloads/done:/downloads/done \
-e APP_SECRET="$(openssl rand -hex 32)" \
tristanteu/haul:latestPodman Quadlet
mkdir -p ~/.config/containers/systemd ~/haul/config ~/haul/downloads/{tmp,done}
curl -o ~/.config/containers/systemd/haul.container https://raw.githubusercontent.com/firsttris/haul/main/docker/haul.container
curl -o ~/.config/containers/systemd/haul.network https://raw.githubusercontent.com/firsttris/haul/main/docker/haul.network
# set APP_SECRET in haul.container, then
systemctl --user daemon-reload && systemctl --user start haulWithout Docker (systemd)
curl -fsSL https://raw.githubusercontent.com/firsttris/haul/main/scripts/install.sh | sudo shOne binary with the UI and plugins built in, run as a systemd service; the script also installs 7-Zip and unrar. Details: Without Docker.
| Volume | Content |
|---|---|
/config |
database and your own plugins |
/downloads/tmp |
downloads in progress |
/downloads/done |
finished downloads, one folder per package |
Everything else, from environment variables to a reverse proxy setup, is in the installation guide.
The full documentation, with search, is at firsttris.github.io/haul.
| Installation | Compose, Quadlet, volumes, environment variables, updates, reverse proxy |
| Hosters | accounts, passwords, checksums, waits and limits |
| Captchas | the userscript for reCaptcha, hCaptcha and Turnstile |
| Extraction | archives, passwords, incomplete sets, the Done view |
| Browser extension | Click'n'Load and Send to Haul in Chrome and Firefox |
| Click'n'Load | how links from link sites reach the server, haul-cnl |
| Architecture | how the server, queue, plugins and downloads fit together |
| Plugins | writing and debugging hoster plugins |
| Plugins with Claude Code | letting an AI agent write, test and repair a hoster plugin |
| Development | building, checks, architecture, API, releases |
Requires Rust (stable) and Bun 1.4 (the version in packageManager of package.json).
git clone https://github.com/firsttris/haul
cd haul
bun install
bun run dev # server on :8080, UI with hot reload on :5173, login admin / adminadminStack: Rust with tokio, axum, reqwest and SQLite · hoster plugins in TypeScript, run in QuickJS inside the server · React (rendered by TanStack Redact), TanStack Router, Query and Table, embedded in the binary. More in Architecture and the development guide.
A hoster changed its pages or one is missing? Issues and pull requests are welcome, plugins most of
all: see writing plugins, or let Claude Code write
one with the skill in the repository (Plugins with Claude Code).
Please run cargo test, cargo clippy, bun run test and bun run typecheck before opening a pull
request.
⭐ Like Haul? A star on GitHub helps others find it.
🐛 Report a bug · 💡 Request a feature
License: AGPL-3.0 · © Tristan Teufel and contributors
The hoster plugins are based in part on JDownloader's GPL code and stay under GPL-3.0-or-later.
Changed versions you pass on or run for others must offer their source code under the AGPL; a commercial license without these obligations is available via teufel-it.de.
Haul is not affiliated with any file hoster, JDownloader or pyLoad. Use it only for files you
are allowed to download, and within the terms of the hosters you use.