New Features
- Reading Calendar widget for Home Screen: small month heatmap, medium three-month strip, deep-links to Stats
- Reading Speed chart on Stats with 90-day trend (BETA)
- Scrubbable tooltips on daily, weekly, hourly, and reading-speed stats charts
- Persistent search mini-bar in the reader with recent searches
- Grid view option on iPhone library
Improvements
- Reader color defaults now match Day/Night presets (pure black/white)
- Top and bottom reading bars default to off for new users
- Publisher style defaults to off for new users
- Search sheet dismiss split: chevron collapses to mini-bar, X closes fully; chevron tints with accent when active
- Edge tap page-turn disabled in scroll mode to prevent accidental turns
- Calibre sync preserves original filename instead of appending the book ID
- Calibre sync resolves filename collisions between different books
- Calibre sync shows a post-sync log sheet with per-book results
- Calibre sync handles RFC 5987 and unquoted Content-Disposition headers
- Hardcoded colors made scheme-adaptive for light mode
- Stats cards cache derived values so scrubbing no longer re-reduces arrays
- Stats reading-by-hour card no longer reloads on every render
- Home stats refresh live on reading-session changes
Accessibility
- Search mini-bar close and counter buttons get distinct VoiceOver labels
- Daily, weekly, and hourly bar charts support VoiceOver scrubbing via swipe up/down
- Reading speed chart exposes Audio Graph via AXChartDescriptor
- Chart tooltips and BETA badge scale with Dynamic Type
- Calibre summary rows combine into a single VoiceOver element
- Trend arrows announced as "improving", "declining", or "stable" instead of the raw glyph
Fixes
- False completion celebration after scrubbing to the end of a book
- Tap-to-turn breaking after repeated page turns
- Deprecated plotAreaFrame replaced with plotFrame in Swift Charts
- Search result navigation now cancelable, preventing stale-batch flicker
- Library breakdown shows 0 instead of a synthetic average when empty
Localization
- 48+ new strings translated across all 15 supported languages
- Reading Calendar widget for Home Screen: small month heatmap, medium three-month strip, deep-links to Stats
- Reading Speed chart on Stats with 90-day trend (BETA)
- Scrubbable tooltips on daily, weekly, hourly, and reading-speed stats charts
- Persistent search mini-bar in the reader with recent searches
- Grid view option on iPhone library
Improvements
- Reader color defaults now match Day/Night presets (pure black/white)
- Top and bottom reading bars default to off for new users
- Publisher style defaults to off for new users
- Search sheet dismiss split: chevron collapses to mini-bar, X closes fully; chevron tints with accent when active
- Edge tap page-turn disabled in scroll mode to prevent accidental turns
- Calibre sync preserves original filename instead of appending the book ID
- Calibre sync resolves filename collisions between different books
- Calibre sync shows a post-sync log sheet with per-book results
- Calibre sync handles RFC 5987 and unquoted Content-Disposition headers
- Hardcoded colors made scheme-adaptive for light mode
- Stats cards cache derived values so scrubbing no longer re-reduces arrays
- Stats reading-by-hour card no longer reloads on every render
- Home stats refresh live on reading-session changes
Accessibility
- Search mini-bar close and counter buttons get distinct VoiceOver labels
- Daily, weekly, and hourly bar charts support VoiceOver scrubbing via swipe up/down
- Reading speed chart exposes Audio Graph via AXChartDescriptor
- Chart tooltips and BETA badge scale with Dynamic Type
- Calibre summary rows combine into a single VoiceOver element
- Trend arrows announced as "improving", "declining", or "stable" instead of the raw glyph
Fixes
- False completion celebration after scrubbing to the end of a book
- Tap-to-turn breaking after repeated page turns
- Deprecated plotAreaFrame replaced with plotFrame in Swift Charts
- Search result navigation now cancelable, preventing stale-batch flicker
- Library breakdown shows 0 instead of a synthetic average when empty
Localization
- 48+ new strings translated across all 15 supported languages









