Skip to main content
User Guide

NeoShelf

NeoShelf is NeoQN's intelligent reading-status dashboard built directly into the Library tab. Instead of forcing you to scroll through every book you've ever added, NeoShelf automatically groups them into meaningful shelves based on your reading behaviour and activity patterns — no manual sorting required.

Accessing NeoShelf

Open the Library tab and swipe across to the NeoShelf category. This tab is a system-locked, always-present shelf that cannot be deleted or reordered.


Smart Shelves

NeoShelf computes five adaptive shelves from your library data each time the Library tab loads:

Currently Reading

Books with a Reading bookmark status that you have opened in the reader within the last 7 days, sorted with the most recently accessed first. This shelf is your daily reading queue.

Almost Done

Books where your chapter progress exceeds 80% of total downloaded chapters, but you have not yet completed or dropped the title. These are sorted by completion percentage descending so the closest-to-finished titles surface first.

Long Abandoned

Books marked Reading that haven't had any activity (no reader access, no new download, no chapter update) in over 30 days. These are sorted with the most stale titles first, nudging you to revisit or drop them.

Completed Recently

Books you've marked Completed within the last 14 days, sorted by last access timestamp. Useful for post-read reflection or finding a sequel.

Worth Revisiting

Books marked Completed with no activity in over 90 days — old favourites you might want to re-read. These are sorted with the longest-dormant titles first.

Note

Empty shelves are automatically hidden. If you're a new user, NeoShelf will populate as you read and your library grows.


NeoShelf Engine (Backend Specifications)

NeoShelf is computed on-demand by NeoShelfEngine.compute(), called each time the Library tab refreshes or a download event fires.

Data Sources

The engine receives two inputs:

  • `cards`: The full set of DownloadDataLoaded entries from the in-memory cardsData concurrent map, locked using a coroutine Mutex to guarantee thread-safe reads.
  • `lastAccessMap`: A Map<Int, Long> correlating novel IDs to their last reader-session timestamps, kept in memory by the DownloadViewModel.

Classification Logic

Each book is evaluated sequentially against all five shelf criteria, and a book may appear in multiple shelves simultaneously. Classification uses:

| Shelf | Conditions | |---|---| | Currently Reading | ReadType.READING AND lastAccess <= 7 days | | Almost Done | progress > 80% AND not COMPLETED/DROPPED/currently reading | | Long Abandoned | ReadType.READING AND lastActive > 30 days ago | | Completed Recently | ReadType.COMPLETED AND lastAccess <= 14 days | | Worth Revisiting | ReadType.COMPLETED AND lastActive > 90 days ago |

The lastActive signal is computed as the maximum of lastAccess, lastDownloaded, and lastUpdated to produce a robust freshness signal even for books you've downloaded without opening.

Result

The engine returns a List<NeoShelf>, each with a title: String and items: List<DownloadDataLoaded>. Empty shelves are filtered out before the result is posted to _neoShelfPage via postValue(), keeping the UI clean.