Sign inSign up

tristanteu/haul

By tristanteu

•Updated about 15 hours ago

Self-hosted download manager for file hosters, with web UI, plugins and auto-extract

Image
0

1.2K

tristanteu/haul repository overview

Haul logo

⁠Haul: self-hosted download manager for file hosters

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.

CI Release Docker Pulls Image Size Platforms Rust Docs License: AGPL-3.0

Features⁠ • Hosters⁠ • Plugins by an agent⁠ • Quick start⁠ • Documentation⁠ • Contributing⁠

Haul web UI: download queue with four packages, five downloads running under a 60 MB/s limit

⁠💡 Why Haul?

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 7z and unrar, SQLite, nothing else to run.
  • Hoster plugins you can fix yourself: small TypeScript files, loaded from /config/plugins with 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.

⁠✨ Features

  • 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

⁠🗂️ Supported hosters

HosterFreeAccountFolders
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.

⁠🤖 Missing a hoster? Let an agent write the plugin

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.
  1. It starts from the closest existing plugin and reads the hoster's pages, with a browser too if you connect Playwright MCP⁠.
  2. It writes the plugin with tests against those pages.
  3. 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.
  4. 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⁠.

⁠🐳 Quick start

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 -d

Open 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:latest
Podman 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 haul
VolumeContent
/configdatabase and your own plugins
/downloads/tmpdownloads in progress
/downloads/donefinished downloads, one folder per package

Everything else, from environment variables to a reverse proxy setup, is in the installation guide⁠.

⁠📚 Documentation

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

⁠🛠️ Development

Requires Rust (stable), Node.js 22 and pnpm.

git clone https://github.com/firsttris/haul
cd haul
pnpm install
pnpm dev        # server on :8080, UI with hot reload on :5173, login admin / adminadmin

Stack: Rust with tokio, axum, reqwest and SQLite · hoster plugins in TypeScript, run in QuickJS inside the server · React, TanStack Router, Query and Table, embedded in the binary. More in Architecture⁠ and the development guide⁠.

⁠🤝 Contributing

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, pnpm test and pnpm 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.

Tag summary

Content type

Image

Digest

sha256:90e567741…

Size

40 MB

Last updated

about 15 hours ago

docker pull tristanteu/haul