When Radarr, Sonarr, or Overseerr is missing a URL or API key, the
stats API now returns 428 and the dashboard renders a full-page
setup form instead of the empty shell + fetch-error UI. The form
reuses the existing service/discord inputs (extracted out of the
settings modal so both can share them), and the background poller
skips silently until setup is complete.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Settings modal (gear icon) lets you configure all service URLs and API
keys from the dashboard; values persist to data/settings.json with
process.env as fallback so existing .env.local setups keep working
- Per-service Test button hits each service's status endpoint and reports
the version on success
- Discord webhook support: structured embeds per alert category (requesters,
approval age, episode progress, watch-rate stats) sent on new/reopened
alerts only — already-open alerts don't re-notify
- Alert detail page restructured: prose descriptions replaced with labelled
fields, episode progress bar for partial TV, watch-rate stat block,
View in Radarr/Sonarr/Seerr action buttons, requester names link to
Overseerr profiles, timestamps moved inline with status
- Tab state is pure client state (no ?tab= in URL); router.back() used
on alert detail for clean browser history
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>