Native pull-mirror of github.com/Kheopsian/Hydra (auto-sync every 8h). Read-only upstream tracker.
  • Rust 81.6%
  • JavaScript 11.6%
  • CSS 2.4%
  • HTML 1.9%
  • Shell 1.2%
  • Other 1.2%
Find a file
2026-10-20 11:39:23 +00:00
.github ci: start the build cache afresh, without a removed binary's build 2026-10-17 21:26:34 +00:00
configs fix(config): resume_fast_secs reaches the engine from its session section 2026-10-20 11:33:38 +00:00
docs feat(dedup): reflink as a link method, picked from a three-way choice in the Config tab 2026-10-20 07:00:10 +00:00
packaging fix(install): the controller version must be a plain version number before it builds a download URL 2026-10-20 11:33:37 +00:00
scripts feat(dedup): recognise data we already hold, whatever it is called 2026-09-11 21:03:58 +02:00
third_party test(dht): the nesting pre-scan steps over integers and survives a datagram cut short 2026-10-17 22:41:32 +00:00
tools feat(trackers): UDP trackers, BEP 15 with BEP 41 2026-09-30 20:33:45 +02:00
typhon-engine release: v4.5.4 -- a write the store did not keep is never acknowledged 2026-10-20 11:39:23 +00:00
web fix(web): an RSS article title links out only for an absolute http or https address 2026-10-20 11:33:38 +00:00
.dockerignore build: cache the Rust dependency tree, locally and in CI 2026-09-03 13:50:24 +02:00
.gitignore fix(categories): stop offering the routing 4.x never applied 2026-09-30 17:06:42 +02:00
CHANGELOG.md release: v4.5.4 -- a write the store did not keep is never acknowledged 2026-10-20 11:39:23 +00:00
docker-compose.yml fix(docker): keep NET_ADMIN after the drop whenever the container was granted it 2026-10-16 17:21:01 +00:00
Dockerfile feat(install): --harden and --listen for install.sh, HYDRANOS_HEAP_PROFILE=off for the image 2026-10-16 21:29:39 +00:00
entrypoint.sh feat(install): --harden and --listen for install.sh, HYDRANOS_HEAP_PROFILE=off for the image 2026-10-16 21:29:39 +00:00
install.sh fix(install): the controller version must be a plain version number before it builds a download URL 2026-10-20 11:33:37 +00:00
LICENSE Hydra — high-scale BitTorrent engine (initial public release) 2026-07-28 14:10:12 +02:00
README.md docs(readme): what 4.4 brings, and the new wiki pages 2026-10-11 15:09:09 +02:00
SECURITY.md docs: bring README, API.md, conformance and SECURITY up to 4.4 2026-10-10 20:21:08 +02:00

Hydranos

A self-hosted BitTorrent daemon built for scale and seeding: one Rust process ("Typhon") holding a very large catalogue and keeping every torrent of it announced. Hydranos runs over a million torrents in a single instance in production today. It exposes a live web UI, a native REST API, and a qBittorrent-compatible shim so your existing *arr / autobrr / cross-seed setup keeps working unchanged.

Status: opened up from a private homelab project. It is used in production but some rough edges remain; issues and PRs welcome.


Why Hydranos?

Most BitTorrent clients are designed around a few thousand torrents, and do that very well. At hundreds of thousands the constraints change: how long the client takes to start, and whether every torrent is still announced on schedule. A torrent the tracker has not heard about is a torrent nobody downloads from you. Hydranos is built around those two constraints, and around three uses of one instance:

  • Hoard. Seed a very large library and keep all of it announced: over a million torrents in production today.
  • Race. Grab and seed new releases fast. Hydranos runs a race engine and a hoard engine side by side in one process, each tuned for its job, so a large library never slows a race down.
  • Stay light. Holding 290,000 torrents took 2.8 GiB of RAM (about 10 KiB per torrent, measured on 4.2), where the other clients we measured needed 12 to 31 GiB.

How Hydranos and three other clients behave at 290,000 torrents, measured on the same machine.

And your automation keeps working: the qBittorrent v2 API shim means Sonarr/Radarr, autobrr and cross-seed talk to Hydranos unchanged.

If you seed a few hundred torrents, qBittorrent or Transmission will serve you with less to learn.

Also in the box:

  • Networking per engine: managed WireGuard (a tunnel per engine, with port forwarding), gluetun, SOCKS5 or a PROXY-v2 relay, an interface pin, and a kill switch that keeps an engine off the network when its way out is down.
  • qBittorrent's day-to-day features: the download queue (including "do not count slow torrents"), share limits, speed limits, RSS feeds with automatic download rules, file priorities, sequential download, magnets, UDP trackers and LSD.
  • Several machines behind one UI: engines on other machines enrol as nodes, and torrents move between them.
  • Existing data: an add hash-checks what is already on disk instead of downloading over it, and a qBittorrent library can be imported as is.
  • Observability: Prometheus /metrics, a benchmark tab with a line speedtest and before/after comparison, and an MCP server for AI assistants.
  • Linux (Docker or bare metal) and Windows.

For tracker operators

What Hydranos puts on the wire is documented, rule by rule, in docs/BITTORRENT-CONFORMANCE.md. Every claim there names the test that asserts it: the unit suite runs offline in seconds, and tools/interop/run.sh runs the client against opentracker, Torrust in private mode and qBittorrent/libtorrent, reading the verdict from their state rather than ours. Both run on every push. In short:

  • Session counters. uploaded/downloaded count from started, never the lifetime total; left comes from the pieces held.
  • BEP 3 events per tracker. started, completed (once, to every tracker that saw us leech, retried if one is down) and stopped; a cross-seed is never a snatch.
  • Your floors hold. min interval, BEP 31 retry in and Retry-After are obeyed per tracker, races included. Only a re-announce a person forces crosses min interval, as qBittorrent's does. An unregistered race is retried every 5 s for 6 minutes (registration_retry_minutes), the window autobrr uses. BEP 12 tier order is respected, and tracker id is echoed back.
  • One identity. Peer id -HY####-, the same to every tracker and every peer, User-Agent: Hydranos/<version>, a stable secret key. No client spoofing.
  • Private torrents stay private (BEP 27): no DHT, PEX, hole punching or LSD, and peers named by other peers are ignored.
  • Scrape only for what is not announced yet. Swarm counts come from the announce response; a torrent no tracker has answered for (queued at boot, stopped) is scraped (BEP 48 / BEP 15) for its counts and nothing else.

Screenshots

All screenshots below are taken with incognito mode on: torrent names, categories, paths, IPs and tracker hostnames are replaced by stable fakes.

Overview — live dashboard: global up/down, seeding/leeching counts, per-session throughput.

Overview

Race — one finished race in detail: where it placed in the swarm, how the download went, which peers it came from, and what it has uploaded since.

Race

Hoard — the long-term seeding library, filtered by tracker, state and category.

Hoard

Trackers — one row per tracker actually announced to: passkey override, announce IP family, seed obligation, and the errors seen in the last hour.

Trackers

Benchmark — traffic per engine, disk and cache health, and whether the announces keep up with the catalogue, from fifteen minutes to thirty days; plus a line speedtest and a before/after comparison around a change.

Benchmark

Workflows — rules over the library, built from conditions and actions and previewed before they run. Here: tag every torrent in the media categories whose files have no hardlink outside Hydranos, i.e. that can be deleted without losing anything.

Workflows


Documentation

Install steps, architecture, every networking mode and the edge cases live in the Wiki:

API reference: docs/API.md. Companion VPS relay: hydra-relay.


License

Hydranos is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE. In short: you're free to run, study, modify, and share it, including self-hosting a modified version, but if you offer a modified Hydranos to others over a network, you must make your source available under the same license.