github Kareadita/Kavita v0.8.9
v0.8.9 - New Stats pages, Journal Style reading, 50x Faster Scanner, and so much more!

12 hours ago

Happy New Year! Every year, I hope to have a release at the end of December or the Start of January, but it never seems to happen; the scope of Kavita releases have just become too large. This release of Kavita is quite expansive and completes on of the core goals I laid out last year - Journal Style Progress. But it's not just that, it's 12 Feature Requests with a total of 98 upvotes, it's reworking a lot of foundational code now that we have multiple authentication mechanisms, improving Developer Experience working with Kavita (no more JWT management), a MASSIVE speed improvement to the scanner, and of course a brand new stats system for Kavita (with a lot of inspiration from Hardcover).

Since this is such a massive release, I wont be able to highlight all the large improvements, but I know you'll love it. Before I go some of the big hitters, I want to talk about what Amelia and I have planned for this year. Carrying over from last year, there are a few more areas of interest, then we plan to step back and start building an official, native mobile app experience for Kavita.

The key areas of focus:

  • Reading List Overhaul Project - I've worked closely with the CBL group to define some key improvements to Kavita's reading list experience along with the CBL import.
  • Kobo Sync - Another big one that most other servers have adapted. We have Progress Sync support already, but this is the icing on the cake.
  • Kavita+ Enhancements - Hardcover and MangaBaka (once it's stable) are still on my list, along with a slew of issues that have been piling up.

I look forward to your feedback on the new release. Before we go, I'd like to give a shout-out to @daydreamrabbit who has been very active in testing this release and opened a whopping 39 issues this release, of which we closed 26!

Highlights

First off, let's focus on the Foundations of Kavita with 3 key features:

Auth Stack

Last release, Kavita added OIDC into the mix of authentication. While not an issue, users started noticing inconsistency on when their last updated for the accounts were, asking for it on OPDS. Kavita has grown to be quite complex and I knew with this release, I wanted the concepts of Devices (something that has prevented binding reading settings per physical device).

The Auth stack has been reworked to be driven completely in the middleware (the code that runs between your browser making the request and Kavita's code actually handling it). This middleware stack extracts the key information from the different authentication mechanisms, coalesces a device from fingerprintint, and tracks it if needed. A lot of polish has gone into this layer to ensure speed. This also results in easier code for Amelia and I when building new APIs.

Developer Experience

Since we have this new Auth stack, it was finally time to move off the JWTs for external applications. JWTs were handy because they fit into the existing codebase seamlessly, but with the power of the new auth, it doesn't matter how you connect, Kavita will derive the same data and interface for all APIs to use. So now, any user can create a named Auth Key (replacing the hardcoded api key) with their own expiration (or never) and a configurable length (9-32 characters). Attach that as the header (x-api-key) and you will have the same benefit as using a JWT. If there is an expiration, use /api/plugin/authkey-expires.

Client Devices

Client devices are the last piece of the puzzle and a critical aspect of this release. A client device is any device that interacts with Kavita. Users can after the fact rename them, but as you see here, the mechanism (Web App, OPDS Client, KOReader) and user are present. This will help end users know how different external apps, but also drives the activity mechanism (like Plex has) to ensure you don't bounce your server while people are reading.

user-settings-client-device

Journal-Style Progress

This is the main focus of the release and allows for Kavita to track how you read much more closely. With the new auth stack and devices as foundations, Kavita can now track reading sessions and re-read counts (more about this below). No longer will you have to overwrite progress when you re-read a book.

image

Massive Scanner Improvements

We got some big improvements thanks to @Fesaa (Amelia)'s smart thinking and some realizations we had around managing contexts in the scan loop. The scanner is now multi-threaded with none of that old FK issue to boot. To quote some of our big comic collectors:

14 days -> 3 hours over 141K files (112x faster)
10 days -> 4 hours over 50K files (60x faster)
3.5 hours for 96K archives with 32 threads

The only thing of note is that covers do not show up at the same time as the series in Kavita. They are now done on a background thread in a more async way. I think the improvements are worth the trade-off.

Double Reader Page Offset

This is a big hitter the community has been asking for (37 upvotes) since I redid the Double Reader experience and it's finally here. It's modeled off MangaDex and was contributed by @linkion.

Device-bound Reading Profiles

Another big one is binding of Reading Profiles to client devices. You can already do per-library/series, but now as well directly to a device (which takes precedence if you're using that device).

KOReader

KOReader got a ton of polish. In the last release, users reported the Progress Sync not working reliably. I went back in there (now with a much easier to type Auth Key) and polished everything. While I was doing this work, I decided to expand support to all files (Pdf, Epub, Archives). The progress syncing will work great with Kavita for all your reading needs.

New External Apps

Lastly, a few new apps have launched around Kavita. The first is Kamare, a Koreader plugin that uses Kavita's API (resulting in a much better experience) and a custom reader for consuming comics.

Inkita is an android app built for Kavita. It's still pretty early in development, but fully functional. I would highly recommend checking it out if our PWA doesn't work for you.

OPDS

I also spent a whole day reworking a lot of the OPDS code to make it MUCH faster and streamlined some of the naming code to avoid things like Chapter Chapter 1. Just in time as a few users brought up timing issues.

The Progress Overhaul

One thing that has bugged me is Kavita has no concept of reading time and no concept of reading count. Every time a new Nagatoro volume came out, I re-read the past few Volumes to refresh myself. The original progress events were lost and my stats got messed up. That's no longer a problem with the new system.

Re-read Prompts

image

First off, users can now configure (default 30 days) if they should be prompted to re-read the last chapter/volume. When you choose to re-read it, Kavita will track that it has already been fully read. You can see the counter of how many reads in the series detail page.

Profile

User stats are now in the Profile screen which can be accessed by clicking your name in the header. You can opt-in to share your stats with others on the server. We took a lot of inspiration from Hardcover's excellent designs and adapted to the generic nature that Kavita is, but I think it really turned out great. Here are a few snippets from the page.

image profile-page-2

Stats Page

Server stats also got reworked and some of the management graphs were moved to their own tab. Likewise, this was a massive overhaul, so here's a teaser.

server-stats

Added

  • Added: Added a library setting to automatically copy weblinks from the first chapter in a series to the series. Defaults to false. (FR #3857, 2 upvotes)
  • Added: Volume and chapter detail pages will now show release years (FR #4145, 1 upvote)
  • Added: Added a library setting to set a default language for series when none is set in metadata (FR #4085, 1 upvote)
  • Added: Added custom keybinds, allowing users to remap, and add up to 5 keybinds per action. (FR #2563, 11 upvotes)
  • Added: Added some new custom keybinds for the site navigation.
  • Added: New settings for OPDS to allow a user to turn off Embedding the progress indicator in the title (great for KOReader, bad for Panels) and injection of a Continue Reading entry at the top. (FR #4131, 2 upvotes)
  • Added: sorting series by user rating (FR #4210, 1 upvote)
  • Added: Added the ability to create named Auth Keys with custom length (9-32 characters), expiration date per-user. Kavita will email users that the key is expiring soon or has expired if email is setup on the instance. (FR #3539, 3 upvotes)
  • Added: User LastActive will now be updated on any activity with Kavita
  • Added: Kavita now tracks all interactions with it for authenticated users/api/opds and will create a Client Device to represent interactions. Users can rename the devices or remove them. Devices contain some basic fingerprinting to avoid creating necessary noise.
  • Added: Kavita now allows admin's to see who is interacting with their server, on what device, and if they are active or not.
  • Added: Kavita now tracks reading sessions and will drive statistics from these. Reading sessions are created per-user on reading activity and expire after 30 minutes without further activity or at midnight. Reading sessions track what was read, how much, and total. Kavita will compact the data daily into a separate table for historical reasons with higher level aggregations.
  • Added: Kavita will now keep track of how many times you read a chapter/series (re-read count)
  • Added: Kavita will now prompt you if you haven't read a chapter after X days (configurable in settings) to either start over from the beginning, read incognito, or continue as-is. Reading over from the beginning will trigger a total read count increment.
  • Added: Added the ability to have a personalized profile screen to share with other users on the server. This is an opt-in feature. Profile screen will show information about what you do on the server, interesting facts about your reading habits, and reviews (a separate opt-in control).
  • Added: Users can now upload a profile image of themselves for their profile page and any other social interactions.
  • Added: Added the ability to filter annotations by likes
  • Added: Kavita now accepts an x-api-key header with an Auth Key for authentication. External apps no longer need to deal with JWTs. New API plugin/authkey-expires to check expiration on auth key.
  • Added: Profile pictures will sync with the picture claim if the user currently has no profile picture and OIDC sync is enabled.
  • Added: Added the ability to change the PDF renderer resolution (Mihon-apps) via a Server Setting. The admin can choose Default (1080x1920), High (1920x2560) or Ultra (2160x3840) (Thanks @StereotypicalCat)
  • Added: Massive overhaul to the server stats page. Focused into 2 tabs: Stats and Management. Stats gives you some unique insights into how your server is being read from with aggregate data. Management provides high level information like files added over time, spread of formats, publications statuses, etc.
  • Added: Reading profiles can now also be bound per device. Profiles with a device get precedence to profiles without. Each series can have at most one profiles for each device, and one without any. (FR #2929, 34 upvotes)
  • Added: Added stat collection for total pages/words/time read for users for an planned social badge feature
  • Added: Added the ability to sort by a user's own rating (FR #4210, 1 upvote) (Thanks @ToniKielo)
  • Added: Page offset toggle for double page manga reader mode to manually adjust page alignment for proper double-page spreads, including a keybind to toggle it. (FR #2660, 37 upvotes) (Thanks @linkion)
  • Added: Added the ability to read with Progress Sync for all files in Kavita (archives/pdf/epub) using Koreader (#4125, 3 upvotes)
  • Added: Added a 1am background job that ensures admins always have the appropriate side nav links for libraries. 2 users have reported an issue. I couldn't reproduce, this will fix just in case on their systems.

Changed

  • Changed: Highest count in series info will now show no data if it's an internal magic number.
  • Changed: People pages will now also show external links to MyAnimeList and Hardcover if their respective IDs are configured
  • Changed: External ID tooltips will now show the character link when the person is only a character
  • Changed: Changed the files at root warning during library creation to be a lot more obvious
  • Changed: Backup files will now use ISO 8601 to denote time. (FR #4012, 2 upvotes)
  • Changed: Updated the design of the tooltips across the app for better contrast
  • Changed: Run metadata saving, and extra work on separate threads during the scan loop
  • Changed: Show a progress bar in the UI for the scan
  • Changed: Cover UI updates will now have a progress bar with information in it
  • Changed: Massively improve the performance of updating a series during the scan loop
  • Changed: The backup service now uses the SQLite command VACUUM INTO to create a working copy of the database file at the time of backup. (Thanks @DieselTech )
  • Changed: Removed API Key from User
  • Changed: Streamlined LastActive for user accounts to be handled for any API activity
  • Changed: Opening the readers will no longer send a progress even immediately, you must paginate/scroll to send progress.
  • Changed: Email-based devices are now called Email Devices to not clash with new Client Devices.
  • Changed: Review cards username can be clicked to load their profile.
  • Changed: Updated to .NET 10
  • Changed: Remove default keybinds referencing meta keys (Windows Key)
  • Changed: Do not use OIDC Authentication scheme if OIDC failed to initialize. Extra fail safes in case users OIDC did not initialize successfully, to not auto redirect etc
  • Changed: (Kavita+) Don't block startup to check for K+ license, do it in a background thread instead.
  • Changed: OIDC roles are now case insensitive when syncing.
  • Changed: Cleaned up some UX around customize stream items settings page
  • Changed: All tables will now use card layout for mobile with full functionality.
  • Changed: (Performance) Improved the get continue point api
  • Changed: Removed progress tab on volume/chapter edit modals
  • Changed: On mobile, download actionable will be pushed to the top layer (aka it's not nested anymore)
  • Changed: OIDC cookies persist between restarts, removing the reauth flow each restart
  • Changed: Display a warning when the read only role is selected when selecting roles for a user to really drive home what it means
  • Changed: (Performance) Slight memory improvement in creating images from PDFs
  • Changed: Split left/right & up/down into different keybinds
  • Changed: Updated to Angular 21
  • Changed: Removed user stats page in favor of the profile page. Migrated the ability to click Total Comics/Books/etc to get historical data there as well.
  • Changed: All but Manage Users/Libraries tables will now turn into cards on mobile viewports
  • Changed: Marked a good amount of APIs as deprecated if they were no longer in use. These will be removed in v0.9.0 (next year).
  • Changed: A lot of polish overall on Profile and Server Stats page
  • Changed: Implicit profiles will now automatically be bound to the device you're using when they're created
  • Changed: Search now searches against aliases for People
  • Changed: (OIDC) Added a warning when auto save is required and a button to reset external Ids
  • Changed: (Stats) Stop reporting average time to open an archive to Kavita Stats after the instance has sent 2 reports.
  • Changed: Details page for volume/chapter will show the full file path and the koreader hash if present
  • Changed: Removed a lot of dead localization keys
  • Changed: Server Stats is now under Insights section
  • Changed: Large optimizations on OPDS APIs. Things should be more consistent and faster across the board.
  • Changed: Scan Folder API will now not force cover regeneration
  • Changed: Event widget now shows active readers, rather than online users.

Fixed

  • Fixed: Fixed not being able to change a person's name and use it as an alias in the same action.
  • Fixed: Fixed bulk bookmark actions, showing view series.
  • Fixed: Fixed logging out with OIDC throwing an exception when using Authelia
  • Fixed: Fixed some OIDC errors showing a json response rather than redirecting to the login screen
  • Fixed: Fixed a potential edge case in the match modal code, allowing the spinner to stay indefinitely
  • Fixed: Fixed broken link image being the wrong colour for light/dark themes
  • Fixed: Fixed chapter detail, always showing a link to Kavita
  • Fixed: Fixed character external AniList links being incorrect
  • Fixed: Fixed locations always being locked after changing any role.
  • Fixed: Fixed unused person cover images not being removed.
  • Fixed: Fixed publication date, not being localized
  • Fixed: Fixed chapters by role streams on person page, not sorting volumes correctly.
  • Fixed: Fixed sometimes not being able to upload person cover without resetting first.
  • Fixed: Fixed not being able to remove OIDC configuration once set
  • Fixed: Fixed magic numbers showing up in the publication status tooltip
  • Fixed: Fixed selected language not always showing up in edit modals after opening it
  • Fixed: Fixed KOReader Progress sync again
  • Fixed: Fixed a bug where lastReadDate wasn't being calculated correctly on multiple APIs
  • Fixed: Fixed recently updated not using pagination, causing the dashboard to become unresponsive when a large amount of series were recently added
  • Fixed: Fixed some library settings not saving on creation.
  • Fixed: Fixed the db being missing in backups rarely when it was already in use (Thanks @DieselTech )
  • Fixed: Fixed some flakiness with the keybind pickers
  • Fixed: Readonly role handling wasn't explicitly on the annotation code
  • Fixed: Some old migrations were running on each startup for no reason
  • Fixed: Some old app users (~4 years ago) didn't have createdUtc filled correctly for their User Table
  • Fixed: Some old migrations were missing date columns in AppUserRating
  • Fixed: Only show entity size on detail pages when the user is admin or has download role.
  • Fixed: Fix ChapterDto missing some locks
  • Fixed: Fixed webtoon reading mode icon being incorrect
  • Fixed: Fixed edit series relationship form not always rendering names
  • Fixed: Fixed not being able to remove the first series relationship
  • Fixed: Potential fix for bookmark image button in epub reader positioned poorly
  • Fixed: Fixed default language, Remove Sort Prefix, and Inherit web links from first chapter not saving on library creation
  • Fixed: Fixed Reading Profile action menu not working on library detail page
  • Fixed: Fixed OIDC not being enabled if the IDP is not reachable at startup. Must be reachable on the first request.
  • Fixed: Fixed container process ignoring signals, notably preventing cleanly stopping the container with docker stop or podman stop (Thanks @ZeroKnight )
  • Fixed: Fixed a bug where a readonly admin account could be valid
  • Fixed: Fixed how scheduling tasks with a random spread works to be more reliable.
  • Fixed: Fixed a bug where ASIN weren't allowed on Edit Person modal
  • Fixed: (Kavita+) Potential fix for Kavita refreshing metadata and loosing match on series
  • Fixed: Fixed a bug where bookmarks could be orphaned in the DB. You still will never lose the bookmarked files.
  • Fixed: Fixed issues where some PDFs wouldn't render correctly
  • Fixed: Fixed dropdowns having a black chevron in a dark theme.
  • Fixed: Fixed an issue where some cache profiles weren't being respected on Browsers
  • Fixed: (OIDC) Fixed being logged out when Kavita restarts with Docker
  • Fixed: Don't let users download a PDF within the reader via Ctrl+S without the download role
  • Fixed: Fixed Edit Chapter modal not having an Editors field
  • Fixed: Fixed some settings being reset to their default value when saving something in the general tab
  • Fixed: Fixed card items not aligning with width to cover images
  • Fixed: Fixed not being able to add External Sources
  • Fixed: Fixed not being able to edit your own Age Rating restriction even if you have the role
  • Fixed: Fixed Reading Profile names not updating due to some normalization issues
  • Fixed: Kavita is more lenient when deleting bookmarks.
  • Fixed: Fixed delete not working on chapter detail page
  • Fixed: Fixed OPDS recently-added not having pagination in the feed
  • Fixed: Fixed a few migrations that were running on each startup
  • Fixed: Fixed actionable modal being cutoff
  • Fixed: Fixed a bug with light novel libraries sometimes choosing the wrong starting location
  • Fixed: (Kavita+) Fixed a bug where check license button only worked the first load.
  • Fixed: Fixed a bug where after removing a theme, the old theme wasn't removed from the page and could result in some style bleed until refresh

API

  • GET /api/upload/reset-chapter-lock has been marked deprecated and will be removed in v0.9.0 (next release)
  • POST /api/want-to-read/ will be removed in v0.9.0, use v2 instead
  • POST /api/account/reset-api-key is removed, use /api/account/rotate-auth-key
  • GET /api/users/myself is now deprecated and will be removed in v0.9.0
  • GET /api/series/chapter-metadata, POST /api/series, POST /api/series/recently-added, POST /api/series/all, POST /api/upload/reset-chapter-lock, GET /api/stats/user/reading-history, GET /api/stats/server/top/years, GET /api/stats/reading-count-by-day, GET /api/server/count/year, GET /api/stats/server/top/users, GET /api/reader/all-chapter-progress, GET /api/recommended/quick-reads, GET /api/recommended/quick-catchup-reads, GET /api/recommended/highly-rated, GET /api/recommended/more-in, GET /api/recommended/rediscover will all be removed in v0.9.0 (next release)

Theme

  • Added css variables to style tooltips: --tooltip-caret-color, --tooltip-bg-color, --tooltip-outline-color
  • Added misc css variable --offwhite-text-color
  • New css variables --dropdown-icon-white and --dropdown-icon-black
  • Added --activity-card-client-platform-badge-bg-color, --activity-card-client-device-badge-bg-color for Activity card badges

Don't miss a new Kavita release

NewReleases is sending notifications on new releases.