Configuration
Everything narratorr-requests connects to — narratorr itself and your notifiers — is configured on
the admin Settings page, not in environment variables. The page has a left-nav with four
sections: General, Narratorr, Notifications, and System. Secret values are stored
encrypted at rest (the at-rest key comes from SETTINGS_KEY, or is derived from SESSION_SECRET
when that’s unset).
The Narratorr connection and every notifier have a Test button that validates the current form values without saving, so you can confirm something works before committing it. Each section saves on its own — a Save button appears once you’ve changed a value.
General — Public URL & default quota
Section titled “General — Public URL & default quota”Set the Public URL to where the app is reached (e.g. https://requests.example.com). It’s used
to deep-link notifications back to the request queue / users page, so an admin can jump straight
from a ping to the thing that needs action. Leave it blank and notifications simply omit the link.
This section also sets the app-wide default request quota — the rolling-window cap that applies to every user who hasn’t been given a per-user override (see Managing quotas). Two modes:
| Mode | Effect |
|---|---|
| No default cap | Unlimited requests for everyone without a per-user override. |
| Limit requests | A positive cap over a friendly window — day / week / month, mapped to a fixed 1 / 7 / 30-day rolling window (not a calendar period). |
There’s no DEFAULT_REQUEST_QUOTA environment variable — this lives entirely in Settings so it can
change without a redeploy.
Narratorr connection
Section titled “Narratorr connection”The lifeline — required for search and requests to work. Two fields:
| Field | Notes |
|---|---|
| Server URL | narratorr’s full base URL, including scheme and port (e.g. http://narratorr:3000). Add a subpath if narratorr sits behind a reverse-proxy (e.g. http://host:3000/lib). |
| API key | From narratorr → Settings → API. Masked once saved; leave blank to keep the current key. |
- Enter the Server URL and API key.
- Click Test — it validates the current values (using the stored key if you left the API key blank). Fix anything until it passes.
- Save.
Notifiers
Section titled “Notifiers”On the Notifications section you add any number of notifiers — there’s no fixed set of channels. Click Add Notifier, pick a type, choose the events it fires on, and fill in its fields. Each saved notifier has its own Test (sends a real sample) and Delete. There’s no enable/disable toggle — a notifier is live by existing; delete it to stop it.
Every notifier is admin-facing — notifications go to you, the admin, never the requester — and fires only on the events you select:
| Event | Fires when |
|---|---|
| New request | A user requested a book and it’s awaiting your review. |
| New signup | A new user signed up and is awaiting approval. |
| Request failed | An approved request couldn’t be acquired — so you can step in (manual search, deny, refund). |
| Type | Key fields |
|---|---|
| ntfy | Server URL (defaults to https://ntfy.sh), topic, optional access token, optional priority. |
| Email (SMTP) | Host / port, an implicit-TLS toggle (465 vs STARTTLS on 587), optional username / password, a From address, and the admin recipient. |
| Discord | A Discord webhook URL (optionally include the cover image). |
| Slack | A Slack incoming-webhook URL. |
| Telegram | Bot token + chat ID. |
| Pushover | App token + user key. |
| Gotify | Server URL + app token. |
| Webhook | A generic JSON POST to any URL — the escape hatch for anything not listed. |
How secrets are handled
Section titled “How secrets are handled”Every secret — the narratorr API key and all notifier credentials (tokens, keys, and capability
webhook URLs) — is never returned to the browser. A saved secret shows masked
(•••••••• (unchanged), or a host-only hint for a capability URL). On save:
- Leave a secret blank → the stored value is kept.
- Type a new value → it replaces the stored one.
- Clear it → it’s removed.
The Test button follows the same rule, so testing an existing connector with the secret left blank uses the stored secret — you don’t have to re-enter it just to test.
System Information
Section titled “System Information”A read-only section for a quick server/environment snapshot — no configuration here:
| Field | Shows |
|---|---|
| Version | The running narratorr-requests version. |
| Built | The image build timestamp. |
| Node.js | The Node.js runtime version. |
| OS | The host/container OS. |
| Database Size | The SQLite database file size. |
| narratorr | The connected narratorr’s version + reachability, sourced from narratorr’s own /api/v1/system — at a glance, without leaving Settings. |