Bug Fixes
- Scheduler serialization failure — Replaced SQLAlchemyJobStore with MemoryJobStore. The SQLAlchemy job store failed to serialize the SQLCipher creator() closure, preventing the scheduler from starting. Jobs are re-scheduled from DB on startup so persistence is unnecessary.
- "Database is locked" cascade — Added PRAGMA busy_timeout=5000 to both the creator closure and pragma listener. Connections now wait 5 seconds for locks, preventing the cascade that made the app unresponsive during library sync.
UX Improvements
- Library sync loading overlay — persistent fullscreen spinner during sync, polls new /api/library/sync-status endpoint, auto-refreshes on completion
- Default preset — "Weekly Cutoff Unmet" instead of "Custom" for new queues
- Adaptive cooldown help text — explains the adaptive mode behavior in the queue modal
- Auto-save before test — Discord and Prowlarr test buttons now save config first, then test
- Docker URL hints — Prowlarr URL field shows Docker networking suggestions
- Search activity terminology — "items_found" renamed to "eligible", "searches_triggered" shown as "searched"
- Indexer health widget — columns now show Query Limit (100/day), Queries Used (42 of 100), truncated to 5 with expand
Stats
- 744 tests passing (up from 731 — scheduler fix resolved 13 pre-existing failures)
- Also fixed: pyproject.toml authors field
Full Changelog: v0.4.0...v0.4.1