You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Track and maintain your reading history with calendars, trends, independent automatic/manual timers, and JSON backup or CSV export.
Reader headers and footers leave unused positions clear; hidden controls no longer block text selection or links.
More reliable book opening, remote downloads, and library navigation, with loading and retry feedback where needed.
Added
Per-book reading data with a calendar, daily trends, time-of-day distribution, retroactive entries, and record editing/deletion without moving the reader's saved position.
Week, month, year, and all-time archive views with date drill-down and matching book, note, and reading statistics.
Personal reading history remains available after the original book is removed or becomes inaccessible. Reading data can be backed up/restored as JSON or exported as CSV, for one book or the whole account.
Changed
Automatic and manual timing can be enabled independently, used together, or both disabled while keeping history and retroactive entry available. Both timers share a configurable suspension grace period, excluding time spent away.
Reading captures survive page changes, refreshes, and temporary connection failures. Rejected records remain stored without blocking other books, and overlapping timed activity is counted only once per account.
Reading statistics split known active intervals across local days and hours; a per-book reading day requires at least one minute. Historical reading volume and untouched record precision are preserved when content grows or records are corrected.
WebDAV and S3 book reads use verified partial downloads when supported, reuse concurrent downloads, and fall back to whole-file caching when partial reads fail or small remote reads are slow.
Reader startup waits for the fonts needed by visible text and avoids flashing a loading indicator during fast opens. If font preparation fails, reading can continue with a fallback font and a notice.
Scrolling reader headers and footers use compact, opaque labels, leaving empty positions clear of the text. Paginated information fits within page margins without an extra band when all its fields are disabled.
Book details provide direct access to reading data. The review shortcut opens your existing review or a new composer; publishing, converting a collected book to a personal book, and uploading another version move into More actions.
Reader saves and background recovery stay quiet, without save-status warnings or retry buttons over the text.
Animation now respects the operating system's reduced-motion preference across the whole app, instead of only on a handful of hand-marked elements.
Loading screens announce themselves to screen readers and expose their busy state.
Fixed
Hidden reader controls no longer intercept text selection or link clicks through invisible hover areas. Sidebar resizing and floating controls keep their hit areas within their actual bounds.
Opening a book no longer briefly shows a white page or book-defined typography before the reader theme appears, including when chapter loads overlap.
Text replacement rules are ready before the reader opens, avoiding a second load and relocation just after the first page appears.
Rebuilding the reader for a text replacement or a Chinese conversion now covers the reading area while it is rebuilt, instead of briefly showing an empty or unstyled page.
Refreshing library, shelf, and tag views preserves known names or shows local loading and retry states instead of briefly showing a default or unrelated title.
Opening a shared-library link no longer loads personal books or exposes personal actions while the requested library is unresolved. Filter corrections and scroll restoration wait for the matching view.
Recently Read shows a loading placeholder and retry after initial failures instead of silently disappearing while books load.
Opening a book now applies saved reading settings before displaying its text, preventing a temporary default layout while preferences load. Failed initial settings or font-list loads offer a retry.
Books can open correctly when a stored file size differs from the actual file size, including previously cached files.
Uploading the same TXT file in different accounts or libraries no longer overwrites another generated book; repeated uploads within the same library still reuse the existing book.
Remote downloads retain timeout protection until the response finishes, and incomplete downloads are discarded so subsequent opens can retry.
Confirmation dialogs lock while their request is in flight, so double-clicking can no longer send a second destructive request and a dialog can no longer be dismissed mid-request.
Replacing a highlight no longer loses the highlights it replaced when saving the new one fails.
Drag-reordering shelves and tags keeps hidden items in their original slots instead of dropping them, and re-syncs with the server once the change settles.
Registering an account no longer leaves the page treating the session as a guest.
Instance-wide settings switches and the first-owner setup form can no longer be submitted twice at once.
A failed library-preference change now rolls back only the field that failed, instead of undoing a newer successful change to a different field.
Storage migration and restore actions report failures instead of failing silently.
The WebDAV import queue always releases its lock when a run finishes, so cancelling or closing the panel no longer leaves importing permanently stuck.
Moving a book to another category in a shared library now reports a failure instead of silently doing nothing.
Upgrade notes
Back up the complete DATA_DIR before upgrading. Migration 0052 converts existing reading history to the new model automatically; downgrading requires the pre-upgrade data and matching previous release.
Existing reading time and coverage are retained. Older records without detailed time or position information remain historical totals; the upgrade does not invent missing hourly activity or per-record coverage. Reading-data JSON exports do not replace a complete instance backup.