# HeapLeach
**Paste a heap of links. Download them together.**
A bulk download manager for **180+ sites**, with a web UI and a command-line
mode. Expand albums, folders and playlists into a queue, download files in
parallel, and resume interrupted transfers. Runs on **Linux, macOS, Windows
and Docker**; the web UI is built into the executable.
[](https://github.com/JohanLindvall/HeapLeach/actions/workflows/ci.yml)
[](https://github.com/JohanLindvall/HeapLeach/releases/latest)
[](LICENSE)
[**Download**](https://github.com/JohanLindvall/HeapLeach/releases/latest) ·
[Quick start](#quick-start) · [Documentation](docs/README.md) ·
[Supported sites](#supported-links) · [Contribute](CONTRIBUTING.md) ·
[Get help](SUPPORT.md)
## Why HeapLeach?
- **Batch downloads:** paste one link per line; supported albums, folders and
playlists expand automatically.
- **Resumable transfers:** keep partial files, retry failures, and continue
after an interruption.
- **Control your bandwidth:** adjust parallel downloads, connections per file
and the native download speed limit while the queue runs.
- **A queue you can navigate:** search, filter, pause, retry individual files,
and inspect logs from the browser. Light, dark and mobile layouts included.
- **Desktop or automation:** open the local web UI, pass URLs to the CLI,
or run the Docker image on your server.
- **One application:** Go backend and embedded React UI. Releases include
local CAPTCHA model data; Docker also includes the media helpers.
## Quick start
### Download and run
1. Open the [latest release](https://github.com/JohanLindvall/HeapLeach/releases/latest)
and choose the archive for your system:
| System | Archive ending |
| --- | --- |
| Linux, Intel / AMD 64-bit | `linux_amd64.tar.gz` |
| Linux, ARM64 | `linux_arm64.tar.gz` |
| macOS, Apple silicon | `darwin_arm64.tar.gz` |
| macOS, Intel | `darwin_amd64.tar.gz` |
| Windows, Intel / AMD 64-bit | `windows_amd64.zip` |
2. Extract the **whole archive** into a folder. Keep `ocr/` beside the
executable. No Go or Node.js installation is needed.
3. Run `heapleach` (`heapleach.exe` on Windows). It opens your browser and
saves to your Downloads folder.
4. Paste your links, one per line, and click **Add to queue**.
Terminal commands for Linux, macOS and Windows
Run these from a folder containing only the archive version you want to use.
```bash
# Linux x86-64; use linux_arm64 for an ARM64 machine.
tar -xzf heapleach_*_linux_amd64.tar.gz
./heapleach
```
```bash
# macOS Apple silicon; use darwin_amd64 for an Intel Mac.
tar -xzf heapleach_*_darwin_arm64.tar.gz
./heapleach
```
```powershell
# Windows PowerShell
Expand-Archive -Path .\heapleach_*_windows_amd64.zip -DestinationPath .\heapleach
.\heapleach\heapleach.exe
```
An argument-free launch uses a free local port. After you close the browser,
it exits once downloads are idle and no tab has connected for a minute.
Unfinished jobs return **held** after a restart; click **Resume** to continue.
See [installation and updates](docs/installation.md) for checksums, Docker
persistence, source builds and platform notes.
### Docker
On Linux or macOS with Docker, run:
```bash
mkdir -p "$HOME/Downloads"
docker run --rm -it --name heapleach \
-p 127.0.0.1:8080:8080 \
--user "$(id -u):$(id -g)" \
-e HEAPLEACH_STATE=/downloads/.heapleach-state/queue.json.zst \
-v "$HOME/Downloads:/downloads" \
ghcr.io/johanlindvall/heapleach:latest
```
Open **[localhost:8080](http://localhost:8080)**. Downloads and queue state stay
in your Downloads folder when the container stops. The image supports amd64
and arm64 and includes yt-dlp, ffmpeg, ffprobe, deno and local OCR. `latest`
follows successful main builds; use a [versioned image](docs/installation.md#docker-and-persistent-state)
to pin a manual release.
The web UI has no login. The command above publishes it only on your computer;
see [network access](#network-access-and-trust) for remote deployments.
## Usage
```bash
# Open the UI on a free local port and choose the destination.
./heapleach -addr 127.0.0.1:0 -open ~/Downloads
# Download a list of URLs, then exit. Blank lines and # comments are ignored.
./heapleach - ~/Downloads < urls.txt
# Limit native download speed and parallel transfers.
./heapleach -addr 127.0.0.1:8080 -concurrency 4 -max-speed 10MB ~/Downloads
# Show every command-line option.
./heapleach -help
```
`urls.txt` contains your own URLs, one per line. On PowerShell, use
`Get-Content .\urls.txt | .\heapleach.exe -` to feed a list to the CLI.
To pass URLs directly, quote each one, especially links containing `&` or `#`.
The CLI exits `0` on success, `1` if any input or download fails, and `130`
after Ctrl-C. Partial files remain available for resume. Native transfers
honor the shared speed limit; external helpers use their own controls.
[Full usage guide](docs/usage.md) · [Configuration](#configuration) ·
[Troubleshooting](SUPPORT.md)
## Supported links
File hosts, image galleries, video sites, broadcasters, image boards and
compatible platforms are supported, including:
| Content | Examples |
| --- | --- |
| Files and folders | gofile, bunkr, MEGA, pixeldrain, MediaFire, Dropbox |
| Video and playlists | YouTube through yt-dlp, Vimeo, PeerTube |
| Broadcasts | SVT Play and other supported broadcasters |
| Galleries and collections | Chevereto, image boards, Internet Archive |
| Direct and embedded media | File URLs, HLS playlists (a DASH `.mpd` is refused with the reason), open directories, supported links embedded in webpages |
Some workflows need [optional helpers](#optional-helpers). Support depends on
what a host makes available; see [accepted URL formats and limitations](docs/supported-links.md).
Sites change, so fixture tests alone cannot guarantee current live support.
### Every supported site
Expand the complete site inventory, generated from the extractor registry
98 extractors, each chosen by what a page serves rather than by its domain, so a site that moves, or an install nobody listed, is still recognised.
| Extractor | Recognises |
|---|---|
| `4chan` | 4chan threads (`//thread/`) whose page renders the thread's own `t` container on the board and names the site |
| `abclisten` | episodes and programmes (`/listen/programs/…`) of ABC listen, by the page props its `__NEXT_DATA__` island carries |
| `alohatube` | Aloha Tube view pages (`/ktm/view.cgi?gid=`) that frame another site's player (an off-site `