Sonarr can send quality as a plain string instead of the nested
{"quality": {"name": ...}} object. Guard with an isinstance check
and fall back to using the string value directly.
https://claude.ai/code/session_0188gygwJLdYhxbKvEz2jFjr
The lifespan constructor parameter was added in FastAPI 0.93. When
running outside Docker with an older system-packaged FastAPI, the
parameter is silently ignored — the app starts and serves routes but
init_db() and start_presence() never run, so the bot never goes online
and webhooks crash with "Database not initialised".
on_event("startup")/on_event("shutdown") work across all FastAPI
versions.
https://claude.ai/code/session_019ANRdyL2jfi7ysWhqN4PfD
matrix-nio's set_presence() doesn't raise on failure — it returns a
PresenceSetError object. The code was ignoring the return value, so the
bot would silently fail to go online even with valid credentials.
https://claude.ai/code/session_019ANRdyL2jfi7ysWhqN4PfD
_set_presence was catching all exceptions and logging them at DEBUG
level, which meant connection failures (bad token, unreachable
homeserver, etc.) were completely hidden at the default INFO log level.
The bot would appear to start normally but never actually go online.
Now the initial presence call in start_presence() propagates errors so
startup fails visibly if the Matrix connection doesn't work. The
background heartbeat loop still catches errors but logs them at WARNING.
https://claude.ai/code/session_019ANRdyL2jfi7ysWhqN4PfD
Adds `python -m app --check` which verifies:
- All required environment variables are set
- Matrix homeserver is reachable
- Bot access token is valid
- Bot is a member of the announcements room
- Database path is writable
Uses color-coded pass/fail output with actionable hints on failure.
Configures nio with a 10-second timeout and no retries so checks
complete quickly even against unreachable servers.
https://claude.ai/code/session_01DuzWyMMXvLMB4VxEwJyV4X
Replace the brief *arr configuration section with step-by-step
setup guides for Radarr, Sonarr, and Lidarr individually, including
field-by-field tables, a prerequisite health check, and a
troubleshooting section for common webhook issues.
https://claude.ai/code/session_01DuzWyMMXvLMB4VxEwJyV4X
matrix-nio's AsyncClient.set_presence() is called every 60s in a
background task so Matrix clients see the bot as online. On shutdown
the bot sets itself to offline.
https://claude.ai/code/session_01DuzWyMMXvLMB4VxEwJyV4X
Replace Bellhop scaffolding with full Melora implementation:
- FastAPI webhook endpoints for Radarr, Sonarr, and Lidarr
- matrix-nio integration with threaded room posting
- SQLite for thread root persistence and event deduplication
- Message formatting with plain text and HTML for each media type
- Shared secret authentication via X-Arr-Webhook-Secret header
- Updated dependencies, configuration, and documentation
https://claude.ai/code/session_01DuzWyMMXvLMB4VxEwJyV4X