docs: update README to reflect current feature state through Phase 4 + web UI

This commit is contained in:
2026-05-17 18:51:08 -07:00
parent 184d42907b
commit b94a169714
+43 -12
View File
@@ -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 02), 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 <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.
@@ -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.