3d1acfdc044cec6c1e6af1e0068bbe39a1cb1984
Track the last seen event timestamp per relay in the DB. On startup, subscribe to kind 2003 per relay using that timestamp as since instead of always recomputing from backfill_days. Fresh relays with no stored timestamp fall back to the full backfill window.
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
- Optionally publishes torrents back to Nostr from a connected qBittorrent 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
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":3,"relays_connected":3,"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 with
kindexr-cli apikey create --label sonarr
CLI
# API key management
kindexr-cli apikey create --label sonarr
kindexr-cli apikey list
# Publisher identity (for publishing back to Nostr)
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).
Example env override:
KINDEXR_LOGGING_LEVEL=debug kindexr --config /etc/kindexr/config.yaml
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 — set database.path to /tmp/kindexr-dev.db, disable publisher
./target/release/kindexr --config kindexr.dev.yaml
# UI at http://localhost:9117/ui
Architecture
See docs/ARCHITECTURE.md for the full design.
License
MIT
Description
Languages
Rust
99.7%
Just
0.3%