Skip to content

Releases: paviro/KoShelf

2026.6.1

Choose a tag to compare

@paviro paviro released this 06 Jun 19:49

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.sqlite database
  • 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_DB support
  • Added kobo_db support 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

Choose a tag to compare

@paviro paviro released this 31 May 12:05

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 sqlx 0.9, quick-xml 0.40, and rusty_paseto 0.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

Choose a tag to compare

@paviro paviro released this 22 Apr 23:49

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 --watch file watcher was not retaining the reading data store between rebuilds, causing statistics to be silently discarded and has_reading_data to be reported as false after any targeted rebuild triggered by a database change

Full Changelog: 2026.4.4...2026.4.5

2026.4.4

Choose a tag to compare

@paviro paviro released this 19 Apr 14:46

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-mode on 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-effect lint 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

Choose a tag to compare

@paviro paviro released this 03 Apr 20:39

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.rs split into build/{main,shared,react,compress,licenses,locale}.rs
  • app/run.rs split into bootstrap.rs and 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

Choose a tag to compare

@paviro paviro released this 29 Mar 00:16

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

Choose a tag to compare

@paviro paviro released this 28 Mar 19:53

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: gzip to 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.md file

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 lang attribute is set so the browser can hyphenate correctly
  • MetricCard small-size variant uses consistent layout breakpoints and label sizing

API Changes

  • The /api/site response now groups authenticated and password_policy under an auth object (previously flat top-level fields); the redundant auth_enabled capability 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

Choose a tag to compare

@paviro paviro released this 28 Mar 01:47

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.*.lua sidecar 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 --random for 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-password instead 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

2026.4.0b3 Pre-release
Pre-release

Choose a tag to compare

@paviro paviro released this 26 Mar 22:47

What's Changed

Note

This is a pre-release beta!

This beta adds page activity (similar to bookmap in KOReader)

2026.4.0b2

2026.4.0b2 Pre-release
Pre-release

Choose a tag to compare

@paviro paviro released this 23 Mar 15:03

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