1.2.7 – July 2, 2026
Fixed
- Book Journey — Sessions Could Slip Away After a Details Refresh
A book’s reading sessions could quietly disappear from the Journey tab on its detail screen after you added an ISBN or the book’s details were refreshed from the catalog — even though the sessions themselves were safe and still showed on the Sessions screen.
The tab matched sessions to the book in a way that grew fragile once the book’s identifiers changed, so the count and recent-sessions list would read empty. Journey now keeps a book and its sessions reliably linked.
1.2.6 – June 24, 2026
Added
- Sync Diagnostics — Deeper Export Failure Detail – The opt-in Sync Diagnostics now captures far more about a failed CloudKit export so the long-standing “export always fails” bug can finally be pinned down. The diagnostics screen surfaces the failing record types and sub-error histogram prominently on each failed event row. Still strictly PII-free: no book, quote, or note contents are ever read.
- Sync Diagnostics — System Log Capture – A new “Capture System Logs” action on the Sync Diagnostics screen.
- Home Screen Quick Actions – Long-pressing the Kiveo app icon now surfaces three quick actions — Start Session, Scan Barcode, and Capture Quote — that deep-link straight into the right place. Start Session and Capture Quote open the book picker so you choose a book, then drop you into a live session or the quote capture flow respectively; Scan Barcode opens search with the barcode scanner already running.
- Home — Tappable “Books Read” Card – The “Books Read” stat on the Home summary is now tappable and drills down into a read-only list of finished books. The list is scoped to the period selected in the year picker: it shows “All Books Read” for Lifetime, “Books This Year” for the current year, or “Books in {year}” for a past year, and stays in sync with the picker. Books are sorted with the most recently finished first; tapping a book opens its detail view. The other summary cards (Pages, Hours, Streak) remain non-interactive.
Changed
- Custom Book Covers — Size-Capped at the Source – Saving a custom cover (when creating/editing a manual book, or swapping a cover) now downscales the image so its longest side is at most ~1024px and compresses it toward a ~700KB ceiling before storing it on the book. Previously the full-resolution photo was stored verbatim, producing multi-megabyte blobs that bloated the on-device store, wasted memory, and inflated the CloudKit sync payload. Covers remain visually identical at the sizes they actually render. (Data-hygiene; does not affect sync reliability.)
- Book Status — Single Update Path – Every book-status change now flows through one canonical writer (
Book.setStatus), so a book’s status and its related dates and metadata stay consistent no matter where the change comes from (the edit sheet, the date editor, Goodreads import, or progress logging).
- Reflections — “What’s on your mind?” Prompt – The reflection input fields now share a single, friendlier prompt: “What’s on your mind?”.
- Cover Swap — “Original” Cover Marker – The cover-swap screen’s “Other Editions” grid now marks the book’s own original/canonical edition with an “Original” label (a subtle neutral ring plus a “return to” glyph), so when a custom cover or a different edition’s cover is active you can still tell — and find your way back to — the book’s original cover.
Fixed
- Custom Book Covers — Orphaned & Oversized Cover Blobs – A manually-created book whose real edition later appeared in the catalog kept its now-redundant custom-cover image data forever, even after a metadata refresh gave it a good remote cover. That orphaned blob (often multiple megabytes) only bloated the store and the sync payload. Metadata refresh now clears a leftover custom-cover blob, but only when the book has no intentional cover override and a usable remote cover URL is available, so nothing visible changes. A one-time, idempotent repair also runs on existing libraries: oversized cover blobs are re-encoded smaller in place, and orphaned ones are cleared when a remote cover can stand in — conservatively, never leaving a book without a cover. Intentional custom and edition covers are always preserved.
- Cover Swap — Custom Cover Showed a Catalog Edition as “Current” – When a book used a custom cover, the cover-swap screen’s “Other Editions” grid still highlighted the ISBN-matching catalog edition as the current cover. The “current” calculation matched purely by ISBN and ignored an active custom override; it now returns no edition while a custom cover is in use, so the grid correctly shows that none of the catalog editions is current.
- Backup & Restore — Custom Book Flag Preserved – Restoring from a backup no longer demotes manually-created books to regular catalog books. The
isCustom flag is now written to and read back from backups (older backups without the field still import, treated as non-custom).
- Tab Bar — Items Turned Accent After Dismissing a Sheet (iOS 26) – On iOS 26, presenting and dismissing any sheet caused every bottom tab bar item — including unselected ones — to render in the accent color instead of the intended selected=accent / unselected=label scheme.
- Book Search — Stale Results Leak Into Pre-Search – When a slow search was in-flight and the user cleared the query or left search mode, late-arriving results were applied to the view model, causing search results to appear below the pre-search picks.
- From Our Garden — Single-Column Vertical Centering – When a column in the “From Our Garden” grid had only one book, it centered vertically against taller two-book columns. Columns now align to the top.
- Book Search — Auto Language Sent “Any” – When the search language filter was set to “Automatic”, the app sent
lang=any to the API, returning results in all languages instead of prioritizing the user’s language. Now resolves to the device’s actual locale (e.g. es for Spanish users).
- Cover Swap — “Reset to Original” Didn’t Clear a Custom Cover – Tapping “Reset to Original” removed the Reset button but the custom cover image kept showing. Two bugs left the book’s image URL pointing at the custom cover file after a reset: the original catalog cover was captured after the URL had already been overwritten with the custom file (so reset “restored” the custom image), and reset only re-pointed the URL when an original had been captured at all — leaving legacy custom covers stuck. Now the real pre-override cover is captured before it’s overwritten, and reset always moves the image away from the custom file: it restores a genuine remote catalog cover when one is known, or otherwise clears the image and triggers a catalog metadata re-fetch so the book recovers its proper cover. When there’s no known remote original, the catalog cover is now fetched inline by ISBN and fills in immediately, in place, rather than only reappearing the next time the book’s detail screen is opened. The on-disk custom cover file is also deleted to free space.
1.2.5 – June 22, 2026
Added
- iCloud Sync Diagnostics – Added opt-in sync observability to help diagnose CloudKit sync issues. Sync logging is off by default and intended only for users actively troubleshooting a sync problem — when off, nothing is observed, recorded, persisted, or reported. A new “Sync Diagnostics” screen under Settings → Advanced has an “Enable Sync Logging” toggle that starts/stops logging immediately (no relaunch needed). While enabled,
CloudKitSyncMonitor records SwiftData/CloudKit setup, import, and export events (and any errors they carry) into a capped, persisted rolling log, reports sync failures to telemetry, and shows the recent event log with success/failure styling that users can export and share. Turning logging back off keeps any already-captured log so it can still be shared. The log never includes the contents of books, quotes, or notes — only sync metadata and error details. This is diagnostic instrumentation; it does not change sync behavior.
1.2.3 – May 25, 2026
Removed
- Live Activity — Pause/Resume App Intents –
PauseSessionIntent and ResumeSessionIntent removed; no Live Activity UI invoked them after the Phase 3 button cleanup. Pause/resume from inside the app still works as before. (Phase 4 of the Live Activity revamp.)
Added
- Live Activity — Cover-Sampled Background – The Lock Screen Live Activity now tints its background with the dominant color of the current book’s cover, darkened for readability. Reuses the existing cover-palette pipeline (no new sampling); books whose palettes aren’t cached yet fall back to the default backdrop and pick up the tint on the next session. (Phase 2 of the Live Activity revamp.)
Changed
- Live Activity — Cover Fades Into Background – The lock-screen cover now dissolves into the activity’s background via a short gradient on its trailing edge instead of butting against the text with a hard line. Cover sized to its natural 2:3 book ratio (70×105) and overall widget height capped for a tighter footprint. Timer icon removed when running; pause glyph appears when paused.
- Live Activity — Dynamic Island Redesign – All three Dynamic Island presentations rebuilt: compact shows the Kiveo mark beside the timer; expanded uses a unified bottom-only layout with cover, title, author, timer, and quote/book chips; minimal shows the Kiveo mark in accent color. Pause/stop/end buttons removed in favor of tap-to-open. (Phase 3 of the Live Activity revamp.)
- Live Activity — Typography & Layout – Lock Screen Live Activity refreshed with Bitter serif title, hero-sized timer, and a cover that bleeds to the leading edge. Missing covers now show a typographic letter fallback (first significant word of the title in Bitter) instead of a generic icon. Quote/book counts moved into a quieter secondary row beside the timer. (Phase 1 of the Live Activity revamp.)
- Session Cards – Redesigned the session cards on the Sessions screen: single-book sessions now show a larger title, the author, and an icon-led row for pages and time; multi-book sessions keep a compact one-line-per-book list with a summary row above.
Fixed
- Reminders & Nudges — Nudge Never Fired When Daily Was On – Previously the daily reminder unconditionally suppressed the inactivity nudge whenever both were enabled, so nudges effectively never reached users with a daily reminder configured. The scheduler now picks between them based on activity: while the user has logged a session within the threshold window, the daily reminder runs; once they’ve gone quiet past the threshold, the nudge takes over and the daily is paused until they read again. Users with no sessions yet are treated as not-inactive so the daily reminder carries new users until they’ve established a baseline.
- Session Recovery — Discard Didn’t Persist – Tapping “Discard” on the session recovery banner now actually deletes the draft. The previous implementation called
delete on a model fetched in a different (deallocated) ModelContext, which SwiftData silently no-ops, so the banner reappeared on the next launch. Discard now re-fetches active drafts in the current context and clears all of them, also protecting against rare duplicate drafts.
- Swap Cover / Swap Edition — Duplicate “Current” Badge – When the editions API returned more than one row matching a book’s stored ISBNs (e.g. one match on ISBN-10 and another on both ISBN-13 and ISBN-10), both thumbnails were marked as “current” with the glow and badge. The “current” edition is now resolved once at the view-model level, preferring an ISBN-13 match over an ISBN-10 fallback, so exactly one row is highlighted and the sort order is stable.
- Recovered Session Cover Flicker – Recovered live session no longer flashes/re-presents when saving a quote or reflection (the fullScreenCover stayed put across SwiftData saves by giving the presented item a stable identity).
- Session Activity Log Localization – Live session log entries (“Session started”, “Session paused”, etc.) are now properly localized instead of always showing in English. Existing sessions with English logs are handled gracefully.
- Recovered Session Timestamps – Session activity log entries now reflect the full session duration when a session is recovered after a crash or force-quit, so the headline total and the “Session ended” stamp no longer disagree.
- Live Activity After Recovery – The Lock Screen and Dynamic Island now reflect the correct elapsed time, quote count, and book count when a reading session is recovered after a crash or force-quit. Any stale Live Activity left over from the previous app process is cleared, and a fresh one is started bound to the recovered session.
1.2.2 – April 22, 2026
Changed
- Search Picks Cache – Lowered picks cache duration from 7 days to 6 hours so curated content refreshes more frequently.
- Clear Cache – “Clear Cache” in Settings now also removes cached search picks alongside book cover images.
1.2.1 – April 21, 2026
Changed
- App Icon Picker – Locked supporter icons are now tappable — tapping any icon (or the lock hint) opens the Support Kiveo sheet, so the donation flow is reachable without backing out to Settings.
Fixed
- Paused Session Timer – Paused session timer no longer advances while the app is backgrounded and reopened; the “Session resumed” activity log entry is now correctly stamped at the pause point.
- Library Search – Library search now matches book authors and aliases in addition to titles, in both the main library and individual shelves.
- Sheet Tint – Fixed sheets (most visibly Support Kiveo) intermittently rendering interactive elements and loaders in system blue instead of the app’s accent color.
1.2.0 – Primrose 🌼 – April 04, 2026
Added
- Goodreads Import: Custom Books – Books not found via API can now be imported as custom books using CSV metadata (title, author, publisher, pages). Not-found books default to skipped; users opt in per book or in bulk via “Add all as custom”
- Goodreads Import: Flexible CSV Parsing – Column indices are now resolved dynamically from the header row, fixing imports that fail when Goodreads exports omit columns (e.g. Average Rating)
- Support Kiveo (Tip Jar) – Voluntary one-time tip system to support indie development
- Three bookish tip tiers: Bookmark ($1.99), Book ($4.99), Shelf ($9.99) via RevenueCat
- Any tip permanently unlocks 6 exclusive app icons
- Supporter status persisted across UserDefaults, iCloud KVS, and RevenueCat
- Restore Purchases support for cross-device icon unlock
- App Icon Picker – Choose from 6 exclusive alternate app icons (unlocked via tip)
- Reading Reminders – Opt-in push notifications to gently invite users back to reading
- Daily Reading Time — scheduled daily notification at a user-chosen time
- Inactivity Nudge — notification after a user-defined number of days without a session (2/3/5/7 days)
- Pause Reminders — temporarily silence all reminders until a chosen date
- Book-aware notifications reference the current reading book by name
- Notification tap deep-links to current reading book
- iCloud-synced settings
- Paused Status – New book status between Reading and DNF for books set aside temporarily, with optional reason note, excluded from Continue Reading and time-to-finish stats, and one-tap Resume Reading from Book Detail
- Session Blocking – Prevents changing status to Paused or DNF while a live reading session is active
- DNF Reason Notes – Optional free-text note (~280 chars) when marking a book as Did Not Finish, editable from Book Detail
- DNF Stats Section – Dedicated stats on Home screen showing books DNF’d, pages read before DNF, and common stopping point
- Nightstand Reading Queue – Curated queue of up to 7 wishlist books to read next, with drag-to-reorder, swipe-to-remove, and optional notes per book
- Nightstand Home Widget – Compact card on the Home screen showing nightstand book covers with contextual title
- Live Session: Quote & Reflect Cards – Capture quotes and reflections directly from within a live reading session
- Activity Log Badges – Visual capture badges and polished activity log for reflections
- Swap Edition & Swap Cover – Change a book’s edition or cover image without losing reading data
- Automatic Review Prompts – Prompts users to rate Kiveo at natural usage milestones
- Backup: Cover Override Fields – Cover override data included in Kiveo backup export/import
- Book Cover Press Animation – Subtle scale + shadow lift when pressing book covers in the library
- Book Completion Celebration – Accent glow animation when marking a book as done, with haptic feedback
- Skeleton Loaders – Breathing pulse placeholders replace spinners during cover image loading
- Progress Bar Animation – Smooth spring animation when reading progress changes
Changed
- Settings Screen Revamp – Redesigned from generic Form to branded ScrollView layout with warm gradient background, grain texture, glass effects (iOS 26+), and card-based sections
- Search Screen Redesign – Transformed blank search screen into a discovery-rich experience
- “From Our Garden” — Curated book picks from the Kiveo picks API with localization support
- “Recently Added” — Horizontal scroll of the user’s most recently added library books
- Recent search pills — Horizontal pill-based recent searches replacing the old list view
- Inline barcode scan button pinned to the bottom of the pre-search state
- Advanced search filter popover with active-filter badge
- iOS 26 search tab — Search as a dedicated trailing tab bar item on iOS 26+
- Onboarding Revamp – Redesigned 6-screen onboarding flow with warm brand copy, custom typography, adaptive color palette with dark mode support
- What’s New Sheet – Revamped with onboarding-style animations and improved version matching
- Book Detail Tabs – Renamed tabs to “The Book”, “Journey”, and “Keepsakes” with pill/capsule active indicator and glass effect on iOS 26+
- Journey & Keepsakes Empty States – Illustration-based empty states with garden/magic book themes and CTAs
- Book Alias in Sessions – Aliases now shown in live session logs, Live Activity, and draft saves
- Continue Reading – Section hidden when all books are paused
- Custom Book Creation (iOS 26+) – Library toolbar add button goes directly to custom book creation
- Snackbar Styling – Rounded rectangle shape with warm shadow and regular material background
- Microcopy – Warmer, more human empty state messages and confirmation text
- Image Loading – Existing cover images stay visible during metadata refresh (no flash)
- Color Gradient – Book detail header gradient crossfades smoothly on palette changes
- Localization – Converted all hardcoded English strings to semantic localization keys; added es-419 locale
Fixed
- Goodreads Import – Fixed import failing when CSV export omits columns (e.g. Average Rating)
- Live Session Stability – Fixed sessions resetting timer, losing state, and flickering when returning from background, pulling down notifications, or capturing quotes
- Nightstand Background – Fixed background color to match app theme
- Nightstand Persistence – Fixed books staying on Nightstand after progress-based status changes
- Share Card Aspect Ratio – Fixed post aspect ratio to match Instagram specs (4:5)
- Share Card Preview – Fixed preview not matching rendered output; quote text now scales for long quotes
- Book Detail Sheet – Fixed sheet dismissing and reopening when adding book to library
- Skeleton Animation Leak – Scoped pulse animation to prevent SwiftUI transaction leak
- Live Activity Covers – Fixed book covers not showing in Live Activities on Beta builds
- Notification Deep Link – Fixed notification opening wrong book; hidden tabs for non-library books
- Search Filter Pills – Fixed clipping on narrow screens and long translations
- Home Layout (iOS 26) – Fixed layout oscillation by scoping toolbar animation
- Paused/DNF Filtering – Fixed hide paused/DNF toggle and book picker custom covers
- Reflections Stats – Fixed missing counter in “this week” stats on quotes/reflections screens
- Reflections Screen – Fixed duplicate numbers in stats and capitalized section titles
- Custom Book Covers – Fixed CloudKit sync for custom book cover images; covers now display correctly in Live Activity widgets
1.1.0 – January 19, 2026
Added
- Share Cards – Create beautiful shareable images of your reading content
- Share quotes as styled cards with book attribution
- Share book progress cards (currently reading or finished)
- Share book lists from shelves as cover grids
- Multiple themes: Default, Dusk, Ocean, Forest, Warm, Midnight
- Two aspect ratios: Story (9:16) and Post (3:4)
- Quote cards: Toggle card wrapper on/off
- Book cards: Toggle “Finished” view for completed books
- Book list cards: Edit title and badge text
- Entry points: Quote Detail, Book Detail, Shelf Detail
- TelemetryDeck analytics tracking for feature usage
- Custom Books – Create books manually when not found via search
- Add custom book via Library toolbar menu (long press on “+” button)
- Create custom book from search no-results screen
- Custom book indicator badge on book covers (pencil icon, top-left)
- Edit custom book details via Book Detail toolbar menu
- Photo library cover image selection for custom books
- All app features supported: sessions, quotes, reflections, shelves
- Custom covers saved locally with JPEG compression
- Home View Summary Improvements – Enhanced Your Summary section on Home screen
- Renamed “Reading Stats” to “Your Summary”
- Year filter to view stats by year (Lifetime, 2025, 2024, etc.)
- Books Completed horizontal scroll showing finished book covers
- Filter persists across app launches
- Reusable ChipPicker component for menu-style selections
- Manual Session Log Redesign – Improved UX for backfilling reading sessions
- Book covers now display in session book rows
- Enhanced date picker with calendar icon and formatted weekday/date display
- Delta-based progress input: “Pages read” instead of “Current page” for easier backfilling
- Percentage mode support: Shows “Progress: X%” for audiobooks and percentage-tracked books
- Progress is now optional – log duration-only sessions without requiring page/percentage input
- Pre-selection when opening from Book Detail toolbar (Log Session button)
- Dedicated book picker sheet replaces inline search
- Kiveo Backup Import/Export – Full data backup and restore functionality
- Export all library data to JSON backup file (books, shelves, sessions, quotes, reflections)
- Import from backup with merge mode (keeps existing, adds new) or replace mode (clean import)
- Preview backup contents before importing with data count summary
- Duplicate detection by ISBN during merge import
- Progress indicator during import with phase descriptions
- Located in Settings under new “Import & Export” section
- Goodreads import moved to Import & Export section
- Book Sharing with Deep Links – Share books with other Kiveo users via shareable links
- Share button in Book Detail toolbar generates link to
share.kiveo.app
- Deep link support opens shared books directly in the app
- In-App Safari WebView – HTTP/HTTPS links now open within the app
- Avoids context-switching to external Safari app
- Multiple Currently Reading Cards – Home screen now displays all books you’re currently reading
- Horizontally scrollable carousel when multiple books are in progress
- Each card shows book cover, title, and reading progress
- Continue Reading Glass Effect (iOS 26) – Glass effect applied to Continue Reading cards on Home screen
- Book Data Auto-Refresh – Automatically fetches updated book metadata from API
- Updates cover images, descriptions, and other details when available
- Custom Status Picker – New pill-style status filter replacing segmented controls
- Swipe gestures: pull past trailing edge to jump to “All”, pull past leading edge to return to previous selection
- Smooth spring animations with haptic feedback
- Applied across Library, Shelf Detail, Book Picker, and Add Books to Shelf views
- Persisted Library Filter – Selected status filter now persists between app launches
- Hide DNF Books – New toggle in Library toolbar menu to hide the DNF status option
- Setting applies globally to all status pickers throughout the app
- Automatically switches to “All” if DNF was selected when hidden
- Book Aliases – Set custom display names for books with long or unwanted titles
- Set alias via toolbar menu in Book Detail view
- Clear alias option (visible only when alias is set)
- Pencil icon indicator shows throughout the app when a book has an alias
- Alias displayed in: Book Detail, Library items, Continue Reading widget, Live Sessions, Quotes, Book pickers, and Shelf management
- Haptic Feedback – Tactile feedback throughout the app for better UX
- Light impact for toggles, selections, and button taps
- Medium impact for pause/resume and drag reorder actions
- Success notifications for saves, completions, and imports
- Error notifications for deletions and failures
- Centralized
HapticManager utility for consistent usage
- Book Date Editor – Edit book dates (Added, Started, Finished) from Book Detail
- Tap dates section in book library actions to open editor sheet
- Edit dateAdded, dateStarted, and dateCompleted with compact date pickers
- Clear optional dates (started/finished) with clear button
- Status automatically syncs based on date changes (finished dates set status to Done, etc.)
- Displays finished date alongside existing added/started dates
- iOS 26 Liquid Glass Toolbar – Redesigned navigation to embrace iOS 26 Liquid Glass aesthetic
- Titles displayed in leading toolbar position with glass background visibility
- Tab bar minimizes on scroll down for more content space
- Toolbar titles and logo smoothly fade out on scroll
- Home screen toolbar includes Kiveo logo icon
- Glass prominent button style for toolbar actions
- Graceful fallback to standard large title navigation on iOS 18
Changed
- Improved Reading Stats Clarity – Added descriptive subtitles to stat cards on the home screen
- “Books Read” now shows “Completed” subtitle
- “Pages Read” now shows “From Sessions” subtitle
- “Current Streak” (renamed from “Day Streak”) now shows “Days” subtitle
- Consistent Save Confirmations – Unified save confirmation behavior for quotes and reflections
Fixed
- Manual Session Page Capping – Fixed logged pages exceeding book’s total page count
- When logging a manual session, pages are now correctly capped by the book’s remaining pages
- Example: If a 300-page book has 280 pages read, logging 50 pages now correctly saves only 20 pages
- Preserve Book Completion Date – Fixed completion date being overwritten when logging additional sessions
- Books that already have a finished date no longer get their date overwritten
- Preserves original completion date even when logging sessions that exceed total pages
- Live Activity Cleanup – Fixed Live Activity getting stuck on lock screen after session ends or app crash
- Added app startup cleanup to end orphaned Live Activities
- Live Activity now shows paused state when recovering from interrupted session
- Properly ends all activities when user discards recovered session
- Session Recovery Timestamps – Fixed incorrect log timestamps in recovered sessions
- Recovered sessions now preserve original start time for accurate log timestamps
- Fixes issue where session logs showed wrong times after recovery (e.g., 3-minute session despite longer actual reading)
- Continue Reading Card Width (iPhone) – Fixed single book card not expanding to full width on iPhone
- Book Stats Display – Fixed inflated session count and reading time across the app
- Home page “Currently Reading” widget now only counts completed sessions
- Book detail Stats tab now filters orphan ReadSessionBook entries
- Fixed orphan ReadSessionBook creation during quote capture that caused stats bloat
- Cached ReadSessionBook for quote linking to prevent multiple orphan entries
- Session Activity Log Order – Fixed session logs appearing in random order in session detail view
- Logs now sorted by timestamp (newest first) to match live session display
- Percentage Progress Display – Fixed incorrect percentage display in book items and progress indicators
- Quotes/Reflections Save – Fixed issue where quotes and reflections would fail to save in certain conditions
- Live Session Stability – Fixed potential hang/freeze issues during live reading sessions
- Continue Reading Image Caching – Fixed book cover images not caching properly in Continue Reading widget
- Settings Tint Color – Fixed incorrect tint color in Settings and About screens
- Library Layout Persistence – Fixed library layout preference not persisting between app launches
Performance
- Home Screen Optimization – Improved loading and rendering performance on Home screen
- Book Cover Color Palette Caching – Cached dominant colors from book covers for faster UI rendering
1.0.2 – December 21, 2025
Added
- Bulk Manage Shelf Books – Add or remove multiple books from a shelf at once
- New “+” button in shelf toolbar opens book picker (custom shelves only)
- Multi-select interface with checkboxes for quick selection
- Toggle books on/off – add new books or remove existing ones
- Filter tabs (All/Reading/Wishlist/Done) to narrow book list
- Sort options (Recent Activity/Title/Author/Date Added)
- Search by title or author
- Hide Empty Shelves – New toggle in Library toolbar menu to hide shelves with no books
- Available when “Group by shelves” is enabled
- Setting persists between app launches
- Empty Shelf Placeholder – Placeholder card displayed in empty shelves
- Shows “+” icon with “Add Books” label
- Tapping opens the bulk book picker for that shelf
- Shelf Management Quick Actions – Tap any shelf in Manage Shelves to add books
- Also available via “Manage Books” context menu option
1.0.1 – December 17, 2025
Added
- Rate Kiveo – New option in Settings to rate the app on the App Store
- Shelf Sort – Manually sort books within shelves
- Drag-and-drop reordering via Sort option in shelf menu
- New “Shelf Sort” option in Library grid view displays custom order
- Indicator icon shows which shelves have custom sorting
- New books added to shelves appear at the top
- Independent sort order per shelf (books in multiple shelves have separate positions)
- Library sort option now persists between app launches
- DataUpgrade protocol for standardized migrations
- What’s New Feature – Post-update sheet showcasing new features to users
- Horizontal carousel with paging for multiple feature announcements
- Only shows to existing users after app updates (not fresh installs)
- Cumulative display of all features since user’s last seen version
- Dismissable via close button or swipe gesture
- “Get Started” button on final slide
- Settings option to view What’s New anytime
- TelemetryDeck integration for analytics
- Unit tests for VersionComparator and WhatsNewRegistry
- Percentage Progress – Input reading progress as pages or percentage
- Segmented picker (Pages / %) in progress update prompts
- Per-book preference: remembers last used mode for each book
- Percentage option available even without total page count
- Switching modes clears input and persists preference
- Applies to Book Detail progress tap and Live Session prompts
Fixed
- Shelf filtering – Fixed issue where Leaf Pile showed empty when opened from Library
- ShelfDetailView now has independent filtering from LibraryView
- Leaf Pile correctly displays all unshelved books regardless of Library filter
1.0.0 – December 12, 2025