-
Notifications
You must be signed in to change notification settings - Fork 0
Configuration
All configuration lives in config.yaml. The repo ships a fully annotated config.example.yaml — copy it and edit. Most options are also editable from the Web UI Settings page, which writes back to the same file. The scheduler reloads config.yaml from disk before every scan, so changes take effect on the next cycle without a restart. The one exception is web.port, which requires a restart.
qbittorrent:
url: http://192.168.1.100:8080
username: admin
password: changeme
arrs:
sonarr:
enabled: true
url: http://192.168.1.100:8989/sonarr # include the base path if you use one
api_key: your_api_key
radarr:
enabled: true
url: http://192.168.1.100:7878/radarr
api_key: your_api_key
lidarr:
enabled: false
url: ~
api_key: ~| Setting | Purpose |
|---|---|
qbittorrent.url |
qBittorrent Web UI URL including port |
qbittorrent.username / password
|
qBittorrent Web UI credentials |
arrs.<app>.enabled |
Whether this *arr client is active |
arrs.<app>.url |
The *arr URL, including any base path (e.g. /radarr) |
arrs.<app>.api_key |
Found in the *arr under Settings → General |
Rules decide what counts as a bad torrent. Each rule watches one qBittorrent category and ties it to one *arr app. See Rules for the full breakdown.
rules:
- name: "TV Bad Extensions"
category: "tv-sonarr"
app: sonarr
conditions:
match_mode: any
bad_extensions: [".exe", ".bat", ".msi", ".scr", ".lnk"]
min_file_size_mb: ~
bad_filename_patterns: []on_arr_failure: delete # "delete" or "abort"
poll_interval_seconds: 300
dry_run: false| Setting | Purpose |
|---|---|
on_arr_failure |
delete removes the torrent from qBittorrent even if the *arr blocklist call fails; abort skips deletion and queues a retry |
poll_interval_seconds |
How often the scheduler daemon scans (default 300) |
dry_run |
true logs matches but takes no action — ideal for testing a new rule |
retry:
enabled: true
max_attempts: 10
interval_seconds: 600When an *arr call fails and on_arr_failure is abort, the torrent is queued and retried up to max_attempts times, interval_seconds apart.
See Notifications for Pushover setup.
notifications:
pushover:
enabled: true
app_token: your_app_token
user_key: your_user_key
notify_on: [action, error, startup, dry_run]
priority: 0Enables indexer health scoring, auto-reorder, and grab attribution. See Prowlarr Indexer Scoring for the full explanation of each weight.
prowlarr:
enabled: true
url: http://192.168.1.100:9696/prowlarr # include base path if used
api_key: your_api_key
base_priority: 10
reorder_interval_hours: 24
history_window_days: 90
min_grabs_before_scoring: 10
scoring:
response_time_weight: 0.25
failure_rate_weight: 0.30
malicious_weight: 0.20
grab_success_weight: 0.25
auth_failure_mult: 3.0
grab_failure_mult: 2.0
query_failure_mult: 1.0
rss_failure_mult: 0.5
backoff_penalty: 20
malicious_penalty_per_hit: 10| Setting | Purpose |
|---|---|
base_priority |
Priority number given to the best-scoring torrent indexer; others count up from here. Keep it above your NZB indexers' priority numbers so they stay on top |
reorder_interval_hours |
How often the auto-reorder runs |
history_window_days |
Rolling window for response-time and failure-rate scoring |
min_grabs_before_scoring |
Indexers with fewer history records than this show N/A instead of a score |
scoring.* |
Weights and multipliers for each scoring factor — see Prowlarr Indexer Scoring |
Note: The
scoringblock is preserved when you save from the Settings page even though it has no form fields there. Edit those weights inconfig.yamldirectly.
Optionally point Inspectarr at a local Ollama instance to enable AI-powered health scoring. When configured, the LLM receives every indexer's full statistics — query counts, grab counts, failure rates broken out by type (queries, grabs, RSS, auth), response times, and the deterministic health score — and returns its own 0–100 score with reasoning. The AI score replaces the deterministic score when available.
If Ollama is not configured, not reachable, or returns an error, scoring falls back to the deterministic formula silently — AI is never required.
prowlarr:
ollama:
url: http://192.168.1.125:11434 # Ollama API base URL
model: gemma4:latest # any model Ollama has pulled
timeout: 120 # request timeout in seconds| Setting | Purpose |
|---|---|
ollama.url |
Base URL of your Ollama instance (the /api/generate endpoint is appended automatically) |
ollama.model |
Model name exactly as shown by ollama list
|
ollama.timeout |
How long to wait for a response before falling back to deterministic scoring (default 120) |
Leave the entire ollama: block out (or set url to empty) to disable AI scoring entirely.
web:
port: 8585
scheduler_autostart: false
auth:
enabled: false
username: admin
password: changeme| Setting | Purpose |
|---|---|
web.port |
Web UI port (default 8585). Changing this requires a restart |
web.scheduler_autostart |
true starts the scheduler automatically on launch |
web.auth.* |
HTTP basic auth — see Authentication |
logging:
log_file: ./data/inspectarr.log.json
retention_days: 30
level: INFO # set to DEBUG for verbose output
state:
db_file: ./data/inspectarr.db| Setting | Purpose |
|---|---|
logging.log_file |
Path to the JSON Lines event log |
logging.retention_days |
Records and log entries older than this are pruned on startup |
logging.level |
INFO or DEBUG
|
state.db_file |
Path to the SQLite database |