diff --git a/README.md b/README.md index 3df14c3..a11c892 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,29 @@ # kindexr -A Nostr-native Torznab indexer. Bridges NIP-35 torrent events on the Nostr relay network into the Torznab API that Sonarr, Radarr, Lidarr, Readarr, and Prowlarr already speak. +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 that sits between Nostr and the *arr automation stack. Not a frontend, not a relay, not a downloader. +**Same slot as Jackett or Prowlarr** — middleware between Nostr and the *arr automation stack. Not a frontend, not a relay, not a downloader. -## Implementation +## What it does -The active implementation is **Rust** (`src/`, `Cargo.toml`). - -The original Go implementation lives in `archive/go/` and is kept for reference until the Rust version reaches Phase 1 parity. It is not maintained going forward. +- 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 ## Phase status -- [ ] Phase 0 — bootstrap (Rust): daemon boots, config, DB migrations, `/health`, journald JSON logging -- [ ] Phase 1 — reader, basic Torznab (Rust): relay subscription, kind 2003 indexing, `t=caps` + `t=search` -- [ ] Phase 2 — full *arr compatibility: structured ID matching, TMDB enrichment -- [ ] Phase 3 — curation: WoT filter, NIP-51 sets -- [ ] Phase 4 — writer/publisher: NIP-46 bunker, qBittorrent integration +- [x] Phase 0 — bootstrap: daemon boots, config, DB migrations, `/health`, journald JSON logging +- [x] Phase 1 — reader, basic Torznab: relay subscription, kind 2003 indexing, `t=caps` + `t=search` +- [x] Phase 2 — full *arr compatibility: TMDB enrichment, structured ID matching (imdb/tvdb/tmdb), tvsearch/movie/music queries +- [x] Phase 3 — curation: WoT filter (follows graph levels 0–2), NIP-51 mute lists, publisher trust scores, report tracking +- [x] Phase 4 — writer/publisher: NIP-46 bunker signing, qBittorrent watcher, torrent file parsing, publish queue +- [x] Web UI: dashboard, indexed browser with FTS search, publisher management with vouch/block/mute, publish queue view - [ ] Phase 5 — Blossom binary bridge +- [ ] Phase 6 — FIPS deployment ## Quick start @@ -56,7 +62,7 @@ sudo journalctl -u kindexr -f ```sh curl http://localhost:9117/health -# {"status":"ok","version":"...","db_ok":true,"relays_configured":6,"uptime_seconds":0} +# {"status":"ok","version":"...","db_ok":true,"relays_configured":3,"relays_connected":3,"uptime_seconds":0} ``` ### Add to Sonarr/Radarr @@ -66,6 +72,22 @@ 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 + +```sh +# 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 # 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. @@ -86,6 +108,15 @@ just check # cargo clippy + fmt check just build # cargo build --release ``` +For a local dev run without installing: + +```sh +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](docs/ARCHITECTURE.md) for the full design.