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.

Fills the same slot as Jackett or Prowlarr — it sits between Nostr and your *arr apps. Not a frontend, not a relay, not a downloader.

What it does

  • Connects to Nostr relays and indexes torrent posts into a local SQLite database
  • Serves that content through the Torznab API for Sonarr, Radarr, etc.
  • Enriches metadata via TMDB so movies and TV shows match properly in *arr apps
  • Scores publishers based on who you follow on Nostr, with manual block controls
  • Watches qBittorrent or Deluge for finished downloads and posts them to Nostr automatically
  • Fetches publisher profiles so you see names and avatars instead of raw pubkeys
  • Web UI at /ui — dashboard, 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":"0.1.0","db_ok":true,"relays_configured":7,"relays_connected":7,"uptime_seconds":12}

Add to Sonarr / Radarr / Prowlarr

Add kindexr as a Torznab indexer:

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

Publishing to Nostr

kindexr can watch a torrent client for finished downloads and post them to Nostr automatically.

qBittorrent

publisher:
  enabled: true
  identity:
    nsec: "nsec1..."
  qbittorrent:
    url: "http://127.0.0.1:8080"
    username: "admin"
    password: "yourpassword"
    poll_interval_secs: 60
    categories: ["publish-nostr"]   # empty = publish everything that finishes

Deluge

Enable the Web UI plugin in Deluge preferences and log in at least once in a browser to set a password. Then:

publisher:
  enabled: true
  identity:
    nsec: "nsec1..."
  deluge:
    enabled: true
    url: "http://127.0.0.1:8112"
    password: "yourpassword"
    poll_interval_secs: 60
    labels: ["publish-nostr"]       # empty = publish everything that finishes

Manual publish

kindexr-cli publish --from /path/to/file.torrent
kindexr-cli publish --from /path/to/directory/   # scans for all .torrent files

CLI

# API keys
kindexr-cli apikey create --label sonarr

# Publisher identity (needed for publishing to Nostr)
kindexr-cli identity init                    # generate a fresh keypair
kindexr-cli identity init --nsec nsec1...   # import an existing key
kindexr-cli identity info                   # show the current key

# Publishers
kindexr-cli publisher list
kindexr-cli publisher block <pubkey>
kindexr-cli publisher unblock <pubkey>
kindexr-cli publisher trust <pubkey> --score 0.8

Configuration

See deploy/kindexr.example.yaml for the full reference.

Config loads in order: defaults → YAML file → environment variables → Settings UI. Environment variables use the KINDEXR_ prefix with _ as the separator:

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

Web UI

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

Page Path Description
Dashboard /ui Relay connection status, stats, recently indexed
Content /ui/indexed Browse and search all indexed torrents
Publishers /ui/publishers Publisher list with trust scores, block controls
Published /ui/published Posts you've published and the pending queue
Settings /ui/settings All config, API key management

Nginx

For public access put kindexr behind nginx. See deploy/nginx.conf.example for a ready-to-use config with TLS.

Development

just build   # cargo build --release
just test    # cargo test
just check   # clippy + fmt check
just dev     # run with kindexr.dev.yaml and RUST_LOG=info

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%