kindexr

A Nostr-native Torznab indexer. Subscribes to NIP-35 torrent events on the Nostr relay network and serves them through the Torznab API that Sonarr, Radarr, Lidarr, Readarr, and Prowlarr already speak.

Same slot as Jackett or Prowlarr — middleware between Nostr and the *arr automation stack. Not a frontend, not a relay, not a downloader.

What it does

  • Connects to Nostr relays and indexes kind 2003 (NIP-35) torrent events into a local SQLite database
  • Serves indexed content as a Torznab API endpoint for *arr apps
  • Enriches metadata via TMDB (movies and TV shows get proper IDs for *arr matching)
  • Filters publishers using Web of Trust (WoT) — trust scores derived from your Nostr follow graph, with manual vouch/block/mute controls
  • Publishes torrents back to Nostr from a connected qBittorrent or Deluge instance
  • Fetches publisher profiles (kind 0) so you see names and avatars instead of raw pubkeys
  • Web UI at /ui — dashboard, indexed content browser, publisher management, publish queue, settings

Quick start

Build

just build
# produces target/release/kindexr and target/release/kindexr-cli

Configure

sudo mkdir -p /etc/kindexr /var/lib/kindexr
sudo cp deploy/kindexr.example.yaml /etc/kindexr/config.yaml
sudo $EDITOR /etc/kindexr/config.yaml

Create the service user:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin kindexr
sudo chown kindexr:kindexr /var/lib/kindexr

Install and start

sudo just install
sudo systemctl daemon-reload
sudo systemctl enable --now kindexr
sudo journalctl -u kindexr -f

Verify

curl http://localhost:9117/health
# {"status":"ok","version":"...","db_ok":true,"relays_configured":10,"relays_connected":10,"uptime_seconds":0}

Add to Sonarr/Radarr

Add kindexr as a Torznab indexer:

  • URL: http://127.0.0.1:9117 (or your public URL behind nginx)
  • API key: generate at /ui/settings or with kindexr-cli apikey create --label sonarr

Publishing to Nostr

kindexr can publish torrents back to the Nostr network as kind 2003 events. Two torrent clients are supported:

Deluge

Enable the Deluge poller in config or via the Settings UI. kindexr connects to the Deluge Web UI JSON-RPC API, polls for completed torrents, and publishes them. Set a label filter (e.g. publish-nostr) to only publish specific torrents, or leave labels empty to publish everything completed.

publisher:
  enabled: true
  nsec: "nsec1..."
  deluge:
    enabled: true
    url: "http://127.0.0.1:8112"
    password: "your-deluge-web-password"
    poll_interval_secs: 60
    labels: ["publish-nostr"]   # empty = all completed

qBittorrent

publisher:
  enabled: true
  nsec: "nsec1..."
  qbittorrent:
    url: "http://127.0.0.1:8080"
    username: "admin"
    password: "adminadmin"
    poll_interval_secs: 60
    categories: ["publish-nostr"]

Manual publish

Drop .torrent files into the publish queue via CLI:

kindexr-cli publish --from /path/to/torrents/

CLI

# API key management
kindexr-cli apikey create --label sonarr
kindexr-cli apikey list

# Publisher identity
kindexr-cli identity init                       # generate a fresh keypair
kindexr-cli identity init --nsec <nsec1...>     # import existing key
kindexr-cli identity info

# Enqueue torrent files for publishing
kindexr-cli publish --from /path/to/torrents/

Configuration

See deploy/kindexr.example.yaml for a fully commented configuration reference.

Config is loaded in order: defaults → YAML file → environment variables (KINDEXR_ prefix) → Settings UI (stored in SQLite, applied at startup).

Example env override:

KINDEXR_LOGGING_LEVEL=debug kindexr --config /etc/kindexr/config.yaml

Web UI

Available at http://localhost:9117/ui:

Page Path What it shows
Dashboard /ui Relay status, ingest stats, publish queue
Content /ui/content Browsable index of indexed torrents
Publishers /ui/publishers Publisher list with WoT trust levels
Queue /ui/queue Publish queue and history
Settings /ui/settings All config options, API key management

Development

just test    # cargo test
just check   # cargo clippy + fmt check
just build   # cargo build --release

For a local dev run without installing:

cp deploy/kindexr.example.yaml kindexr.dev.yaml
# edit kindexr.dev.yaml
./target/release/kindexr --config kindexr.dev.yaml
# UI at http://localhost:9117/ui

Architecture

See docs/ARCHITECTURE.md for the full design.

License

MIT

S
Description
Nostr Based torrent indexer
Readme 331 KiB
Languages
Rust 99.7%
Just 0.3%