- remove racy watch(loading)+loadIfSentinelVisible fallback that fired before RecycleScroller set virtual height
- add hasMore guard and total reset in useBookQuery for defensive correctness
- drop tags field and bookTags fan-out query from all BookCard paths
- drop metadataScore from BookCard select (only used in BookDetail)
- fix durationSeconds: was never selected in DB; derive audiobook badge from file format using FORMAT_TO_GROUP instead
- replace broken HSL approach with pure JS oklch-to-hex using exact --primary L/C from accents.css
- remove --chart-1..10 and --chart-icon-* CSS tokens
- remove dead --color-chart-* Tailwind bridge aliases
- inline CSS relative color syntax in ChartCard and StatisticsSummaryCard
- fix MetadataScoreDistributionChart mark area to rgba (ECharts-compatible)
- resolve all 69 client type-checking errors for stricter TS compliance
- remove obsolete type-check baseline scripts and files
- overhaul project root with updated README.md and new DEVELOPMENT.md
- migrate to unified baseline migration strategy and cleanup docker configs
- remove redundant production and dev-specific shell scripts
- replace shared 'providerId' key in pickedSources with provider-specific
field names (googleBooksId, goodreadsId, etc.) so each provider's ID
pick is independent and not overwritten when switching tabs
- extract candidate relevance scoring into candidate-relevance.ts with
Levenshtein-based title/author scoring, ISBN exact match, and junk
title filtering; remove duplicate inline scoring from goodreads provider
- implement HardcoverProvider (IdentifiableProvider) with ISBN, title+author, title-only search fallback chain
- add HardcoverClient with fixed-delay rate limiter using atomic slot reservation
- add hardcover.mapper.ts and hardcover.types.ts for clean separation of concerns
- fix cached_contributors as JSONB scalar (no subfield selection)
- fix null series position normalisation to undefined
- fix edition publishedYear fallback to book-level dates
- add 37 unit tests across mapper and provider
- update metadata-fetch.module.test.ts for HardcoverProvider registration
- split MetadataPreferencesSettings into Providers tab and new Field Rules tab
- update Hardcover favicon to assets.hardcover.app/static/favicon.ico
- split email into EmailSend (read/send) and ManageEmail (SMTP config); fix providers tab to be read-only for EmailSend
- add library reassignment to admin user form (GET/PUT /users/:id/libraries)
- hide Download, Edit Metadata, Delete actions throughout UI based on user permissions
- redirect non-manage_libraries users away from Libraries settings
- add audiobook reader with playback queue, progress tracking, and audio settings
- add narrator support with DB schema, module, and metadata extraction
- add Audible and Audnexus metadata providers with mappers and tests
- improve scanner with file classification, walk utilities, and file-event processing
- extend upload validator and processor for audio formats
- replace env-var SMTP config with DB-backed system mail provider
- add isSystemProvider flag to emailProviders table
- add SystemMailService for sending password reset emails
- add PATCH :id/system and DELETE system endpoints on email providers
- add forgotPassword/resetPassword audit logging with IP tracking
- block OIDC and inactive users from password reset flow
- fire-and-forget async work to prevent email enumeration timing oracle
- add HTML email template for password reset
- remove mailer.service and all SMTP env vars
- add user_book_status table (userId, bookId, status, source, timestamps)
- add UserBookStatusModule with repository and service
- auto-update status on progress save (fire-and-forget, skips manual overrides)
- expose PATCH /api/v1/books/:id/status endpoint
- include readStatus on BookCard and BookDetail responses
- surface status icon overlay on cover cards (toggleable)
- add status dropdown in book detail page inline with rating stars
- rewrite statistics summary to query user_book_status directly