What's fixed
KOReader sync now propagates reading progress to Hardcover, the same way Kobo sync already did. If you've been running KOReader sync + Hardcover side-by-side and seeing your KOReader progress update in Calibre-Web but never reach Hardcover, this is the fix. Backport of crocodilestick/Calibre-Web-Automated#1324 by @frbncis. Maps to widely-reported CWA #1026 (31 comments) and similar threads.
Run it
docker pull ghcr.io/new-usemame/calibre-web-nextgen:v4.0.30
Or use :latest to track the rolling tag. Same compose, swap the image, restart. Make sure config_hardcover_sync is on globally and your user profile has a Hardcover token; from there KOReader pushes pick up automatically.
Regression coverage
6 new unit tests pin the new behavior: signature change (user, book, progress_percentage — kosync caller has no Flask current_user), source-pin that kosync.update_progress actually calls the Hardcover push after a successful write, the book_id gate so unmatched documents don't trigger noisy retries, and a hermetic behavioral test through a mocked HardcoverClient.
Credits
Original patch: @frbncis. Anyone hitting CWA #1026 or related KOReader-Hardcover-not-working symptoms — :latest carries the fix.