Update README: fix wrong UI paths, fix publisher config nesting, remove nonexistent CLI commands, add nginx note

This commit is contained in:
2026-05-20 16:34:56 -07:00
parent 586b9cb51b
commit 1049da9730
+61 -64
View File
@@ -2,17 +2,17 @@
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.
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 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
- 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
@@ -51,81 +51,82 @@ sudo journalctl -u kindexr -f
```sh
curl http://localhost:9117/health
# {"status":"ok","version":"...","db_ok":true,"relays_configured":10,"relays_connected":10,"uptime_seconds":0}
# {"status":"ok","version":"0.1.0","db_ok":true,"relays_configured":7,"relays_connected":7,"uptime_seconds":12}
```
### Add to Sonarr/Radarr
### Add to Sonarr / Radarr / Prowlarr
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`
- 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 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.
```yaml
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
```
kindexr can watch a torrent client for finished downloads and post them to Nostr automatically.
### qBittorrent
```yaml
publisher:
enabled: true
nsec: "nsec1..."
identity:
nsec: "nsec1..."
qbittorrent:
url: "http://127.0.0.1:8080"
username: "admin"
password: "adminadmin"
password: "yourpassword"
poll_interval_secs: 60
categories: ["publish-nostr"]
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:
```yaml
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
Drop .torrent files into the publish queue via CLI:
```sh
kindexr-cli publish --from /path/to/torrents/
kindexr-cli publish --from /path/to/file.torrent
kindexr-cli publish --from /path/to/directory/ # scans for all .torrent files
```
## CLI
```sh
# API key management
# API keys
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
# 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
# Enqueue torrent files for publishing
kindexr-cli publish --from /path/to/torrents/
# 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 a fully commented configuration reference.
See `deploy/kindexr.example.yaml` for the full reference.
Config is loaded in order: **defaults → YAML file → environment variables** (`KINDEXR_` prefix) → **Settings UI** (stored in SQLite, applied at startup).
Example env override:
Config loads in order: **defaults → YAML file → environment variables → Settings UI**. Environment variables use the `KINDEXR_` prefix with `_` as the separator:
```sh
KINDEXR_LOGGING_LEVEL=debug kindexr --config /etc/kindexr/config.yaml
@@ -135,29 +136,25 @@ KINDEXR_LOGGING_LEVEL=debug kindexr --config /etc/kindexr/config.yaml
Available at `http://localhost:9117/ui`:
| Page | Path | What it shows |
| Page | Path | Description |
|---|---|---|
| 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 |
| 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
```sh
just test # cargo test
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
./target/release/kindexr --config kindexr.dev.yaml
# UI at http://localhost:9117/ui
just test # cargo test
just check # clippy + fmt check
just dev # run with kindexr.dev.yaml and RUST_LOG=info
```
## Architecture