NorviTech BitAgent

Suite / BitAgent

BitAgent

A self-hosted BitTorrent DHT crawler and indexer built for the *arr stack.

Evidence-driven classification, curation and opt-in LLM stages, with the operator console and public library in the same image. Descended from bitmagnet.

MITDocker ComposeGo · Python · PostgresTorznab · GraphQL

See it runSource on GitHubDocs

BitAgent crawls the DHT into a Postgres corpus, classifies every torrent it finds, and serves the result to Sonarr, Radarr, Lidarr, Readarr and Prowlarr over Torznab. What makes it different is the loop: it watches what your *arrs actually grab and keep, and feeds that back into what it indexes. It started in April 2026 as a fork of bitmagnet; the DHT crawler, metainfo fetcher, CEL classifier and the Postgres/GraphQL foundation are upstream's work and are credited as such.

What BitAgent adds

Ground truth from your *arr stack

Sonarr, Radarr, Lidarr and Readarr webhooks, a history poller and a qBittorrent poller land every signal in an append-only evidence table that resolves, by explicit precedence, into one canonical label per torrent.

Curation, not just collection

A deterministic content filter — language, lossy-audio-only music, NSFW, blocked extensions and content types, foreign audio — runs in pure Go with no network or database call per decision, and is anime-aware so watchable anime is never dropped on a script heuristic.

Titles that actually match

An LLM-free anime backbone recognises fansub brackets, absolute episode numbers and romaji season markers, backed by an alias table built from AniDB titles joined to TMDB mappings, so every romaji, kanji, English and fan alias resolves to one id.

Accurate swarm numbers

A BEP-15 UDP scrape worker refreshes seeders and leechers from public trackers at about seventy infohashes per datagram, replacing the crawler's one-node, never-refreshed estimate.

Observability that answers questions

A bitagent_* metric family for every subsystem — crawler, classifier, evidence, content filter, liveness, retention, each LLM stage — and counterfactual would_* metrics so you read the numbers before you flip a switch.

LLM stages, off by default

Four points in the pipeline can ask a model over any OpenAI-compatible endpoint, hosted or on your own LAN. Every stage runs in shadow mode first, daily and monthly budgets persist in Postgres, zero means stop, and anything from a private tracker never leaves the house.

The dashboard

Operator console

Indexer win rate, match rate, grab liveness, evidence per source, a quarantine you can spot-check, one scorecard per LLM stage with spend against budget, a read-only view of the running configuration, a search tester and a GraphQL explorer.

Public library

The same small FastAPI app, started and supervised by the Go core, serves a second hostname for browsing what the index holds. It reads the core over GraphQL and Prometheus on localhost and never writes.

Install

Docker Compose

Two containers, no accounts, no API keys: copy the example env, set one Postgres password, docker compose up -d --build. Metrics climb within a minute and the console is on port 8080. The exact commands are in the README.

Then wire the *arrs

Add the Torznab endpoint as an indexer in Prowlarr or each *arr, and point each *arr's webhook at BitAgent so the evidence loop closes. Per-app guides cover the clicks.

Documentation

Deployment and operations

Install, configure and verify BitAgent; plan authentication, backups, upgrades and recovery.

Read the deployment guide · Release procedure