167 lines
4.5 KiB
Markdown
167 lines
4.5 KiB
Markdown
# 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
|
|
|
|
```sh
|
|
just build
|
|
# produces target/release/kindexr and target/release/kindexr-cli
|
|
```
|
|
|
|
### Configure
|
|
|
|
```sh
|
|
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:
|
|
|
|
```sh
|
|
sudo useradd --system --no-create-home --shell /usr/sbin/nologin kindexr
|
|
sudo chown kindexr:kindexr /var/lib/kindexr
|
|
```
|
|
|
|
### Install and start
|
|
|
|
```sh
|
|
sudo just install
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable --now kindexr
|
|
sudo journalctl -u kindexr -f
|
|
```
|
|
|
|
### Verify
|
|
|
|
```sh
|
|
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
|
|
|
|
```yaml
|
|
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:
|
|
|
|
```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
|
|
|
|
```sh
|
|
kindexr-cli publish --from /path/to/file.torrent
|
|
kindexr-cli publish --from /path/to/directory/ # scans for all .torrent files
|
|
```
|
|
|
|
## CLI
|
|
|
|
```sh
|
|
# 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:
|
|
|
|
```sh
|
|
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
|
|
|
|
```sh
|
|
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](docs/ARCHITECTURE.md) for the full design.
|
|
|
|
## License
|
|
|
|
MIT
|