Releases: paviro/KoShelf
Release list
2026.6.1
What's Changed
This release adds Kobo support for discovering extensionless kepub files and documents the new Kobo database configuration option.
Kobo
- Added extensionless kepub discovery using Kobo's
KoboReader.sqlitedatabase - Extensionless Kobo kepub matches are parsed as EPUB files during library collection
- Parse warnings for Kobo files that may be encrypted
Configuration
- Added
--kobo-db/KOSHELF_KOBO_DBsupport - Added
kobo_dbsupport to the library config file - Documented the Kobo database option and example usage
Internal
- Refactored library ingest pipeline
- Updated backend and frontend dependencies
Full Changelog: 2026.6.0...2026.6.1
2026.6.0
What's Changed
This release adds sorting controls for highlights and bookmarks, improves reader annotation navigation, fixes expired-session handling, and updates the dependency stack.
Annotation Sorting
- Added page and date sorting controls for highlights and bookmarks on item detail pages (#85)
- Four sort states are available: page ascending, page descending, oldest first, and newest first
- Reader drawer highlights and bookmarks are now sorted by page number
Reader
- Reader links for highlights and bookmarks now use the annotation IDs instead of list indexes
Authentication
- Fixed expired sessions getting stuck in a loading state
- Updated login to refresh cached authentication state immediately after successful sign-in
- Moved password change feedback below the submit button
Internal
- Updated major backend dependencies including
sqlx0.9,quick-xml0.40, andrusty_paseto0.10 - Updated minor backend dependencies and frontend dependencies
- Hardened parser and database compatibility for the newer backend libraries
New Contributors
Full Changelog: 2026.4.5...2026.6.0
2026.4.5
What's Changed
This release fixes a bug where the Statistics, Calendar, and Recap navigation tabs would disappear after a statistics database sync in export watch mode.
Bug Fixes
- Missing navigation tabs after stats sync in export mode — the
export --watchfile watcher was not retaining the reading data store between rebuilds, causing statistics to be silently discarded andhas_reading_datato be reported asfalseafter any targeted rebuild triggered by a database change
Full Changelog: 2026.4.4...2026.4.5
2026.4.4
What's Changed
This release fixes reading statistics getting duplicated when metadata is edited in KOReader, resolves invert highlight rendering on Firefox, and switches the memory allocator to support a wider range of systems.
Bug Fixes
- Duplicate reading statistics — editing author metadata in KOReader no longer creates a second statistics entry for the same book; rows sharing the same MD5 are now merged automatically, summing read time and pages
- Invert highlights on Firefox — invert overlays are now injected directly into the iframe body as a standalone SVG, working around Firefox not applying
mix-blend-modeon SVG elements nested inside another SVG - 16K page-size systems — replaced jemalloc with mimalloc so the binary runs on platforms with non-4K page sizes
Internal
- Updated major frontend tooling: ESLint 10, TypeScript 6, and adapted code to stricter
react-hooks/set-state-in-effectlint rules - Updated minor frontend and backend dependencies (React 19.2.5, Vite 8.0.8, Tokio 1.52.1, Axum 0.8.9, and more)
Full Changelog: 2026.4.3...2026.4.4
2026.4.3
What's Changed
This release brings faithful rendering for all KOReader highlight styles, polishes the annotation editing toolbar, and fixes a few resilience issues around metadata parsing and file watching.
Highlight Styles
- Invert and strikeout highlights are now rendered with their actual KOReader styling instead of falling back to a plain highlight
- Unrecognized highlight colors (from custom-patched KOReader installs) show a rainbow gradient instead of silently defaulting to yellow
- Style icon badge in annotation card headers to tell highlight, underline, strikeout, and invert apart at a glance
- Color picker is disabled for invert highlights, matching KOReader behavior
Bug Fixes
- Invalid UTF-8 in metadata — truncated multi-byte sequences in KOReader highlight text no longer blow up the parser
- Stats ID fallback — reading statistics fall back to the canonical item ID when the MD5 hash is missing showing stats on the item detail page even without a sidecar file when available
- File watcher self-healing — the watcher recovers when a DB writeback fails instead of stalling
Internal
- Reading metrics and summaries are pre-computed at export time as JSON per week/month/year, so the frontend fetches them directly instead of reassembling from raw day-level data
build.rssplit intobuild/{main,shared,react,compress,licenses,locale}.rsapp/run.rssplit intobootstrap.rsand per-command modules (serve,export,set_password,licenses)- Removed render-time state sync patterns in favor of event-driven updates and keyed remounts
- Added optimistic-cache test coverage
Full Changelog: 2026.4.2...2026.4.3
2026.4.2
What's Changed
This patch release improves small-screen layouts, unifies overlay and button behavior, and polishes text sizing across the UI.
UI & Layout Fixes
- Improved annotation card layout on small screens — section headers now space badges and controls properly, and page numbers display more compactly on narrow viewports
- Larger hover preview text — book description text and series pills in hover previews are slightly larger for better readability
- Responsive button labels — icon buttons like "Settings" and "Navigation" in the reader now show their text labels on wider screens, improving discoverability on desktop
Overlay Improvements
- Unified overlay positioning — all popover-style elements (color pickers, highlight pickers, settings panels, dropdowns) now use a single positioning system that respects the app header and mobile navigation, and auto-hides when the anchor scrolls off-screen
Localization
- Added trailing period to the "Statistics from KOReader" subtitle across all languages
- Added localized labels for reader settings and navigation drawer buttons in all 8 supported languages
Full Changelog: 2026.4.1...2026.4.2
2026.4.1
What's Changed
This patch release reduces binary size with gzip-compressed embedded assets, improves the reader highlight navigation experience, fixes several UI issues in the recap section, and corrects session detection on iOS devices.
Binary Size & Asset Compression
- Gzip-compressed embedded assets: frontend files and fonts are now gzip-compressed at build time and served with
Content-Encoding: gzipto clients that support it, significantly reducing the compiled binary size - Decompression fallback for clients that don't advertise gzip support — the server transparently decompresses on the fly
- Share image fonts sourced from npm instead of downloaded at build time
Third-Party Licenses
- Embedded license notices: third-party dependency licenses (Rust + JS) are now collected at build time and bundled into the binary, replacing the static
THIRD_PARTY_LICENSES.mdfile
Reader
- Pulse animation when navigating to a highlight from the navigation drawer — the target highlight briefly pulses so you can spot it on the page - same as when opening a highlight from the library item detail page
Fixes
- iOS user agent detection: Safari, Chrome (CriOS), Firefox (FxiOS), and Edge (EdgiOS) on iOS are now correctly identified in the session management UI
- Share images regenerated when no data has changed but the cached files are missing from disk
- Recap active days circle graph visibility now uses container queries for reliable show/hide behavior
- Recap stat labels allow word breaking and document
langattribute is set so the browser can hyphenate correctly - MetricCard small-size variant uses consistent layout breakpoints and label sizing
API Changes
- The
/api/siteresponse now groupsauthenticatedandpassword_policyunder anauthobject (previously flat top-level fields); the redundantauth_enabledcapability flag has been removed
Updated Dependencies
- Added flate2 (gzip compression/decompression), @expo-google-fonts/gelasio, license-checker-rseidelsohn
- Removed ureq build dependency (font download) and
THIRD_PARTY_LICENSES.md
Full Changelog: 2026.4.0...2026.4.1
2026.4.0
What's Changed
This release adds an in-app reader, the ability to edit annotations and sync changes back to KOReader, a per-page reading activity heatmap, and optional password authentication.
In-App Reader
- Full EPUB, FB2, MOBI, and CBZ reader built into the web UI — open books directly from the library detail page (#65)
- Navigation drawer with table of contents, highlights, and bookmarks — tap any entry to jump to that position
- Presentation settings: font size, line spacing, word spacing, margins, hyphenation, and embedded font toggling. Settings persist per book (#68)
- Existing KOReader annotations (highlights, bookmarks) are rendered inline with colored overlays, notes can be opened by clicking a highlight
- Keyboard navigation (arrow keys, page up/down) and a scrubber bar for quick seeking
Writeback Mutations
- Edit annotations — change highlight colors, drawing styles, and notes directly in the web UI, then sync changes back to KOReader's
.sdr/metadata.*.luasidecar files (#69) - Delete annotations from the web UI with the same sidecar sync
- Edit item metadata — set ratings (1–5 stars), reading status (reading/complete/abandoned), and review notes
- Requires
--enable-writeback(disabled by default)
Page-Level Activity Heatmap
- Per-page reading time visualization with color-coded bars and chapter boundary overlays (#70)
- Annotation markers (highlights, bookmarks, notes) shown on corresponding page bars
- Filter by individual completion to compare reading sessions
Authentication
- Optional password authentication for serve mode (#62)
- Argon2 password hashing, PASETO v4 session tokens (30-day expiry), and per-IP rate limiting (5 attempts/min)
- Session management UI — view active sessions, revoke others on password change
- Trusted proxy support (
--trusted-proxies) for correct client IP behind reverse proxies - Set or rotate passwords via
koshelf set-password(supports--randomfor auto-generated credentials)
Other Changes
- File downloads: original EPUB/FB2/MOBI/CBZ files can now be served from the library detail page (#64)
- Subcommand CLI: the CLI is now
koshelf serve/koshelf export/koshelf set-passwordinstead of a flat flag structure. All options support environment variables (KOSHELF_LIBRARY_PATH,KOSHELF_DATA_PATH, etc.) - Smarter file watcher: settle-based debounce (waits for 2 seconds of quiet) replaces the fixed 1-second sleep — a Syncthing sync now triggers one rebuild instead of ~11
- Cleaner logs: startup info and watched directories each collapse into a single line
- Hidden flow pages: KOReader's "hidden flow" pages (front matter, etc.) are now supported so page counts and activity data match what you see on the device
Updated Dependencies
- TypeScript 5.7 → 5.9, jsdom 28 → 29, @tanstack/react-query 5.66 → 5.95
- zip 8.1 → 8.4, ureq 3.1 → 3.3
- Added foliate-js (reader engine), Noto Sans/Serif and Quicksand fonts
- Added argon2, rusty_paseto, governor, uuid, dashmap (auth stack)
- Removed server-side Fluent/ICU localization crates (localization is frontend-only now)
Warning
Breaking CLI changes: The flat koshelf --library-path ... --output ... invocation is replaced by subcommands. Use koshelf serve --library-path ... --data-path ... or koshelf export <output> --library-path .... Run koshelf --help for the
full reference.
Full Changelog: v2026.3.0...2026.4.0
2026.4.0b3
What's Changed
Note
This is a pre-release beta!
This beta adds page activity (similar to bookmap in KOReader)
2026.4.0b2
What's Changed
Note
This is a pre-release beta!
This beta adds annotation writeback and full reader customization
- Annotation writeback: Highlights, bookmarks, and reviews can now be edited and deleted directly in the KoShelf UI. Changes are synced back to the KOReader sidecar files on disk. (#69)
- Reader presentation settings: The in-app reader gains comprehensive style controls — font family, font size, line spacing, word spacing, and margins — organized into collapsible settings sections with per-value editing and a reset option.
(#68) - Book navigation drawer: A new slide-out drawer in the reader provides quick access to the table of contents and annotation lists, making it easy to jump between sections and highlights.
- Hidden-flow page tracking: KOReader's non-linear flow points (e.g. footnote pages) are now parsed and subtracted from page totals, so reading statistics and completion detection reflect the actual linear page count.
- Dependency upgrades: Major and minor dependency updates across the stack; unused Rust crates removed.
API changes
PATCH /api/items/:id/annotations/:id— edit an annotation (highlight text, color, bookmark, review fields)DELETE /api/items/:id/annotations/:id— delete an annotation
Full Changelog: 2026.4.0b1...2026.4.0b2