Releases: Kareadita/Kavita
v0.7.3.1 - Hotfix
A reader bug slipped through release testing, so here's a hotfix for everyone.
Changed
- Changed: When deleting a library, give the library name in the prompt
- Changed: Directory Picker will now sort libraries as some OSes don't return paths sorted
Fixed
- Fixed: Fixed an issue with fit to width on mobile from last release
- Fixed: Fixed an issue where creating a new library, advanced settings wouldn't persist
- Fixed: Fixed an issue where kbd tags with paper theme would render incorrectly
- Fixed: Fixed an issue where wrong cover could be chosen for series in an edge case setup
- Fixed: Fixed an issue where typing in the autocomplete for directory picker would throw errors
v0.7.3 - The Quality of Life Update
v0.7.3 is here and quite quickly from the last release. v0.7.3 was originally designed to be a release where I would bring a really awesome set of features I've been dreaming about, but unfortunately, I hit challenge after challenge each step of the way. Instead of making the community wait months for me to solve all the challenges with them, I decided to release early and keep working on them slowly in the background. With that in mind, you will still see some nice additions to Kavita in this release and a heck of a lot of polish all around. Let's get into it.
Web Links
This is something I am most excited about and have been really enjoying, especially for something coming in v0.7.4. Web links are external websites that have some relation to a series, like an AniList entry, a Plex entry, etc. A series can have many different weblinks and Kavita will attempt to download a favicon for the website, else fallback to Kavita's own icon (you can raise a PR and submit one yourself).
Streamlined EncodeAs
Kavita has offered the ability to save covers and bookmarks in WebP or the default png for quite some versions, but in Kavita v0.7.3, we added AVIF support. What if users wanted to save their media in AVIF instead of WebP? This release, we redesigned the encoding process so you have full control over what is used. (Note: You MUST update the Save As Encoding if you were previously using WebP. This update will not carry that over for you.)
Media Errors
This is one I took inspiration from Komga, but have you ever had Kavita not pickup on a file and wondered why? Did you not want to search through the logs to figure it out? Well now, you can just go to Admin -> Media and see a list of all issues present during a scan (and even when you open Epubs for reading). This is extremely helpful and should help those with massive collections find what Kavita doesn't process.
EPUB Love
This release I also spent a lot of time working on the epub parser so that Kavita could support reading list and collection generation from epubs, much like we have with ComicInfo.xml. Tons of work went into table of content generation (when there isn't one in the epub file), link mapping, css support, etc. Overall the book reader should perform much better and have more true-to-the-book rendering.
Overall this release is full of quality of life enhancements and polish. Next release I have something interesting in store. Thank you to all that have helped out in this release, especially those who gathered the many favicons. I appreciate all you do.
Added
- Added: Kavita will now report basic information to the user on when media errors occur, like invalid structural metadata (epubs) or bad archives. This can be found in Admin -> Media tab. Please provide feedback so we can tweak the experience.
- Added: Kavita can now create Collections from title-type='collection' tags and reading lists when accompanied by display-seq and a count > 0. See the wiki for updated documentation.
- Added: Epubs can now use the refines=file-as to explicitly set sort title, which will override taking from belongs-to-collection or calibre:series
- Added: Added basic ISBN search which will show the chapter
- Added: Explicitly capture more people roles from Epubs. Now, translator, artist, publisher, editor, etc can all be extracted from refines tags.
- Added: Added support for building reading lists and collections from Epubs
- Added: Paper book reader theme
- Added: Added the ability to import multiple comma separated links from the Web tag from ComicInfo.xml and view them on Chapter level details
- Added: Added the ability to add multiple links at Series level and thus the ability to click them from within Kavita
- Added: Weblinks can now fallback to Kavita hosted favicons (on our main site), thus enabling a way for the community to submit ones which Kavita cannot parse that will benefit all installs.
- Added: Added ISBN support for Chapters in Kavita. This can be parsed from epubs (isbn) or ComicInfo.xml (GTIN from 2.1 Spec). For GTIN, note that ISBN-10 are not supported. Valid ISBNs only will be saved, invalids will be rejected.
- Added: Kavita now supports AVIF (8-bit only) out of the box. 10-bit will not work.
- Added: You can now use AVIF for saving Kavita managed files (covers, bookmarks, favicons)
Changed
- Changed: Removed an additional ComicInfo read when comicinfo is null when trying to load. But we've already done it once earlier, so there really isn't any point.
- Changed: How we check if a container is docker or not has been streamlined and hopefully more reliable (This fixes saving server settings for Unraid issues)
- Changed: Expanded Table of Contents generation (aka where Kavita tries to generate a simple one with epub doesn't have one) to also check for navigation.xhtml as well as toc.xhtml.
- Changed: Updated EpubReader to v3.3.0 which adds Epub 3.3 support
- Changed: Added more page hacks when invalid keys are used in the epub when rewriting anchors
- Changed: Updated the app to Angular 16. No user facing changes.
- Changed: Strip more forms of comments (especially ones that shouldn't be in CSS files) from CSS before parsing/inlining in epub reader
- Changed: Handle if ExCSS throws an exception during inlining and attempt to fallback to scoping css instead of inlining.
- Changed: When there are duplicate files that make up a volume, show the count on series detail page, like we do with chapters
- Changed: Authentication now expires after 2 days. Refresh tokens will attempt to keep user logged in by refreshing authentication every 10 minutes.
- Changed: Removed old migrations for Kavita startup. Only migrations from v0.72 onwards are present.
- Changed: Disable login button when a login is in-progress. This can help prevent lock out.
- Changed: (API) Added NoContent responses when APIs don't find entities
- Changed: Reading list page refreshes after updating info in the modal
- Changed: Updated initial install default keys to be 256 bits for the encryption. You may be logged out and have to reauthenticate or change your token key to "super secret unguessable key" and restart (which will allow Kavita to regenerate the key for you). This is in config/appsettings.json
- Changed: Modified the docker entrypoint script to copy in the appsettings.json config rather than manually write a new one via echo
- Changed: When rounding bytes to human readable (ie 2MB), if there is a decimal that is not .0, show it
- Changed: (BREAKING CHANGE) Save Bookmarks/Covers as WebP has been removed. There is a new setting called Encode Media As. This will allow you to select PNG, WebP, and AVIF. All Kavita managed media (bookmarks, covers, favicons) will use that globally. You cannot convert from WebP/AVIF back to PNG. For covers, you will have to regenerate them. Bookmarks and favicons cannot be changed back. (favicons can be deleted manually by admin and regenerated naturally)
- Changed: Streamlined tasks for convert to offer just a single task that does everything.
- Changed: Moved to using pre-calculated extension for sending stats rather than doing it on the fly
- Changed: When adding a rating for a series for the first time, don't prompt to write a review.
- Changed: Refresh tokens will now reauthenticate every 10 mins to ideally never let a user have to log out
- Changed: Expanded the range of time in which a version update check can occur
- Changed: Reading list page refreshes after updating info in the modal
Fixed
- Fixed: Added better fallback implementation for building table of contents based on the many different ways epubs are packed and referenced.
- Fixed: Fixed docker users unable to save settings
- Fixed: Fixed a bug in mappings (keys/files) to pages that caused some links not to map appropriately.
- Fixed: Fixed a bug where continue reading was wrong in an edge case scenario
- Fixed: Fixed another edge case where continue reading opened the wrong chapter
- Fixed: Fixed an issue where jumpbar would be disabled when it shouldn't, like on bookmarks page
- Fixed: Fixed processing logic error that if StoryArcNumber is empty, then multiple StoryArc's are not processed (similar would occur if multiple StoryArcNumber's are present for a single StoryArc).
- Fixed: Fixed inclusion of spaces in multiple StoryArc's due to ', ' as a common CSV format.
- Fixed: Fixed a bug where an empty space could throw an error when creating a library.
- Fixed: Fixed a bug where spreads could stretch on PC
- Fixed: Fixed a bug where reading list dates couldn't be cleared out
- Fixed: Fixed an issue where create library wouldn't take into account advanced settings
- Fixed: Fixed an issue where selection of the first chapter of a series to pull series-level metadata could fail in cases where you had Volume 2 and Chapter 1, Volume 2 would be selected.
- Fixed: Fixed a bug which caused refresh token to always return invalid
- Fixed: Fixed a bug where Kavita couldn't parse Series name when there was no volume/chapter keywords and a chapter range (ie Series 001-003)
- Fixed: Encode filenames before sending them to the UI for downloading to prevent non-english characters being replaced by underscore
- Fixed: Added support to parse ComicInfo.xml when they have empty single tags
- Fixed: Fixed a bug where spreads could stretch on PC in manga reader
- Fixed: Fixed a bug where reading list dates couldn't be cleared out
- Fixed: Fixed an issue where create library wouldn't take into account advanced settings
- Fixed: Fixed an issue where selection of the first chapter of a series to pull series-level metadata could fail in cases where you had Volume 2 and Chapter 1, Volume 2 would be selected.
- Fixed: Fixed a bug where scan series wouldn't trigger word count analysis...
v0.7.2 - Reading Lists, CBL Support, OPDS Flattening and More!
v0.7.2 is finally here and it brings not only a ton of bugfixes, but also some really important additions for Comic collectors. The theme of this release is Stability and Reading Lists, but as you know, along the way new ideas spark.
Let's start with some big hitters:
CBL & Reading List Enhancements
Kavita now has support for Bulk CBL Import and has drastically cleaned up the reading list experience, esp if you have more than 100 chapters in a reading list. First of all, virtualization for reading lists, a range year to understand the years in which the reading list spans, all characters will be shown on reading list detail page, and some cleanup on the styling. Next is CBL import, which is a reading list format that allows easy sharing. Kavita can handle multiple at a time and uses a wizard to process each and every list, prompting you when there are issues to reduce having to delete the list and restart. If CBLs are something you haven't heard of, check out Diesel's lists here.
Epub Reader
The Epub reader got some love this release with Vertical reading support. If you're a fan of reading up and down, you now can! Thanks to @CKolle for taking this effort up, not only do we have Vertical reading support, the code around orienting and aligning images in the reader has been spruced up and should result in a much better experience all around.
Base URL Support
This has been a big ask since day one and we now have it. Thanks to @gmahomarf for helping me get it done and others for helping test it in many different situations. Please note that Base Url is not supported in Docker environments with a non-root user, due to permissions limitations. If this interests you, please raise a PR with a fix.
All in all, there is a ton of polish and performance improvements in this release. Next release will be some time off, I have something big prepared but it will take quite some time to get implemented and polished. I look forward to it landing as I'm sure everyone will enjoy this feature. I also want to give a shout out to the community for following through and raising a ton of issues. As we can all see, it has helped me close them out.
Note: We now have a themes repository. If you are maintaining your own or want to share it with others, please raise a PR for inclusion.
Please update KavitaEmail to latest if you are running your own version. Docker users will need to setup from scratch due to removal of Environment variables
NOTE: If covers don't show, do a hard refresh so new UI code is working
Added
- Added: Added the ability to import CBL files into Kavita via reading list page or side nav. Kavita uses a multi-step process to ensure you aren't wasting your time on the import. Kavita can handle multiple cbls being imported in one go.
- Added: Added noindex to prevent SEO from indexing user's sites.
- Added: (epub reader) Vertical reading mode support added to the web-based book reader. This feature is particularly useful for reading genres like Japanese light novels. (Thanks @CKolle)
- Added: Edit Reading Lists now allows selection of cover image from existing items
- Added: Updated Kavita's OPDS-PS implementation to v1.2 to align with upcoming Panels enhancements
- Added: Added a new Login role which allows you to log in. Admins can now disable accounts by removing the role from user accounts.
- Added: Series detail page will now show a progress bar under the series image to give a hint to how far completed the series is to being read.
- Added: New user setting to collapse series that have relationships in the library view. This means if you have Batman and Batman the Sequel linked, only Batman will show on library page.
- Added: (epub reader) If a page only contains a single image. It gets positioned to the center in column mode
- Added: (epub reader) Added a check for if the current page only contains a single image. Happens during loading as to not have the image pop in place.
- Added: Base Url support. This will not work if using Docker with non-root setup. (Thanks @gmahomarf )
- Added: Added ability to read from incognito from the main series detail button
- Added: Reading Lists can now have Starting Month/Year and Ending Month/Year. You can use the UI to set it, but during processing of reading list it will be recalculated and set if calculation output is valid. These fields are aimed at showing you a span of a reading list run.
- Added: CBL Import of upcoming fields (StartYear, StartMonth, EndYear, EndMonth) mapping to the fields above. When importing via CBL, the CBL will take precedence over any calculations. Will not stick if another item added/removed from the list afterwards.
- Added: New API which allows getting thumbnails (cover image size) for pages within a pdf or archive/image media
- Added: If CBL has a Summary tag, it will now set the summary in Kavita (this is a proposed enhancement to CBL format)
- Added: Added parsing support for Series Chapter 001 Volume 001
- Added: Added ability to override Kavita's XFrameOptions via appsetting.json XFrameOptions key. This is useful for Organizer setups without having to strip from the header.
- Added: Added rate limiting for a few APIs
- Added: There is now a donate button on the side nav for all users.
- Added: Added the ability to create reading lists from ComicInfo StoryArc and AlternativeSeries. The implementation matches Komga to ensure consistent experience for users. Comma-separated values are supported in StoryArc and AlternativeSeries and will build pairs for ordering.
- Added: Plugin/Authenticate will now return a refresh token with the payload
- Added: Added ability to emulate comic book with single renderer. This only shows on spread (wide) images
- Added: New API endpoint to allow scanning all libraries at once
- Added: All Login dtos now have the active KavitaVersion to make external apps able to handle what version of the API they are connecting with.
Changed
- Changed: Updated to .NET 7
- Changed: Enabled nullability analysis in the application. This lets developers catch more edge cases easier
- Changed: Prompt the user when they are about to delete multiple series via bulk actions
- Changed: When skipping over folders in a scan, inform the UI event widget
- Changed: Adjusted the folder watcher to turn off folder watching if too many restarts get triggered
- Changed: Don't scan .@_thumb directory on QNAP systems
- Changed: Some time displays in hours will now show days or minutes. This is mainly on the stats page to give an easier way to understand the data.
- Changed: When hovering over the jumpbar, it will now show how many series for that letter.
- Changed: User Management account now merges Pending users with other members. Users will still show if they are pending via a badge and different options will be present. This will allow admin's to change a pending user's roles and library access at any time. Side effect is legacy accounts that existed prior to email requirement can now be managed.
- Changed: After editing a series metadata, run cleanup code for tags, people, and genres to ensure unused entities are removed instead of waiting for a nightly job
- Changed: (epub reader) Previously the preserveAspectRatio got ignored due to lacking max-width. Meaning that whether an image's aspectRatio gets changed is decided by the book. Because of this, most cover image's aspect ratio would not be preserved. This is now not the case.
- Changed: When inviting a user, the email is attempted to send on a background thread to not block the UI for up to 30 seconds (
- Changed: Reading History for user now users average hour read rather than reading events to bring more meaningful data
- Changed: Many reports of numbers (like 2000 series) are now comma separated
- Changed: Reading list page will now show all characters from the underlying chapters
- Changed: Reading list detail page will now restrict drag-and-drop reordering if there are more than 100 items. In this case, virtualization will be used and the reorder numbers in Page Settings can be used instead.
- Changed: Updated a link on theme manager to point to the new github repo for themes
- Changed: Kavita will now cleanup reading lists with no items at night
- Changed: Don't allow nightly cleanup to run if we are currently running a media conversion (like webp conversion)
- Changed: Added back the online user indicator on manage users page
- Changed: Updated many inputs to be more friendly on mobile
- Changed: More aggressively lock to prevent race conditions when editing People, Genres, Tags in Scan loop.
- Changed: All widget events will now show the title (browser tooltip) to read the cutoff words
- Changed: Further flattened the OPDS structure so now after a series you have all the items then the acquire links. Max depth is 2 from a series (plus acquire link) (Thanks @therobbiedavis for driving this home)
- Changed: Optimized the Size property in OPDS acquire links to use pre-computed size to avoid an I/O operation
- Changed: Sped up Age Rating rendering on the UI
- Changed: All image access requires an ApiKey in the url
- Changed: Updated a ton of dependencies including PDF.js to 3.x branch
- Changed: Tightened up spacing on login page
- Changed: Disabled IpAddresses and Port controls on server settings for docker users
- Changed: OPDS queries all use pagination, instead of just some of them
- Changed: When testing email service, an actual email will send to the user when email service is custom (Requires KavitaEmail v0.1.15.0)
- Changed: Font Swapping enabled to improve first load
- Changed: When typing a series name, min, or max filter, press enter to apply metadata filters.
- Changed: Cleaned up the documentation around MaxCount and TotalCount in Series info
- Changed: Slig...
v0.7.1.4 Hotfix: Synology Fix
If you are on nightly, you can stay on your current nightly, you will not receive an update. If you are on stable and have been having issues updating to v0.7.1, use this version. From our Synology tester, this will fix your issues.
Fixed
- Fixed: You can no longer run the docker as non-root (Reverts functionality as it was breaking Synology installs)
v0.7.1 - Stats Hotfix
Well, I knew adding 73K lines of code in the last release would cause a few bumps in the release and it looks like I was right. A few users have pointed out some minor issues that escaped release testing and this hotfix closes those issues.
If anyone wants to help ensure these type of hotfixes aren't necessary, please join our Release Tester role in discord and help out in release testing. It's about a week of your time before release and drastically helps catch issues before they go out to our users.
Known Issues
- Synology users are having issues running their docker containers, likely due to PGID/PUID issues. If anyone is familiar with Synology, please comment on the open issue or jump in discord and engage a team member. There is a workaround in the issue.
Fixed
- Fixed: Fixed a bug where SignalR wasn't sending events to the UI (and broke Komf)
- Fixed: Advanced tab on Library settings was not working
- Fixed: Added timeouts on some regex parsing to prevent malicious filenames timeout attack
- Fixed: Some users in GMT+1 were having invalid utc dates, new migration to manually correct those.
- Fixed: Fixed an issue where convert covers to webp was saving an invalid path and made covers look like they didn't exist
v0.7 - Who doesn't like Stats?
Important
You and users MUST log out and log back in after updating for Kavita to function correctly!
v0.7 is finally here and boy is it big! When I started v0.7, I had planned for just a reader refresh and stats, but due to the 4 vacations I had during the development, so much more got added in. This is a massive update with many areas touched, tweaked, and added to, including a lot of bug fixes brought by our community. Let's start with the name of the release.
Stats:
Since the beginning of Kavita, I've always wanted rich metadata and cool stats to understand how much my users and I are reading, what's hot on the server, when is the most popular day for reading, etc. That's what the main feature of this release is about. Adding this cool contextual information into Kavita and presenting to not only the admin, but letting the users see their individual statistics. For example, I've learned since I started this project 2 years ago till this year, I've read 200K pages of manga. I hope you all enjoy the statistics and if you have any ideas, jump on our feature site and let me know.
Image Reader:
Last release I had already started a major cleanup of the image reader (or what I usually call the manga reader), but wasn't able to wrap it up and give it the polish needed before the release, so this release window, I polished until I thought I was looking at a mirror. My focus was not only on improvement on layout but also getting the double page reader down correct and that's what I did. I worked closely with a few members of the community (Thank you @hgourvest and @handy1928) to ensure the double reader works exactly as you'd expect and along the way, added a cool new effect to emulate a comic book page spine). I also added the ability to change pages with swipes, something users have requested. I still have some more items planned, but for now, the reader is solid.
Customization:
Everyone loves customization and so do I, which is why this release I made progress on an overarching set of features I want to add to Kavita. This customization added gives you the power to choose how content from libraries gets included or processed. With the new Library Settings, you can configure certain libraries to not show on any dashboards, in search results, or recommendations or a mix and match. In addition, you can allow or deny the auto creation of Collections (driven from SeriesGroup tag) and just to top it all off, add a custom image for the library icon, so it's easier to distinguish. I hope you enjoy the flexibility these enhancements bring and look forward to what I have in store in future releases.
Manga Manager:
I want to also give a big shout-out to @ThePromidius, the creator of our Tachiyomi plugin, who has built what I believe to be the best ComicInfo tagger around, Manga Manager. Over the past year, he has been putting a lot of time and effort into a rework of his tool and recently released the beta. It's insanely fast and has the potential to outshine all other tools out there. I encourage you to check it out. I have taken a role in his project to help him deliver on a combined vision.
Authentication:
Not so much as something new, more of an alert. All users must re-authenticate (log out then in again) for this release. I made some internal changes in the authentication tokens to allow for some optimizations in our API layer. Again, All users must re-authenticate after update.
Lastly, I want to shout out to some miscellaneous enhancements, like OPDS which received a touch up to include more metadata (authors, genres) in the feeds or to prepend reading order number in reading lists due to Chunky not respecting the spec. Kavita also now auto-creates Collections if SeriesGroup tag is filled out. If you're wondering what about reading lists, I got you covered (in another release). I worked up the code but didn't have time to polish it all out.
With all things said, I appreciate the community for coming out and helping with support and reporting issues and feature requests. Many feature requests were implemented in this release. Thank you to everyone that has reported issues. I encourage the community to speak up if they are facing issues so I can get them fixed.
Added
- Added: Added a new setting under Media to allow covers to be saved as WebP. This results in a x3 savings. There is no task to perform the conversion, just use Refresh Covers on the library.
- Added: Series Detail page now has a dedicated Want to Read button for toggling and also let's you quickly see this is in your want to read list.
- Added: Series Detail page will now show a tag badge showing unread chapters when there is reading progress on the Series Image.
- Added: When there is progress on a series, the continue point will now pretty print under the series cover image. This will only work with volumes and loose leaf chapters. Specials are not shown due to spacing issues.
- Added: Added the ability to turn off folder watching for individual libraries in new library settings Advanced tab.
- Added: Added the ability to turn off including a library's series on Dashboard page.
- Added: Added the ability to turn off including a library's series on Recommended page.
- Added: Added the ability to turn off including a library's series and any derived info in search results.
- Added: Added the ability to upload custom images for libraries (only visible in side nav). Customize to your hearts content!
- Added: Added release date on the reading list item, if it's set in the underlying chapter.
- Added: Added an Open API spec generator that gets saved with codebase. This enables external API reference
- Added: From library settings, admins can now kick off a forced series scan, which ignores last scan date and will act more like a first time scan. This is expensive, but useful if you need to run a full scan after Kavita has migrations.
- Added: New task called Analyze Files which is used to run a one time migration that scans all files and calculates extension and file size information about them for the statistics view.
- Added: Added many new visualizations for server-wide statistics: Total Series, Total Volumes, Total Files, Total Size, Total Genres/People, Top 5 release years, Most active users, Popular Libraries (by read events), Popular Series (by read events), Recently read series, Top Readers (with breakdown of Comics/Manga/Books reading hours and against time periods), Format breakdown and size, Publication Status breakdown, Reading History over time, and most popular reading day.
- Added: Added basic user stats: Total Pages Read, Time Spent Reading, Chapters Read, Last Active, Reading History
- Added: Added back old PDF to image rendering code just for Tachiyomi, so users can get maximum use from the application.
- Added: Added Genre and Authors to Series level OPDS feeds.
- Added: Added summary to Volume and Chapter feeds.
- Added: New API for getting a given chapter's pages' file dimensions
- Added: Added a Save preferences button to save a few preferences from the manga reader directly to user settings.
- Added: Double and Double (manga) now have a shadow effect to emulate a real comic book. You can enabled this via user settings under 'Emulate comic book'
- Added: Added percentage of a given library and average hours read per week to user stats
- Added: When there are multiple files for a chapter, show a count card on the series detail to help user understand duplicates exist.
- Added: Added Size throughout the UI and in the APIs for CDisplayEx integration
- Added: Ability to provide environment variables PUID and PGID which allow running Kavita as a non-root user in a Docker container. If you do not specify these variables, Kavita will run as root. If specified, user and group 'kavita' will be created in the container with the specified UID and GID if they don't already exist. Kavita will then run as that user. (Thank you @mikeymakesit for the contribution)
- Added: More aggressive pre-caching for next and previous chapters. This allows for less lag spikes when switching to another chapter in continuous reading mode on the second page on slower networks.
- Added: Manga reader now has swipe support. You can swipe left, right, up, and down. Swipe will trigger the appropriate page change based on reading direction and reading mode (up/down or left/right). If there is area to scroll, the reader will make sure you hit the end and require another swipe to trigger the page change.
- Added: Users can now click the Words Read count on user stats to view a year over year count
- Added: Added a new Yearly stat table for counting files over the years. This is not hooked up to the UI, but will be in a later release.
- Added: Added new statistics for analytics (Kavita Stats): users with emulate comic book enabled, percentage of libraries with folder watching enabled, percentage of libraries included in search/dashboard/recommended, total reading hours, is server storing cover images as webP.
- Added: New server setting for Host name. If the server sits behind a reverse proxy, this can be set in Host Name and host name will be used for link generation and accessibility checks (aka if the server can be reached from outside the network) will be skipped, thus an email will always send.
- Added: Added the ability to allow a library to generate Collections from SeriesGroup tag in ComicInfo.xml
- Added: New setting in Library settings which allows for Auto Collection generation to be turned off for a library.
- Added: Added a new JWT Claim to allow getting UserId throughout the codebase. All users will need to reauthenticate.
- Added: Added UTC Dates throughout the application. They are not exposed in API, but will come later with localization work. Fo...
v0.6.1 - Security Patches + Hotfix
I took a one week vacation after the v0.6.0 release and it seemed there were a few issues that cropped up, so here is the hotfix. This hotfix fixes high utilization that a few users have reported. If you were one of these users, after this hotfix you should be clear to turn on folder watching again. If you're experiencing issues, please drop by support again.
In addition, there were a few security vulnerabilities exposed via Huntr. As usual, the details will be disclosed after a few days. Also a few parsing changes made release broke grouping for light novels that were not tagged correctly. This hack was added back in to help users not have to re-tag thousands of files (but I do encourage it).
Lastly a small but annoying bug where when reading in the manga reader, going backwards or moving to the next chapter could cause the screen to not update the image but the page changed. This is now squashed for good.
Added
- Added: Added a jumpbar to bookmarks page
Changed
- Changed: Updated all non-authenticated APIs to return more generic messaging back to the user and log more detailed information to avoid any attack vectors.
- Changed: Log level defaults to Debug as it's no longer noisy
- Changed: Swapped out SQLite for Memory backstore for Hangfire
- Changed: Added DisableConcurrentExecution on ProcessChange to avoid duplication when multiple threads execute at once for Library Watching
- Changed: When parsing epubs, if there is a volume in the epub title, try to parse and group. This is beneficial for Light Novels which are generally tagged this way. Last release, we changed logic to prefer metadata, but most files are not properly tagged.
- Changed: When scanning files, exit earlier from parser when file is a cover image.
- Changed: When inviting or editing a user, when Admin role is selected, all other roles are disabled as they aren't applicable.
- Changed: When there are no collections, don't point the user to the wiki unless they are an admin
Fixed
- Fixed: Fixed the black background present when the e-reader's color theme was set to 'White'
- Fixed: Fixed security issue (https://huntr.dev/bounties/55cd91b3-1d94-4d34-8d7f-86660b41fd65/)
- Fixed: Fixed security issue (https://huntr.dev/bounties/bebd0cd6-18ec-469c-b6ca-19ffa9db0699/)
- Fixed: Fixed a bug where promoting a reading list would fail
- Fixed: Fixed a bug where bookmarks wouldn't load in the reader in the order they were saved
- Fixed: Fixed a bug where state variables weren't being updated correctly and pages could get stuck. This also fixes paging backwards not working
- Fixed: Fixed a bug where Hangfire could cause high CPU/RAM utilization for some users due to slower process change execution.
- Fixed: Fixed delete series sometimes not triggering on series detail page
- Fixed: Fixed some parsing logic for how we treat specials like Annual and Omnibus. This now handles more cases and fixes a few that broke last release.
- Fixed: Fixed a bug where Log Level Information wouldn't show proper log output
- Fixed: Fixed a case in ComicInfo fallback where and invalid ComicInfo location wasn't picked up
- Fixed: Fixed a typo in the toast notification for marking multiple items as unread and made capitalization consistent (Thanks @pssandhu )
Known Issue
- Double page renderer seems to be occasionally missing pages. I am working on addressing this for v0.7
v0.6.0 - Polish, Polish, Polish + Send To Support!
This release has been an interesting time. Originally a small release with a big impact (auto updating) has turned into a release just about polishing and battle testing the scan loop from last release. Rewriting the scan loop last release was a huge effort and despite being diligent with testing with our nightly testers, bugs still slipped through. I wanted to take a step back and get Kavita sorted out before moving forward with new features, but I couldn't leave you with just fixes, so I made it action packed instead. With that, let's get into what's in this release.
Let's start with some big asks since the initial release of Kavita--the ability to send files directly to users devices. This is something Calibre has that avid book readers on Kindle need. Over the past few releases, I've been laying the ground work for this and with v0.6, we finally get to use it and from what the nightly users express, it's awesome. Any user in Kavita can setup devices with an email, this could be your Kindle email, your personal email, or anything. Give it a name and from any epub or pdf, you can send the file or files to your device. Currently this is limited to epub and pdf as there are no readers that support cbz, etc. However, if you have use cases, reach out. In order to use this, you must run your own KavitaEmail service.
Speaking of email, you know what's annoying? Having to have an email when you sign up for Kavita. Even though Kavita doesn't validate your email or require you to put in a real email, users have still complained about it. In this release, I updated the flows to better reflect this. Invite user will still ask for one but make it known it can be anything (although if it's not a real email an invite email will not send). When users sign up or an admin sets up the account, the email field is optional. On top of all this, Kavita now has a new Profile tab in User Settings which allows a central place to update and see their profile information and add/change it.
From emails to profiles, another big ask was Kid accounts. Many users have large libraries and want to restrict some profiles to certain levels of content. This is a tricky one as not all file formats are the same. PDFs and Epubs don't have an Age Rating field like CB* files, which expose it via the ComicInfo standard. Luckily, Kavita can store this information for you. With that, you can now setup Age Restrictions on accounts and grant those accounts the ability to maintain their own rating or not. Age Restrictions restricts all content that is higher than the rating set. If there are Unknowns (which is the default state), Kavita let's you set whether that is allowed for said profile or not. This restriction is applied at the highest level. So if you have one issue that is Mature while account is on Teen, the whole series will be purged from the user, including any promoted reading lists or collections.
That's a lot of heavy hitters, but I have more to talk about. This one is my favorite, Folder Watching. Folder Watching was introduced last release as an experimental feature and after much battle testing and reworking the code, I've cracked the code and gotten it to a really stable place. I personally have been running it for the last month without issue. This essentially brings your content into your server without having to wait for nightly scans. Do note, it is not designed for moving massive amounts of content over a long period of time into your library. It will still work, but you might get some partial series you have to manually cleanup.
Lastly, I want to talk more about the polish that this release is all about. Not only did the scan loop get major polish, from the release notes you'll see so did the parser, reader bugs (like double page layout now works consistently), and many quality of life enhancements.
A few shout outs on features as well:
- We are finally done with Tachiyomi. We have a PR open into the main application and it's been slotted into a release by the Tachiyomi developers. Huge thanks to @ThePromidius (who recently joined our Kavita team after 6+ months of battling Kotlin in development of our extension) for taking on this effort and working with our users to get it polished out.
- The Kavita Tachiyomi Extension (the preview build) contains full progress tracking support and has been working perfectly for the past month.
- Kavita now has a Readarr connection hook, which can do what Folder Watching does, without having to have it enabled. If you have Folder Watching enabled, you do not need the hook. This will be available in Readarr once Readarr releases next version.
To wrap up, I want to call out to some issues that cropped up in v0.5.6. As mentioned in the opening, the code was tested a ton but things slipped through. After you update, you need to pay attention to your logs. Your logs will indicate corrupted volumes or series that you need to manually cleanup from Kavita. This is an unfortunate reality, but luckily doesn't require data loss.
If you've still read to this point, props to you. If you've been enjoying Kavita, please consider donating or becoming a supporter. It makes a huge difference for me to continue pouring thousands of hours into the project (not just coding but support). Thank you again to my current supporters and those whom have donated.
Added
- Added: New Role for allowing users to bookmark. Bookmarking can consume a considerable amount of resources on the host system, so a role needs to be introduced to restrict this action. By default, existing users will have this role off (admins excluded, they have all abilities).
- Added: Kavita is now using Tiered Compilation and Dynamic PGO. These are techniques by .NET to analyze the application as it runs and optimize on the fly. This just means Kavita over time will get faster without any extra work by me or you.
- Added: Users can now search for a series on Bookmarks page. No other filter is active.
- Added: Implemented Russian filename parsing for Manga and Comics
- Added: When in the manga reader, you can now double click to bookmark pages.
- Added: When a user reads the full series of anything that is Completed or Cancelled and exists on their Want to Read list, Kavita will now remove the item from said Want to Read list on a nightly basis. This can be triggered at any time from Tasks page.
- Added: Kavita can now filter against release year (min, max, or both). If only min, all series that have a release year of or greater than the min are returned. If only max, all series that have a release year or less than or equal will be returned. Lastly if both, any series that fits in that range is returned.
- Added: Kavita can now sort by release year.
- Added: Added a new setting to manage how many log files exists in terms of days, since Kavita uses splitting on days now.
- Added: Added new stats for tracking to help with some of the reader feature utilization for some upcoming redesign/polish work
- Added: User's can now setup devices for readers that cannot access Kavita via web, but can receive files via email.
- Added: User's can now send pdf and epub files to devices via the context menu. Users MUST have their own email service setup in order to do this.
- Added: Added -화, -회, -장 for volume parsing for Korean filenames (Thanks @DeltaLaboratory for handling this)
- Added: Added -회 for chapter parsing for Korean filenames (Thanks @DeltaLaboratory for handling this)
- Added: New validation added to Edit Series modal to ensure Name and SortName are required
- Added: Series cover selection will now show all volume images or all chapter images (if only chapters exist)
- Added: New user setting to disable transition effects (animations) in the app. Great for e-ink readers.
- Added: When browsing on screens with infinite scroll, the scroller will now try to resume to the approximate location (nearest jump key) when navigating back.
- Added: Added the ability to edit Release Year on the Series
- Added: Admins can now setup restricted profiles for their users (or users can restrict themselves). A restricted profile will restrict content that does not match their Age Restriction rating. For example, all content on the server that is Mature would be hidden from a user with a Age Restriction of Teen. Age restrictions do not apply to admin accounts.
- Added: A new role called 'Change Restriction' now exists to allow a user to change their own age restriction.
- Added: Added a new Series relation called Edition. (A generic relation with no Parent relation)
Changed
- Changed: Swapped out the default logger with Serilog, which enables more expressive logs and powerful Sinks
- Changed: Log file rolling is enabled by default and now uses a day by day format. The new format will be kavitayyyyMMdd.log.
- Changed: Logging levels now affect other types of loggers from libraries and are now handled by Kavita. So Debug can provide rich logs, while Information can keep the other loggers to Error to keep the logs clean. Loggers have been significantly cleaned up and Debug is safe to use without so much spam. Trace will now have that same spammy output.
- Changed: Removed the data connection for the database out of appsettings.json and hard coded it. This is a prerequisite for auto updating.
- Changed: Updated pdf viewer to 15.0.0 (pdf.js 2.6) which now supports east-asian fonts.
- Changed: Unified the star rating design in series detail to match metadata filter.
- Changed: Changed Normalization to not strip ! from the resulting string. This requires an expensive migration which will take time on first load of this version. This will allow users to have series that differ ...
v0.5.6 - Performance Part 2 (Is that a new scan loop?)
For the past 3 months, I have been working tirelessly to rebuild our main scan loop, which is not only the most complicated part of Kavita but also the most critical. It translates files on your system into the series, volumes, and chapters you know in the UI. This goal of a new loop was so difficult, I quit 3 times, but finally made it through. The new loop is finally ready to share with you all, thanks to many of our nightly users helping test and provide feedback.
What is this new scan loop I speak of? The new scan loop is a new way (and a new set of requirements) to scan your disks and process files extremely efficiently. This changes Kavita to using a folder-based parsing mechanism rather than the previous mechanism where we would parse all files, group then perform DB operations in groups of 50. The reasoning for this drastic shift is that the old method failed to scale on users with massive libraries (we have one user with half a million files per stats) and would take an exceedingly long time for networked (rclone) users.
To dive in, we need to talk about some requirement changes. In order to utilize folder-based scanning, we have to remove the flexibility of users can put files anywhere they want and Kavita will group them for you. When I started, I chose this mechanism based on feedback from Plex and Jellyfin, but in reality most of our users have proper folder-based structures, so this new requirement change shouldn't affect many users.
Kavita expects all series to be in their own folder, so a library cannot have loose leaf files in it. You can still do /library root/manga/Publisher/Series A/, /library root/manga/Publisher/Series B/, just not /library root/my book.pdf. Kavita will now scan folder by folder an for each folder, group the files in and process them as a single series in a task (async). This task will do all DB operations and invoke Cover Gen and File Analysis (word counting) for just that series. This change is important because it will now process series-by-series and update your UI in that manner. Hence you should be able to more quickly see your series and use them completely than before on first scan. This however comes with a drawback due to increased I/O and trips to the DB, the library scan is slower (on first scan). For me, previously it took 30 mins to scan all files into the DB (without covers or word counts), on the new loop it takes 80 mins (but has covers and word counts). The main difference is on the old loop I had to wait at least 10 mins till the first chunk inserts, with the new loop, you don't have that issue. This also means the Chunk errors users sometimes receive should no longer be an issue and if there is an error, that series will tell you directly. You can find more information about the new Scan loop on the wiki.
With that said, this also allows some deep optimizations. Kavita will no longer do any I/O (except an attribute lookup on folders) if a folder hasn't changed since the last scan time. This single optimization means that my library scan can run in 5 seconds for my 660 series library, as it skips work on anything that hasn't changed. From the nightly testers, many users have seen drastic time reduction, esp our rclone users. This also allows for 2 enhancements, the ability to ignore certain files/folders (aka .kavitaignore) and the ability to hook into Kavita and say a folder has changed and let Kavita kick off a scan.
Next up is .kavitaignore, inspired from .plexignore and a feature request as well, users can now tell Kavita to ignore files and folders at any level of a scan. You can have at library root to have a global set of rules, like ignore cover.png, or you can have nested into your folders. You can have one for each folder and Kavita will intelligently combine the rules as it moves down the folder tree. This is another degree of freedom which allows you to not only filter, but speed up scans as well. This feature is experimental and still being tested and tweaked, but works in many cases. Give it a go and report back on issues faced or clever tricks that we can enhance our wiki with.
Lastly, we have folder watching. This new, experimental feature is really something cool. Why wait for nightly scans, when Kavita can pickup on changes and instantly run an appropriate scan? This new feature does just that. When a change is detected, a task is queued up and after 5 minutes executed. Any changes that related to that first task, will get disregarded. Please note, this is experimental and likely to not work if you download directly to your library. This feature will be fletched out further in later releases.
TLDR: There are new requirements for what Kavita expects from file layout. Read about it on the wiki. If you scan without conforming your layout, you may run into issues.
If you have been enjoying Kavita, please consider donating or backing me. Kavita is primarily built by just me in my spare time and each release is hundreds of hours of work.
Added
- Added: You can now have a .kavitaignore file at any location in your library and the scanner will read that and filter out any subsequent folder/files. This works very similar to .plexignore, this utilizes a Globbing syntax and supports multiple patterns via new lines. You can find more about the syntax here. This feature is experimental
- Added: Added a new event type of Info which will show when Scan loops are aborted due to nothing changing on disk. This aims to inform the user that their expected action took no result.
- Added: Added a clear all button on the events widget
- Added: When a new series is added to Kavita, library detail pages will insert instantly (previously we reloaded the page every 3 seconds post an update coming in)
- Added: Added --event-widget-info-bg-color for the new info event widget color
- Added: When we navigate from a page that has a jump bar and the user has clicked the jump bar, resume their scroll position when returning to that page. This is not tracking scroll position naturally, that will be looked at later.
- Added: Added / as a server route to swagger, which could help users behind a reverse proxy from using their local server.
- Added: Kavita now comes out of the box with Folder Watching for libraries. This means that when any sort of event occurs, like new files, file/folder renames, deletions, etc, Kavita will queue a task to scan those changes into the system. By default, tasks will only be processed every 5 mins. This is an experimental feature and disabled by default.
- Added: Kavita now comes with a new API for library/scan-folder and takes the API key (with admin permissions) and a folder path.
- Added: Added API endpoint for a health check to streamline docker healthy status.
Changed
- Changed: Kavita now requires series to be within a folder and not spread between multiple folders. For example, a library root of /manga/ must have series self contained in /manga/series A/files, /manga/series B/files. Kavita will now ignore files that are in /manga/ alone.
- Changed: Rewrote the scan loop to perform folder-based scanning, Kavita will now process one folder at a time in a multi-threaded manner. This is a major change to how previously scanned, where all files had to be parsed before any DB work could be done. Users on networked systems should see a major improvement.
- Changed: Scanning tasks now run on their own dedicated queue and will not allow any concurrent runs. Time for a scan task to get executed is lengthened a bit as default queue takes priority.
- Changed: Added optimizations where Kavita will ignore scanning folders (all I/O) if nothing has changed on the disk since last scan of that folder.
- Changed: Fail silently if an email invite doesn't get sent, as the link is still present in the DB and UI screen.
- Changed: Ignore progress events altogether on Series cards so progress bars don't get skewed when a user is reading
- Changed: Reduced the spammy output for the logger, so more clear information is delivered, instead of internal DB queries.
- Changed: Deleting a series will now automatically remove it from the Want to Read page
- Changed: Tweaked a migration to output log only if it's going to be ran
- Changed: Added dedicated token output to logs for auth flows (when inviting a user) in case token is getting url encoded (but from testing, it doesn't affect)
- Changed: Reverted back to ES6 vs ES2020 so older Safari browsers can use Kavita
- Changed: When parsing non-epubs in Book library, use Manga parsing instead of Comic, to better support Light Novels
- Changed: OPDS description now no longer mentions users will be able to download, as they currently still need the download role.
- Changed: Updated all links that point to external sites to use noopener noreferrer
- Changed: Updated the Email Service wording to point to the Github for the external email service
- Changed: Clear cache will now clear temp directory as well, to clear out bookmark and downloads.
- Changed: When a library is in progress and a user tries to delete the library, tell them to wait before we let them
- Changed: Rearranged some code in invite user flow to help with the small fraction of users that can't invite users.
- Changed: Added a null check so we don't log an exception when connecting a websocket when user is not authenticated
- Changed: When a theme that is set for a user, gets removed from Kavita, inform the user to refresh.
- Changed: Manga reader Darkness control is now called Brightness
Fixed
- Fixed: Fixed a bug where series with LocalizedSeries comicinfo tag could ...
v0.5.5 - Performance Part 1
This is another release where I forgot just how much I did. The intent of this release was performance and held tons of work that I had been wanting to tackle, but needed the dedicated time for. Originally I had planned to release this with the new scan loop, however due to security vulnerabilities and some bugs in the hotfix, I had to split the release in half. As mentioned, the focus is on performance and we are bringing a ton of nice performance improvements along with a new contributor, @TheIceCreamTroll, who not only opened a lot of bugs on Github, but also helped fix a few in the process. I look forward to more development work from them.
To start off this highlight, comes Downloads. Downloads have always been pretty reliable but when you're downloading tons of content for an upcoming trip, it can first get annoying when you leave the page, you might loose the download. Also that downloads kept prompting you for confirmation when the files are large (to hopefully not eat up your data cap). So this release, I reworked downloads significantly. Downloads are now handled at a global level, range processing is enabled (this means you can stop/start if your browser supports it), downloads are cached and thus streamed to your browser (less memory overhead), the event widget handling has been tweaked a lot to make it much more streamlined, and my favorite, if you start a download, go to another page then return, the download progress bar on the card will still show.
Another huge update for Kavita is moving to OnPush change detection, something that is more technical and more work for me, but has nice performance implications for the user. OnPush basically means that the code tells Angular when it's time to re-render, which means less work Angular does and hence more frames per second. Pairing this with the update to Angular 14, the UI should feel a lot snappier to you.
This next one is my favorite. I was shocked when I was on a non-admin account and realized, I didn't have a way to track what I wanted to read...normally, I would create a collection but then I realized, Kavita's collections are for admin's only (modeled after Plex originally). So I sought out to build a Want to Read list that is like a collection that tracks what you want to read. Right now, we have ability to filter against it and that's it. I plan to build it out in future updates; if you have any ideas, jump on the feature request site and submit them.
In addition to performance, I also focused on polishing up the double page reader from last release and fixed an annoying infinite redirection bug, usually seen on Firefox. If you have issues with the double page render, def stop by or create a Github issue to let me know.
Lastly, a few users have been having issues with the invite user flow. I've been hard at work trying to support these users, but have been unable to reproduce their issues. I made some changes in the Invite User flow to hopefully improve their lives, but behind the scenes I'm still engaged in support and planning enhancements around this Authentication system. Thank you for being patient. Early reports from users seem to have less issues post these changes, so give it another go if you fell into this bucket.
Lastly is a call to the community if anyone is interested in helping in Support in our discord or being a dedicated release tester. Kavita has gotten to the size where it is taxing to be building and testing all by myself. Currently release testing takes 3 days split between 3 people. I really need help from the community to help keep Kavita stable and let me focus on development rather than Support and Testing. If anyone is interested, please reach out to me in the discord.
With all that said, the next release will be even slower than this one. I have a lot of vacation planned for next 2 months and the left over work is extremely difficult, as it's the most complicated and critical part of Kavita. Thank you as always for being patient with releases and for those that have donated, I am extremely grateful. I've been buying my Kavita supplies (lots of coffee to get me through the scan loop).
Note: The security vulnerabilities may not be viewable till a few days after this release, to allow all platforms to upgrade their builds. Anything listed has been validated and fixed as of this release.
Added
- Added: Added new event hooks for when mark as read/unread occur on entities, which will now trigger a re-calculation on Read Time Left.
- Added: Cover Image uploading will now allow gif and webp files
- Added: When the user is requesting background jobs, like scan library, Kavita will now disregard jobs if there is already a job in the queue for that configuration.
- Added: Downloads now support range processing (the browser can theoretically resume the download)
- Added: Downloads will now persist through page loads and the indicator will show on any card/list items where applicable.
- Added: Downloads are now global and a notification in event widget helps you see the download progress (browser progress).
- Added: New user preference to prompt for downloads larger than 100MB. When disabled, Kavita will download without prompting.
- Added: Downloads will now temp be left on disk and thus if requested again, can send the same file without re-generating it.
- Added: New placeholder for when covers haven't loaded in yet.
- Added: PDF Reader now has a loading indicator with a progress bar to indicate how much of the PDF has been downloaded by the browser.
- Added: PDF Reader will now close itself when ESC is pressed
- Added: Added the ability to manually setup users without having to worry about the invite url during invite flow or doing it right at invite time. Now a Setup button will appear next to all Pending invites and at any time can be pressed to manually complete the account setup. Note: This does not work with pending invites created before this update. Please re-create them to get the new functionality.
- Added: Added back to top support on all pages but those that utilize virtual scrolling without a parent scroll
- Added: Pressing H will open the shortcut modal
- Added: All users will now have a dedicated List called 'Want to Read' which will allow them to track series they are interested in reading. They can apply filtering against this page.
- Added: Added a quick way to set darkness level on manga reader for when night light just isn't dark enough (this is not a setting, it is being trailed and subject to removal)
- Added: Added Japanese Series name parsing support in Parser
- Added: Added Jump bar to reading list page
Changed
- Changed: Changed padding to allow for two cards side-by-side on viewport width of 375px.
- Changed: Changed every component to use OnPush Change Detection, resulting in less wasted render work and a snappier experience overall
- Changed: Moved some calculations for title and subtitle in manga reader to the backend
- Changed: Bulk Operations bar now has an explicit mark as read/unread buttons.
- Changed: Bulk Operations now has Add to Collection option and Delete where appropriate (and for appropriate users)
- Changed: Edit Series Relation will focus on the next typeahead after pressing Add Relation
- Changed: Cover Image chooser will now show the chapter's cover images as options by default
- Changed: Added more aggressive static file caching
- Changed: Refactored reading list item component to drastically reduce the amount or render calls. Huge performance for users with large reading lists
- Changed: Typeahead control now has an animation for opening and closing
- Changed: Scan Series, when invoked via UI/API, will force a re-calculation of metadata and ignore any caching, to ensure reliable results.
- Changed: Added Range processing support for images on the reader for slower networks or large files
- Changed: (Manga Reader) When using single mode, try to use a pre-fetched Image, rather than relying on browser to cache the image
- Changed: Reduced some latency when rendering first page of next chapter via continuous reading mode
- Changed: Downloads will now leave the file on disk and re-use them. These files are cleaned up nightly or after any scan (scan series/library)
- Changed: When a user is downloading a file on Kavita, admin's received a notification about it. This notification is now reworded to imply that the server is processing the download. This notification will be removed in future version.
- Changed: Changed how caching works within Kavita. Cover Images are now properly cached for 1 min, Images for the reader are cached for 10 mins, and the pdf file (for new reader) is also 10 mins. This has a known issue where updating a cover image, the browser wont reflect the new image on Chrome based browsers. This is due to Chrome not respecting the cache-control spec. A hard refresh will fix it.
- Changed: (Performance) Applied SplitQuery to multiple queries throughout the codebase, speeding up many API calls.
- Changed: Exception middleware will now send the original error message to the UI rather than a generic 'Internal Server Error'.
- Changed: Error toasts now have Error in the title along with the status code
- Changed: Changed volume titles in list view to include volume number.
- Changed: Implemented a workaround for nginx users with BlockCommonExploits enabled, which would interfere with book image escaping done by Kavita when images had ../ in their path.
- Changed: Hide jumpbar on pages where there is no scroll
- Changed: Non-admins can no longer view file info on card detail drawer
- Changed: Typeaheads will no longer close after selecting an item
- Changed: If there is no collection or reading list cover image, hide the image placeholder
- Changed: Optimized bookmarking a page by reducing a DB trip
- Changed: Search bar now will only show clear button once a single character is t...