Page Not Found
We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
diff --git a/404.html b/404.html index 00ec8988..14f2c361 100644 --- a/404.html +++ b/404.html @@ -6,8 +6,8 @@
We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
application.yml
",id:"via-an-applicationyml",level:3},{value:"Using the jar
via the command line",id:"using-the-jar-via-the-command-line",level:3},{value:"Using Docker",id:"using-docker",level:3},{value:"Komga seems slow, how can I check what's going on?",id:"komga-seems-slow-how-can-i-check-whats-going-on",level:2},{value:"The memory consumption is huge",id:"the-memory-consumption-is-huge",level:2},{value:"How can I sync reading progress with tracker websites?",id:"how-can-i-sync-reading-progress-with-tracker-websites",level:2},{value:"Webreader double pages are not showing as single page",id:"webreader-double-pages-are-not-showing-as-single-page",level:2},{value:"Media type application/x-7z-compressed is not supported",id:"media-type-applicationx-7z-compressed-is-not-supported",level:2},{value:"My books/series show a different name than the files/folders",id:"my-booksseries-show-a-different-name-than-the-filesfolders",level:2},{value:"This server has already been claimed",id:"this-server-has-already-been-claimed",level:2},{value:"How can I move a library to a different folder?",id:"how-can-i-move-a-library-to-a-different-folder",level:2},{value:"Scan doesn't pick up new files under mergerfs",id:"scan-doesnt-pick-up-new-files-under-mergerfs",level:2},{value:"Docker on Raspberry PI arm32: No monotonic clock was available",id:"docker-on-raspberry-pi-arm32-no-monotonic-clock-was-available",level:2}];function c(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"frequently-asked-questions",children:"Frequently Asked Questions"})}),"\n",(0,r.jsx)(s.h2,{id:"i-forgot-my-password",children:"I forgot my password"}),"\n",(0,r.jsxs)(s.p,{children:["Either ask an admin to reset your password, or use the ",(0,r.jsx)(s.a,{href:"/docs/guides/cli#reset-password-for-a-user",children:"Command Line Interface"})," to reset it by yourself."]}),"\n",(0,r.jsx)(s.h2,{id:"where-can-i-find-the-log-files",children:"Where can I find the log files?"}),"\n",(0,r.jsx)(s.p,{children:"By default (if you haven't changed the configuration), log files are located:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["on the Windows app: ",(0,r.jsx)(s.code,{children:"%LOCALAPPDATA%/Komga/logs/komga.log"})]}),"\n",(0,r.jsxs)(s.li,{children:["on the macOS app: ",(0,r.jsx)(s.code,{children:"~/Library/Logs/Komga/komga.log"})]}),"\n",(0,r.jsxs)(s.li,{children:["on Windows: ",(0,r.jsx)(s.code,{children:"%USERPROFILE%/.komga/komga.log"})]}),"\n",(0,r.jsxs)(s.li,{children:["on macOS or Unix: ",(0,r.jsx)(s.code,{children:"~/.komga/komga.log"})]}),"\n",(0,r.jsxs)(s.li,{children:["on Docker: in the directory you mounted as ",(0,r.jsx)(s.code,{children:"/config"}),", in a subdirectory called ",(0,r.jsx)(s.code,{children:"logs"})]}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"how-to-enable-debug-or-trace-logs",children:"How to enable DEBUG or TRACE logs?"}),"\n",(0,r.jsxs)(s.h3,{id:"via-an-applicationyml",children:["Via an ",(0,r.jsx)(s.code,{children:"application.yml"})]}),"\n",(0,r.jsxs)(s.p,{children:["Add the following key in your ",(0,r.jsx)(s.code,{children:"application.yml"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"logging.level.org.gotson.komga: DEBUG\n"})}),"\n",(0,r.jsx)(s.p,{children:"or"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"logging.level.org.gotson.komga: TRACE\n"})}),"\n",(0,r.jsxs)(s.h3,{id:"using-the-jar-via-the-command-line",children:["Using the ",(0,r.jsx)(s.code,{children:"jar"})," via the command line"]}),"\n",(0,r.jsxs)(s.p,{children:["Start the ",(0,r.jsx)(s.code,{children:"jar"})," with the following option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",metastring:"script",children:"java -jar komga-x.y.z.jar --logging.level.org.gotson.komga=DEBUG\n"})}),"\n",(0,r.jsx)(s.p,{children:"or"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",metastring:"script",children:"java -jar komga-x.y.z.jar --logging.level.org.gotson.komga=TRACE\n"})}),"\n",(0,r.jsx)(s.h3,{id:"using-docker",children:"Using Docker"}),"\n",(0,r.jsx)(s.p,{children:"Add the following environment variable:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",metastring:"script",children:"LOGGING_LEVEL_ORG_GOTSON_KOMGA=DEBUG\n"})}),"\n",(0,r.jsx)(s.p,{children:"or"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",metastring:"script",children:"LOGGING_LEVEL_ORG_GOTSON_KOMGA=TRACE\n"})}),"\n",(0,r.jsx)(s.h2,{id:"komga-seems-slow-how-can-i-check-whats-going-on",children:"Komga seems slow, how can I check what's going on?"}),"\n",(0,r.jsx)(s.p,{children:"If any activity is going on, an animated yellow bar will appear below the top-left logo. Hover your cursor over the bar to see the details of all pending tasks."}),"\n",(0,r.jsxs)("video",{controls:!0,width:"250",children:[(0,r.jsx)("source",{src:"/assets/media/faq/server-activity.webm",type:"video/webm"}),(0,r.jsx)(s.p,{children:"Sorry, your browser doesn't support embedded videos."})]}),"\n",(0,r.jsx)(s.h2,{id:"the-memory-consumption-is-huge",children:"The memory consumption is huge"}),"\n",(0,r.jsxs)(s.p,{children:["TL;DR: The operating system ",(0,r.jsx)(s.em,{children:"does not"})," report the real memory usage of the application, so don't look at those figures."]}),"\n",(0,r.jsxs)(s.p,{children:["Komga runs on the Java Virtual Machine (JVM). The JVM works differently than other native programs in regard to memory consumption.\nOn startup, the JVM will ",(0,r.jsx)(s.em,{children:"reserve"})," some memory from the OS, but that doesn't mean this memory is used by the application. If the OS needs to reclaim that memory, the JVM will try to release it."]}),"\n",(0,r.jsx)(s.p,{children:"By default, the JVM would reserve 1/4th of the physical memory (depends on the total memory and JVM version), for instance if you have 32 Gb of memory, the JVM would reserve 8 Gb."}),"\n",(0,r.jsxs)(s.p,{children:["To increase or limit the maximum memory, see ",(0,r.jsx)(s.a,{href:"/docs/installation/jar#increase-memory-limit",children:"here"})," (jar) and ",(0,r.jsx)(s.a,{href:"/docs/installation/docker#increase-memory-limit",children:"here"})," (Docker)."]}),"\n",(0,r.jsx)(s.h2,{id:"how-can-i-sync-reading-progress-with-tracker-websites",children:"How can I sync reading progress with tracker websites?"}),"\n",(0,r.jsx)(s.p,{children:"Komga does not support this outside the box."}),"\n",(0,r.jsxs)(s.p,{children:["You can try ",(0,r.jsx)(s.a,{href:"https://github.com/MALSync/MALSync",children:"MAL-Sync"})," which integrates with Komga and works with MyAnimeList, Kitsu, Anilist and others."]}),"\n",(0,r.jsx)(s.h2,{id:"webreader-double-pages-are-not-showing-as-single-page",children:"Webreader double pages are not showing as single page"}),"\n",(0,r.jsxs)(s.p,{children:["The double pages feature of the webreader requires image sizes to be available. This feature was added in v",(0,r.jsx)(s.code,{children:"0.51.0"}),". If your books have been analyzed before that version, you will need to re-analyze them in order for the double pages feature to work properly."]}),"\n",(0,r.jsx)(s.h2,{id:"media-type-applicationx-7z-compressed-is-not-supported",children:"Media type application/x-7z-compressed is not supported"}),"\n",(0,r.jsxs)(s.p,{children:["Your files are compressed using 7zip, which is not supported. Extract your archives and compress them again using the ",(0,r.jsx)(s.code,{children:"zip"})," format."]}),"\n",(0,r.jsx)(s.h2,{id:"my-booksseries-show-a-different-name-than-the-filesfolders",children:"My books/series show a different name than the files/folders"}),"\n",(0,r.jsxs)(s.p,{children:["Komga automatically import metadata from ",(0,r.jsx)(s.code,{children:"EPUB"})," files and from ",(0,r.jsx)(s.code,{children:"ComicInfo.xml"})," for ",(0,r.jsx)(s.code,{children:"cbz"}),"/",(0,r.jsx)(s.code,{children:"cbr"}),". The imported metadata will override the file/folder name."]}),"\n",(0,r.jsx)(s.h2,{id:"this-server-has-already-been-claimed",children:"This server has already been claimed"}),"\n",(0,r.jsxs)(s.p,{children:["The server cannot be claimed if a user already exists in the database. It can happen when you start Komga for the first time without the ",(0,r.jsx)(s.code,{children:"claim"})," profile as Komga will generate a default user."]}),"\n",(0,r.jsxs)(s.p,{children:["You can solve the issue by deleting the database. By default it is located in ",(0,r.jsx)(s.code,{children:"~/.komga/database.sqlite"}),". ",(0,r.jsx)(s.code,{children:"~"})," is your home directory on Unix, and your User profile on Windows."]}),"\n",(0,r.jsx)(s.h2,{id:"how-can-i-move-a-library-to-a-different-folder",children:"How can I move a library to a different folder?"}),"\n",(0,r.jsx)(s.p,{children:"You can follow those steps:"}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsxs)(s.li,{children:["Make sure ",(0,r.jsx)(s.a,{href:"/docs/guides/libraries#compute-hash-for-files",children:"File Hashing"})," is enabled on the library."]}),"\n",(0,r.jsxs)(s.li,{children:["Disable ",(0,r.jsx)(s.a,{href:"/docs/guides/trash#automatically-empty-trash",children:"automatically emptying the trash"})," for the library."]}),"\n",(0,r.jsx)(s.li,{children:"Perform a scan on the library and let all tasks finish. This will ensure all files are hashed."}),"\n",(0,r.jsx)(s.li,{children:"Stop Komga."}),"\n",(0,r.jsx)(s.li,{children:"Move/copy the files to the new folder."}),"\n",(0,r.jsx)(s.li,{children:"Start Komga."}),"\n",(0,r.jsx)(s.li,{children:"Edit the library and choose the new folder as the library root directory."}),"\n",(0,r.jsx)(s.li,{children:"A scan will be triggered automatically after saving the library. The scan could take some time depending on the size of the library."}),"\n",(0,r.jsx)(s.li,{children:"Once the scan is finished, the series and books should have been matched with the files in the new folder."}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"scan-doesnt-pick-up-new-files-under-mergerfs",children:"Scan doesn't pick up new files under mergerfs"}),"\n",(0,r.jsxs)(s.p,{children:["Add ",(0,r.jsx)(s.code,{children:"func.getattr=newest"})," to the options in your ",(0,r.jsx)(s.code,{children:"/etc/fstab"})," entry for the mergerfs volume. By default, mergerfs doesn't update the modified times for everything for performance reasons. This forces it to. In most cases the performance impact is negligible."]}),"\n",(0,r.jsx)(s.p,{children:"Example:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"/media/user/disk* /media/user/storage fuse.mergerfs defaults,nonempty,allow_other,use_ino,cache.files=off,moveonenospc=true,dropcacheonclose=true,minfreespace=50G,category.create=mfs,func.getattr=newest,fsname=mergerfs 0 0\n"})}),"\n",(0,r.jsx)(s.h2,{id:"docker-on-raspberry-pi-arm32-no-monotonic-clock-was-available",children:"Docker on Raspberry PI arm32: No monotonic clock was available"}),"\n",(0,r.jsx)(s.p,{children:"If you encounter the following message when starting the container:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-log",children:"OpenJDK Server VM warning: No monotonic clock was available - timed services may be adversely affected if the time-of-day clock changes\n"})}),"\n",(0,r.jsx)(s.p,{children:"Your host system needs to have installed:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Docker version ",(0,r.jsx)(s.code,{children:"19.03.9"})," or newer"]}),"\n",(0,r.jsxs)(s.li,{children:["libseccomp version ",(0,r.jsx)(s.code,{children:"2.4.2"})," or newer"]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},3023:(e,s,n)=>{n.d(s,{R:()=>a,x:()=>l});var o=n(3696);const r={},i=o.createContext(r);function a(e){const s=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[8070],{738:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"faq","title":"Frequently Asked Questions","description":"I forgot my password","source":"@site/docs/faq.md","sourceDirName":".","slug":"/faq","permalink":"/docs/faq","draft":false,"unlisted":false,"editUrl":"https://github.com/gotson/komga-website/tree/master/docs/faq.md","tags":[],"version":"current","lastUpdatedAt":1733190983000,"frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Community","permalink":"/docs/community"}}');var r=n(2540),i=n(3023);const a={},l="Frequently Asked Questions",t={},d=[{value:"I forgot my password",id:"i-forgot-my-password",level:2},{value:"Where can I find the log files?",id:"where-can-i-find-the-log-files",level:2},{value:"How to enable DEBUG or TRACE logs?",id:"how-to-enable-debug-or-trace-logs",level:2},{value:"Via an application.yml
",id:"via-an-applicationyml",level:3},{value:"Using the jar
via the command line",id:"using-the-jar-via-the-command-line",level:3},{value:"Using Docker",id:"using-docker",level:3},{value:"Komga seems slow, how can I check what's going on?",id:"komga-seems-slow-how-can-i-check-whats-going-on",level:2},{value:"The memory consumption is huge",id:"the-memory-consumption-is-huge",level:2},{value:"How can I sync reading progress with tracker websites?",id:"how-can-i-sync-reading-progress-with-tracker-websites",level:2},{value:"Webreader double pages are not showing as single page",id:"webreader-double-pages-are-not-showing-as-single-page",level:2},{value:"Media type application/x-7z-compressed is not supported",id:"media-type-applicationx-7z-compressed-is-not-supported",level:2},{value:"My books/series show a different name than the files/folders",id:"my-booksseries-show-a-different-name-than-the-filesfolders",level:2},{value:"This server has already been claimed",id:"this-server-has-already-been-claimed",level:2},{value:"How can I move a library to a different folder?",id:"how-can-i-move-a-library-to-a-different-folder",level:2},{value:"Scan doesn't pick up new files under mergerfs",id:"scan-doesnt-pick-up-new-files-under-mergerfs",level:2},{value:"Docker on Raspberry PI arm32: No monotonic clock was available",id:"docker-on-raspberry-pi-arm32-no-monotonic-clock-was-available",level:2}];function c(e){const s={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"frequently-asked-questions",children:"Frequently Asked Questions"})}),"\n",(0,r.jsx)(s.h2,{id:"i-forgot-my-password",children:"I forgot my password"}),"\n",(0,r.jsxs)(s.p,{children:["Either ask an admin to reset your password, or use the ",(0,r.jsx)(s.a,{href:"/docs/guides/cli#reset-password-for-a-user",children:"Command Line Interface"})," to reset it by yourself."]}),"\n",(0,r.jsx)(s.h2,{id:"where-can-i-find-the-log-files",children:"Where can I find the log files?"}),"\n",(0,r.jsx)(s.p,{children:"By default (if you haven't changed the configuration), log files are located:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["on the Windows app: ",(0,r.jsx)(s.code,{children:"%LOCALAPPDATA%/Komga/logs/komga.log"})]}),"\n",(0,r.jsxs)(s.li,{children:["on the macOS app: ",(0,r.jsx)(s.code,{children:"~/Library/Logs/Komga/komga.log"})]}),"\n",(0,r.jsxs)(s.li,{children:["on Windows: ",(0,r.jsx)(s.code,{children:"%USERPROFILE%/.komga/komga.log"})]}),"\n",(0,r.jsxs)(s.li,{children:["on macOS or Unix: ",(0,r.jsx)(s.code,{children:"~/.komga/komga.log"})]}),"\n",(0,r.jsxs)(s.li,{children:["on Docker: in the directory you mounted as ",(0,r.jsx)(s.code,{children:"/config"}),", in a subdirectory called ",(0,r.jsx)(s.code,{children:"logs"})]}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"how-to-enable-debug-or-trace-logs",children:"How to enable DEBUG or TRACE logs?"}),"\n",(0,r.jsxs)(s.h3,{id:"via-an-applicationyml",children:["Via an ",(0,r.jsx)(s.code,{children:"application.yml"})]}),"\n",(0,r.jsxs)(s.p,{children:["Add the following key in your ",(0,r.jsx)(s.code,{children:"application.yml"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"logging.level.org.gotson.komga: DEBUG\n"})}),"\n",(0,r.jsx)(s.p,{children:"or"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"logging.level.org.gotson.komga: TRACE\n"})}),"\n",(0,r.jsxs)(s.h3,{id:"using-the-jar-via-the-command-line",children:["Using the ",(0,r.jsx)(s.code,{children:"jar"})," via the command line"]}),"\n",(0,r.jsxs)(s.p,{children:["Start the ",(0,r.jsx)(s.code,{children:"jar"})," with the following option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",metastring:"script",children:"java -jar komga-x.y.z.jar --logging.level.org.gotson.komga=DEBUG\n"})}),"\n",(0,r.jsx)(s.p,{children:"or"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",metastring:"script",children:"java -jar komga-x.y.z.jar --logging.level.org.gotson.komga=TRACE\n"})}),"\n",(0,r.jsx)(s.h3,{id:"using-docker",children:"Using Docker"}),"\n",(0,r.jsx)(s.p,{children:"Add the following environment variable:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",metastring:"script",children:"LOGGING_LEVEL_ORG_GOTSON_KOMGA=DEBUG\n"})}),"\n",(0,r.jsx)(s.p,{children:"or"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",metastring:"script",children:"LOGGING_LEVEL_ORG_GOTSON_KOMGA=TRACE\n"})}),"\n",(0,r.jsx)(s.h2,{id:"komga-seems-slow-how-can-i-check-whats-going-on",children:"Komga seems slow, how can I check what's going on?"}),"\n",(0,r.jsx)(s.p,{children:"If any activity is going on, an animated yellow bar will appear below the top-left logo. Hover your cursor over the bar to see the details of all pending tasks."}),"\n",(0,r.jsxs)("video",{controls:!0,width:"250",children:[(0,r.jsx)("source",{src:"/assets/media/faq/server-activity.webm",type:"video/webm"}),(0,r.jsx)(s.p,{children:"Sorry, your browser doesn't support embedded videos."})]}),"\n",(0,r.jsx)(s.h2,{id:"the-memory-consumption-is-huge",children:"The memory consumption is huge"}),"\n",(0,r.jsxs)(s.p,{children:["TL;DR: The operating system ",(0,r.jsx)(s.em,{children:"does not"})," report the real memory usage of the application, so don't look at those figures."]}),"\n",(0,r.jsxs)(s.p,{children:["Komga runs on the Java Virtual Machine (JVM). The JVM works differently than other native programs in regard to memory consumption.\nOn startup, the JVM will ",(0,r.jsx)(s.em,{children:"reserve"})," some memory from the OS, but that doesn't mean this memory is used by the application. If the OS needs to reclaim that memory, the JVM will try to release it."]}),"\n",(0,r.jsx)(s.p,{children:"By default, the JVM would reserve 1/4th of the physical memory (depends on the total memory and JVM version), for instance if you have 32 Gb of memory, the JVM would reserve 8 Gb."}),"\n",(0,r.jsxs)(s.p,{children:["To increase or limit the maximum memory, see ",(0,r.jsx)(s.a,{href:"/docs/installation/jar#increase-memory-limit",children:"here"})," (jar) and ",(0,r.jsx)(s.a,{href:"/docs/installation/docker#increase-memory-limit",children:"here"})," (Docker)."]}),"\n",(0,r.jsx)(s.h2,{id:"how-can-i-sync-reading-progress-with-tracker-websites",children:"How can I sync reading progress with tracker websites?"}),"\n",(0,r.jsx)(s.p,{children:"Komga does not support this outside the box."}),"\n",(0,r.jsxs)(s.p,{children:["You can try ",(0,r.jsx)(s.a,{href:"https://github.com/MALSync/MALSync",children:"MAL-Sync"})," which integrates with Komga and works with MyAnimeList, Kitsu, Anilist and others."]}),"\n",(0,r.jsx)(s.h2,{id:"webreader-double-pages-are-not-showing-as-single-page",children:"Webreader double pages are not showing as single page"}),"\n",(0,r.jsxs)(s.p,{children:["The double pages feature of the webreader requires image sizes to be available. This feature was added in v",(0,r.jsx)(s.code,{children:"0.51.0"}),". If your books have been analyzed before that version, you will need to re-analyze them in order for the double pages feature to work properly."]}),"\n",(0,r.jsx)(s.h2,{id:"media-type-applicationx-7z-compressed-is-not-supported",children:"Media type application/x-7z-compressed is not supported"}),"\n",(0,r.jsxs)(s.p,{children:["Your files are compressed using 7zip, which is not supported. Extract your archives and compress them again using the ",(0,r.jsx)(s.code,{children:"zip"})," format."]}),"\n",(0,r.jsx)(s.h2,{id:"my-booksseries-show-a-different-name-than-the-filesfolders",children:"My books/series show a different name than the files/folders"}),"\n",(0,r.jsxs)(s.p,{children:["Komga automatically import metadata from ",(0,r.jsx)(s.code,{children:"EPUB"})," files and from ",(0,r.jsx)(s.code,{children:"ComicInfo.xml"})," for ",(0,r.jsx)(s.code,{children:"cbz"}),"/",(0,r.jsx)(s.code,{children:"cbr"}),". The imported metadata will override the file/folder name."]}),"\n",(0,r.jsx)(s.h2,{id:"this-server-has-already-been-claimed",children:"This server has already been claimed"}),"\n",(0,r.jsxs)(s.p,{children:["The server cannot be claimed if a user already exists in the database. It can happen when you start Komga for the first time without the ",(0,r.jsx)(s.code,{children:"claim"})," profile as Komga will generate a default user."]}),"\n",(0,r.jsxs)(s.p,{children:["You can solve the issue by deleting the database. By default it is located in ",(0,r.jsx)(s.code,{children:"~/.komga/database.sqlite"}),". ",(0,r.jsx)(s.code,{children:"~"})," is your home directory on Unix, and your User profile on Windows."]}),"\n",(0,r.jsx)(s.h2,{id:"how-can-i-move-a-library-to-a-different-folder",children:"How can I move a library to a different folder?"}),"\n",(0,r.jsx)(s.p,{children:"You can follow those steps:"}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsxs)(s.li,{children:["Make sure ",(0,r.jsx)(s.a,{href:"/docs/guides/libraries#compute-hash-for-files",children:"File Hashing"})," is enabled on the library."]}),"\n",(0,r.jsxs)(s.li,{children:["Disable ",(0,r.jsx)(s.a,{href:"/docs/guides/trash#automatically-empty-trash",children:"automatically emptying the trash"})," for the library."]}),"\n",(0,r.jsx)(s.li,{children:"Perform a scan on the library and let all tasks finish. This will ensure all files are hashed."}),"\n",(0,r.jsx)(s.li,{children:"Stop Komga."}),"\n",(0,r.jsx)(s.li,{children:"Move/copy the files to the new folder."}),"\n",(0,r.jsx)(s.li,{children:"Start Komga."}),"\n",(0,r.jsx)(s.li,{children:"Edit the library and choose the new folder as the library root directory."}),"\n",(0,r.jsx)(s.li,{children:"A scan will be triggered automatically after saving the library. The scan could take some time depending on the size of the library."}),"\n",(0,r.jsx)(s.li,{children:"Once the scan is finished, the series and books should have been matched with the files in the new folder."}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"scan-doesnt-pick-up-new-files-under-mergerfs",children:"Scan doesn't pick up new files under mergerfs"}),"\n",(0,r.jsxs)(s.p,{children:["Add ",(0,r.jsx)(s.code,{children:"func.getattr=newest"})," to the options in your ",(0,r.jsx)(s.code,{children:"/etc/fstab"})," entry for the mergerfs volume. By default, mergerfs doesn't update the modified times for everything for performance reasons. This forces it to. In most cases the performance impact is negligible."]}),"\n",(0,r.jsx)(s.p,{children:"Example:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-shell",children:"/media/user/disk* /media/user/storage fuse.mergerfs defaults,nonempty,allow_other,use_ino,cache.files=off,moveonenospc=true,dropcacheonclose=true,minfreespace=50G,category.create=mfs,func.getattr=newest,fsname=mergerfs 0 0\n"})}),"\n",(0,r.jsx)(s.h2,{id:"docker-on-raspberry-pi-arm32-no-monotonic-clock-was-available",children:"Docker on Raspberry PI arm32: No monotonic clock was available"}),"\n",(0,r.jsx)(s.p,{children:"If you encounter the following message when starting the container:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-log",children:"OpenJDK Server VM warning: No monotonic clock was available - timed services may be adversely affected if the time-of-day clock changes\n"})}),"\n",(0,r.jsx)(s.p,{children:"Your host system needs to have installed:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Docker version ",(0,r.jsx)(s.code,{children:"19.03.9"})," or newer"]}),"\n",(0,r.jsxs)(s.li,{children:["libseccomp version ",(0,r.jsx)(s.code,{children:"2.4.2"})," or newer"]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},3023:(e,s,n)=>{n.d(s,{R:()=>a,x:()=>l});var o=n(3696);const r={},i=o.createContext(r);function a(e){const s=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(i.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0920ba86.e8e10d35.js b/assets/js/0920ba86.e8cdee03.js
similarity index 99%
rename from assets/js/0920ba86.e8e10d35.js
rename to assets/js/0920ba86.e8cdee03.js
index e3973f83..2b6ad815 100644
--- a/assets/js/0920ba86.e8e10d35.js
+++ b/assets/js/0920ba86.e8cdee03.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9225],{1523:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"guides/user-accounts","title":"User accounts","description":"The administrator of a Komga server has the ability to create other User Accounts for that server.","source":"@site/docs/guides/user-accounts.md","sourceDirName":"guides","slug":"/guides/user-accounts","permalink":"/docs/guides/user-accounts","draft":false,"unlisted":false,"editUrl":"https://github.com/gotson/komga-website/tree/master/docs/guides/user-accounts.md","tags":[],"version":"current","lastUpdatedAt":1732520982000,"frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Local Artwork Assets","permalink":"/docs/guides/local-artwork-assets"},"next":{"title":"Server settings & management","permalink":"/docs/guides/server-settings"}}');var n=i(2540),r=i(3023);const a={},l="User accounts",o={},d=[{value:"Creating Users",id:"creating-users",level:2},{value:"User Roles",id:"user-roles",level:2},{value:"Administrator",id:"administrator",level:3},{value:"Page Streaming",id:"page-streaming",level:3},{value:"File Download",id:"file-download",level:3},{value:"Shared Libraries",id:"shared-libraries",level:2},{value:"Content Restrictions",id:"content-restrictions",level:2},{value:"Age Rating",id:"age-rating",level:3},{value:"Labels",id:"labels",level:3},{value:"Multiple restrictions",id:"multiple-restrictions",level:3},{value:"Deleting Users",id:"deleting-users",level:2}];function c(e){const s={admonition:"admonition",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"user-accounts",children:"User accounts"})}),"\n",(0,n.jsx)(s.p,{children:"The administrator of a Komga server has the ability to create other User Accounts for that server."}),"\n",(0,n.jsxs)(s.p,{children:["You can manage Users in ",(0,n.jsx)(s.em,{children:"Server Settings > Users"}),"."]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/users-management.png",style:{maxHeight:"300px"},alt:"Users management"}),"\n",(0,n.jsx)(s.h2,{id:"creating-users",children:"Creating Users"}),"\n",(0,n.jsxs)(s.p,{children:["You can add a user by clicking on the ",(0,n.jsx)(s.em,{children:"+"})," button."]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/add-user.png",style:{maxHeight:"200px"},alt:"Add User"}),"\n",(0,n.jsxs)(s.p,{children:["A dialog will show up. Fill in all the required information, and press ",(0,n.jsx)(s.em,{children:"Add"}),"."]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/add-user-dialog.png",style:{maxHeight:"400px"},alt:"Add User Dialog"}),"\n",(0,n.jsx)(s.h2,{id:"user-roles",children:"User Roles"}),"\n",(0,n.jsx)(s.p,{children:"Users can have different roles, giving them the ability to do certain things."}),"\n",(0,n.jsx)(s.h3,{id:"administrator",children:"Administrator"}),"\n",(0,n.jsx)(s.p,{children:"An administrator can perform all the management actions:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"add, edit, and delete libraries"}),"\n",(0,n.jsx)(s.li,{children:"add, edit, and delete users"}),"\n",(0,n.jsx)(s.li,{children:"add, edit, and delete collections"}),"\n",(0,n.jsx)(s.li,{children:"edit series and book metadata"}),"\n",(0,n.jsx)(s.li,{children:"manually scan, analyze and refresh metadata"}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"page-streaming",children:"Page Streaming"}),"\n",(0,n.jsx)(s.p,{children:"A user with this role will be able to stream individual pages, for example to read using the Webreader."}),"\n",(0,n.jsx)(s.h3,{id:"file-download",children:"File Download"}),"\n",(0,n.jsx)(s.p,{children:"A user with this role will be able to download the file of a book."}),"\n",(0,n.jsx)(s.h2,{id:"shared-libraries",children:"Shared Libraries"}),"\n",(0,n.jsxs)(s.p,{children:["An administrator can limit what libraries users can access. This is done via the ",(0,n.jsx)(s.em,{children:"Edit Restrictions"})," button."]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/edit-libraries.png",style:{maxHeight:"50px"},alt:"Edit Restrictions"}),"\n",(0,n.jsxs)(s.p,{children:["Choose the libraries the user will be able to access, or select ",(0,n.jsx)(s.em,{children:"All libraries"})," for unrestricted access (default option)."]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/edit-libraries-dialog.png",style:{maxHeight:"400px"},alt:"Edit Shared Libraries"}),"\n",(0,n.jsx)(s.h2,{id:"content-restrictions",children:"Content Restrictions"}),"\n",(0,n.jsx)(s.p,{children:"Content restrictions lets you control more finely the content you share. You can select specific age rating as well as content that you\u2019ve set with a specific Label."}),"\n",(0,n.jsx)(s.p,{children:"Content restriction is performed at series level, and will also apply to books, collections and reading lists."}),"\n",(0,n.jsx)(s.h3,{id:"age-rating",children:"Age Rating"}),"\n",(0,n.jsx)(s.p,{children:"Select which age rating you wish to only allow or exclude. For instance, if you choose to only allow content under 10 as the restriction, then only content that has an age rating of 10 or under will be shared . If you choose to exclude content over 16 then those will be hidden."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/restriction-age-allow.png",style:{maxHeight:"400px"},alt:"Age Restriction Allow under"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/restriction-age-exclude.png",style:{maxHeight:"400px"},alt:"Age Restriction Exclude over"}),"\n",(0,n.jsx)(s.h3,{id:"labels",children:"Labels"}),"\n",(0,n.jsx)(s.p,{children:"You can create arbitrary Labels when editing library content. When sharing, you can then choose to allow one or more Labels to have content matching those Labels shared. You can also exclude labels."}),"\n",(0,n.jsx)(s.p,{children:"Labels are defined on Series:"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/series-sharing.png",style:{maxHeight:"400px"},alt:"Edit Shared Libraries"}),"\n",(0,n.jsx)(s.h3,{id:"multiple-restrictions",children:"Multiple restrictions"}),"\n",(0,n.jsx)(s.p,{children:"When combining multiple restrictions, the following rules apply:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Exclusion rules have always priority over allow rules."}),"\n",(0,n.jsxs)(s.li,{children:["Allow rules apply with an ",(0,n.jsx)(s.em,{children:"OR"}),' condition: for example allowing a user to access content rated 10 or under, or labelled "kids", the user will be able to access content matching one or the other.']}),"\n"]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/restrictions-dialog.png",style:{maxHeight:"400px"},alt:"Edit Restrictions"}),"\n",(0,n.jsx)(s.h2,{id:"deleting-users",children:"Deleting Users"}),"\n",(0,n.jsxs)(s.admonition,{type:"danger",children:[(0,n.jsx)(s.p,{children:"Deleting a user will remove all read progress for this user."}),(0,n.jsx)(s.p,{children:"This cannot be undone."})]})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},3023:(e,s,i)=>{i.d(s,{R:()=>a,x:()=>l});var t=i(3696);const n={},r=t.createContext(n);function a(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9225],{1523:(e,s,i)=>{i.r(s),i.d(s,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"guides/user-accounts","title":"User accounts","description":"The administrator of a Komga server has the ability to create other User Accounts for that server.","source":"@site/docs/guides/user-accounts.md","sourceDirName":"guides","slug":"/guides/user-accounts","permalink":"/docs/guides/user-accounts","draft":false,"unlisted":false,"editUrl":"https://github.com/gotson/komga-website/tree/master/docs/guides/user-accounts.md","tags":[],"version":"current","lastUpdatedAt":1733190983000,"frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Local Artwork Assets","permalink":"/docs/guides/local-artwork-assets"},"next":{"title":"Server settings & management","permalink":"/docs/guides/server-settings"}}');var n=i(2540),r=i(3023);const a={},l="User accounts",o={},d=[{value:"Creating Users",id:"creating-users",level:2},{value:"User Roles",id:"user-roles",level:2},{value:"Administrator",id:"administrator",level:3},{value:"Page Streaming",id:"page-streaming",level:3},{value:"File Download",id:"file-download",level:3},{value:"Shared Libraries",id:"shared-libraries",level:2},{value:"Content Restrictions",id:"content-restrictions",level:2},{value:"Age Rating",id:"age-rating",level:3},{value:"Labels",id:"labels",level:3},{value:"Multiple restrictions",id:"multiple-restrictions",level:3},{value:"Deleting Users",id:"deleting-users",level:2}];function c(e){const s={admonition:"admonition",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"user-accounts",children:"User accounts"})}),"\n",(0,n.jsx)(s.p,{children:"The administrator of a Komga server has the ability to create other User Accounts for that server."}),"\n",(0,n.jsxs)(s.p,{children:["You can manage Users in ",(0,n.jsx)(s.em,{children:"Server Settings > Users"}),"."]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/users-management.png",style:{maxHeight:"300px"},alt:"Users management"}),"\n",(0,n.jsx)(s.h2,{id:"creating-users",children:"Creating Users"}),"\n",(0,n.jsxs)(s.p,{children:["You can add a user by clicking on the ",(0,n.jsx)(s.em,{children:"+"})," button."]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/add-user.png",style:{maxHeight:"200px"},alt:"Add User"}),"\n",(0,n.jsxs)(s.p,{children:["A dialog will show up. Fill in all the required information, and press ",(0,n.jsx)(s.em,{children:"Add"}),"."]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/add-user-dialog.png",style:{maxHeight:"400px"},alt:"Add User Dialog"}),"\n",(0,n.jsx)(s.h2,{id:"user-roles",children:"User Roles"}),"\n",(0,n.jsx)(s.p,{children:"Users can have different roles, giving them the ability to do certain things."}),"\n",(0,n.jsx)(s.h3,{id:"administrator",children:"Administrator"}),"\n",(0,n.jsx)(s.p,{children:"An administrator can perform all the management actions:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"add, edit, and delete libraries"}),"\n",(0,n.jsx)(s.li,{children:"add, edit, and delete users"}),"\n",(0,n.jsx)(s.li,{children:"add, edit, and delete collections"}),"\n",(0,n.jsx)(s.li,{children:"edit series and book metadata"}),"\n",(0,n.jsx)(s.li,{children:"manually scan, analyze and refresh metadata"}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"page-streaming",children:"Page Streaming"}),"\n",(0,n.jsx)(s.p,{children:"A user with this role will be able to stream individual pages, for example to read using the Webreader."}),"\n",(0,n.jsx)(s.h3,{id:"file-download",children:"File Download"}),"\n",(0,n.jsx)(s.p,{children:"A user with this role will be able to download the file of a book."}),"\n",(0,n.jsx)(s.h2,{id:"shared-libraries",children:"Shared Libraries"}),"\n",(0,n.jsxs)(s.p,{children:["An administrator can limit what libraries users can access. This is done via the ",(0,n.jsx)(s.em,{children:"Edit Restrictions"})," button."]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/edit-libraries.png",style:{maxHeight:"50px"},alt:"Edit Restrictions"}),"\n",(0,n.jsxs)(s.p,{children:["Choose the libraries the user will be able to access, or select ",(0,n.jsx)(s.em,{children:"All libraries"})," for unrestricted access (default option)."]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/edit-libraries-dialog.png",style:{maxHeight:"400px"},alt:"Edit Shared Libraries"}),"\n",(0,n.jsx)(s.h2,{id:"content-restrictions",children:"Content Restrictions"}),"\n",(0,n.jsx)(s.p,{children:"Content restrictions lets you control more finely the content you share. You can select specific age rating as well as content that you\u2019ve set with a specific Label."}),"\n",(0,n.jsx)(s.p,{children:"Content restriction is performed at series level, and will also apply to books, collections and reading lists."}),"\n",(0,n.jsx)(s.h3,{id:"age-rating",children:"Age Rating"}),"\n",(0,n.jsx)(s.p,{children:"Select which age rating you wish to only allow or exclude. For instance, if you choose to only allow content under 10 as the restriction, then only content that has an age rating of 10 or under will be shared . If you choose to exclude content over 16 then those will be hidden."}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/restriction-age-allow.png",style:{maxHeight:"400px"},alt:"Age Restriction Allow under"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/restriction-age-exclude.png",style:{maxHeight:"400px"},alt:"Age Restriction Exclude over"}),"\n",(0,n.jsx)(s.h3,{id:"labels",children:"Labels"}),"\n",(0,n.jsx)(s.p,{children:"You can create arbitrary Labels when editing library content. When sharing, you can then choose to allow one or more Labels to have content matching those Labels shared. You can also exclude labels."}),"\n",(0,n.jsx)(s.p,{children:"Labels are defined on Series:"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/series-sharing.png",style:{maxHeight:"400px"},alt:"Edit Shared Libraries"}),"\n",(0,n.jsx)(s.h3,{id:"multiple-restrictions",children:"Multiple restrictions"}),"\n",(0,n.jsx)(s.p,{children:"When combining multiple restrictions, the following rules apply:"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsx)(s.li,{children:"Exclusion rules have always priority over allow rules."}),"\n",(0,n.jsxs)(s.li,{children:["Allow rules apply with an ",(0,n.jsx)(s.em,{children:"OR"}),' condition: for example allowing a user to access content rated 10 or under, or labelled "kids", the user will be able to access content matching one or the other.']}),"\n"]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/user-accounts/restrictions-dialog.png",style:{maxHeight:"400px"},alt:"Edit Restrictions"}),"\n",(0,n.jsx)(s.h2,{id:"deleting-users",children:"Deleting Users"}),"\n",(0,n.jsxs)(s.admonition,{type:"danger",children:[(0,n.jsx)(s.p,{children:"Deleting a user will remove all read progress for this user."}),(0,n.jsx)(s.p,{children:"This cannot be undone."})]})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},3023:(e,s,i)=>{i.d(s,{R:()=>a,x:()=>l});var t=i(3696);const n={},r=t.createContext(n);function a(e){const s=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(r.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0bf9748d.865030d5.js b/assets/js/0bf9748d.dc6b10e2.js
similarity index 99%
rename from assets/js/0bf9748d.865030d5.js
rename to assets/js/0bf9748d.dc6b10e2.js
index e5c65570..f70b5bb5 100644
--- a/assets/js/0bf9748d.865030d5.js
+++ b/assets/js/0bf9748d.dc6b10e2.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2531],{9816:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>o,contentTitle:()=>t,default:()=>h,frontMatter:()=>l,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"guides/scan-analysis-refresh","title":"Scanning, Analyzing and Refreshing Metadata","description":"Once a library has been created, it is processed by Komga so all the files are matched to series and books, and metadata is gathered. As time goes on, you\u2019ll add and remove books to the libraries or make other changes that mean the library is no longer up-to-date. You can Scan libraries to bring them up-to-date. Scanning, Analyzing and Refreshing a library do different things.","source":"@site/docs/guides/scan-analysis-refresh.md","sourceDirName":"guides","slug":"/guides/scan-analysis-refresh","permalink":"/docs/guides/scan-analysis-refresh","draft":false,"unlisted":false,"editUrl":"https://github.com/gotson/komga-website/tree/master/docs/guides/scan-analysis-refresh.md","tags":[],"version":"current","lastUpdatedAt":1732520982000,"frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Emptying Library Trash","permalink":"/docs/guides/trash"},"next":{"title":"Image Types","permalink":"/docs/guides/image-formats"}}');var a=n(2540),r=n(3023);const l={},t="Scanning, Analyzing and Refreshing Metadata",o={},d=[{value:"Scan Library Files",id:"scan-library-files",level:2},{value:"Deep scan",id:"deep-scan",level:3},{value:"What happens during a Scan?",id:"what-happens-during-a-scan",level:2},{value:"Analyze books",id:"analyze-books",level:2},{value:"What happens during Analysis?",id:"what-happens-during-analysis",level:3},{value:"Gather media properties",id:"gather-media-properties",level:4},{value:"Generate default artwork",id:"generate-default-artwork",level:4},{value:"Analyze your content",id:"analyze-your-content",level:3},{value:"Media Analysis screen",id:"media-analysis-screen",level:3},{value:"Refresh metadata",id:"refresh-metadata",level:2},{value:"Import metadata for CBR/CBZ containing a ComicInfo.xml file",id:"import-metadata-for-cbrcbz-containing-a-comicinfoxml-file",level:3},{value:"Book metadata",id:"book-metadata",level:4},{value:"Series metadata",id:"series-metadata",level:4},{value:"Collections",id:"collections",level:4},{value:"Read lists",id:"read-lists",level:4},{value:"StoryArcNumber",id:"storyarcnumber",level:5},{value:"Import metadata from EPUB files",id:"import-metadata-from-epub-files",level:3},{value:"Book metadata",id:"book-metadata-1",level:4},{value:"Series metadata",id:"series-metadata-1",level:4},{value:"Import metadata generated by Mylar",id:"import-metadata-generated-by-mylar",level:3},{value:"Import local media assets",id:"import-local-media-assets",level:3},{value:"Local artwork",id:"local-artwork",level:4},{value:"Import ISBN within barcode",id:"import-isbn-within-barcode",level:3},{value:"ISBN barcode",id:"isbn-barcode",level:4}];function c(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(i.header,{children:(0,a.jsx)(i.h1,{id:"scanning-analyzing-and-refreshing-metadata",children:"Scanning, Analyzing and Refreshing Metadata"})}),"\n",(0,a.jsx)(i.p,{children:"Once a library has been created, it is processed by Komga so all the files are matched to series and books, and metadata is gathered. As time goes on, you\u2019ll add and remove books to the libraries or make other changes that mean the library is no longer up-to-date. You can Scan libraries to bring them up-to-date. Scanning, Analyzing and Refreshing a library do different things."}),"\n",(0,a.jsx)(i.h2,{id:"scan-library-files",children:"Scan Library Files"}),"\n",(0,a.jsx)(i.p,{children:"Scanning a library makes Komga check its folders and sub-folders for new or removed books. If it finds new media, it then pulls it into the library. You can think of scanning as \u201ccheck for new or changed content\u201d."}),"\n",(0,a.jsx)(i.p,{children:"All files that have changed after a scan will be Analyzed."}),"\n",(0,a.jsx)(i.p,{children:"You should Scan Library Files if you have:"}),"\n",(0,a.jsxs)(i.ul,{children:["\n",(0,a.jsx)(i.li,{children:"Added or deleted files or folders"}),"\n",(0,a.jsx)(i.li,{children:"Renamed a file or folder"}),"\n",(0,a.jsx)(i.li,{children:"Moved files or folders from one location to another"}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"By default, Komga will scan your libraries regularly."}),"\n",(0,a.jsx)(i.h3,{id:"deep-scan",children:"Deep scan"}),"\n",(0,a.jsx)(i.p,{children:"This will force the scanner to compare all scanned books with the ones stored in the database. Normally this is not required, as Komga uses the last modified time of the parent folders to decide whether to compare books, but some filesystems may behave differently."}),"\n",(0,a.jsx)(i.p,{children:"Trigger a Deep Scan if Komga is missing some books after a scan."}),"\n",(0,a.jsx)(i.h2,{id:"what-happens-during-a-scan",children:"What happens during a Scan?"}),"\n",(0,a.jsxs)(i.p,{children:["Komga will generate a library representation of your files on disk. A Komga library does ",(0,a.jsx)(i.em,{children:"not"})," represent exactly your folder structure."]}),"\n",(0,a.jsxs)(i.ul,{children:["\n",(0,a.jsxs)(i.li,{children:["Komga will create a ",(0,a.jsx)(i.em,{children:"Series"})," for each subfolder of any library, whatever the depth of this subfolder in your directory structure"]}),"\n",(0,a.jsxs)(i.li,{children:["Komga will create a ",(0,a.jsx)(i.em,{children:"Book"})," for each file found, and place it inside the ",(0,a.jsx)(i.em,{children:"Series"})," corresponding to the parent folder of the file"]}),"\n"]}),"\n",(0,a.jsx)(i.h2,{id:"analyze-books",children:"Analyze books"}),"\n",(0,a.jsx)(i.p,{children:"Analysis is automatically performed when content is added to your Library. In rare cases, new versions of Komga may update the media analysis capabilities to correct something or add the ability to detect new things. In those cases, content may be re-analyzed when you access it after the new server version is installed."}),"\n",(0,a.jsx)(i.h3,{id:"what-happens-during-analysis",children:"What happens during Analysis?"}),"\n",(0,a.jsx)(i.p,{children:"Whenever an item is added to one of your Libraries, Komga performs some analysis on it to gather information. In addition, all files analyzed will also be refreshed for metadata."}),"\n",(0,a.jsx)(i.h4,{id:"gather-media-properties",children:"Gather media properties"}),"\n",(0,a.jsx)(i.p,{children:"The primary purpose of media analysis is to gather information about that media item. All of the media you add to a Library has properties that are useful to know, such as:"}),"\n",(0,a.jsxs)(i.ul,{children:["\n",(0,a.jsx)(i.li,{children:"Container: ZIP, RAR, EPUB, PDF, etc."}),"\n",(0,a.jsx)(i.li,{children:"Images Format: JPEG, PNG, WEBP, etc."}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"Why, though? What use are these media properties? Your Server, together with your apps, can use this information to help determine whether (and how) content can be played."}),"\n",(0,a.jsx)(i.p,{children:"For example: Imagine you have a CBR file with WEBP images, but you\u2019re using Internet Explorer (which can\u2019t read WEBP). Since the webreader knows what kind of content your browser can display and since your media analysis detected that the book has WEBP images, your Komga Server can convert those images to a compatible format (like JPEG) for you in order to let you read your book successfully."}),"\n",(0,a.jsx)(i.h4,{id:"generate-default-artwork",children:"Generate default artwork"}),"\n",(0,a.jsx)(i.p,{children:"During analysis, artwork will automatically be grabbed from a book file. The first page will be used for poster/thumbnail type purposes."}),"\n",(0,a.jsx)(i.h3,{id:"analyze-your-content",children:"Analyze your content"}),"\n",(0,a.jsx)(i.p,{children:"You can analyze content in multiple ways: for a book, for a series, or even for an entire Library."}),"\n",(0,a.jsxs)(i.p,{children:["Look for the action menu icon ",(0,a.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,a.jsx)(i.em,{children:"Analyze"}),"."]}),"\n",(0,a.jsx)(i.admonition,{type:"warning",children:(0,a.jsx)(i.p,{children:"Depending on the size of your Library, analysis may take a while."})}),"\n",(0,a.jsx)(i.h3,{id:"media-analysis-screen",children:"Media Analysis screen"}),"\n",(0,a.jsxs)(i.p,{children:["You can check all the media for which the analysis did not succeed from the Media Analysis screen. You can access it from ",(0,a.jsx)(i.em,{children:"Media Management > Media Analysis"}),"."]}),"\n",(0,a.jsx)(i.p,{children:"It will show you all books with a status of:"}),"\n",(0,a.jsxs)(i.ul,{children:["\n",(0,a.jsx)(i.li,{children:"Error: Komga could not analyze the book. If possible, there will be a comment to describe the error."}),"\n",(0,a.jsx)(i.li,{children:"Unsupported: Komga does not support those files. The comment will give you more information."}),"\n"]}),"\n",(0,a.jsx)("a",{href:"/assets/media/guides/scan-analysis-refresh/media-analysis.png",children:(0,a.jsx)("img",{src:"/assets/media/guides/scan-analysis-refresh/media-analysis.png",style:{maxHeight:"400px"},alt:"Media Analysis"})}),"\n",(0,a.jsx)(i.h2,{id:"refresh-metadata",children:"Refresh metadata"}),"\n",(0,a.jsx)(i.p,{children:"Refreshing Metadata for a library, series, or individual book causes the metadata for the item to be refreshed, even if it already has metadata. You can think of refreshing as \u201cupdate metadata for the requested item even if it already has some\u201d."}),"\n",(0,a.jsx)(i.p,{children:"You should refresh a library or individual item if:"}),"\n",(0,a.jsxs)(i.ul,{children:["\n",(0,a.jsx)(i.li,{children:"You\u2019ve changed options for the library"}),"\n",(0,a.jsx)(i.li,{children:'You\u2019ve added "local media assets" (such as artwork)'}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"Metadata is gathered from the following sources:"}),"\n",(0,a.jsxs)(i.ul,{children:["\n",(0,a.jsxs)(i.li,{children:["a local ",(0,a.jsx)(i.code,{children:"ComicInfo.xml"})," file located inside a CBZ or CBR"]}),"\n",(0,a.jsx)(i.li,{children:"the metadata of an EPUB file"}),"\n",(0,a.jsx)(i.li,{children:"local media assets"}),"\n"]}),"\n",(0,a.jsx)(i.p,{children:"The metadata refresh is dependent of the options of the Library."}),"\n",(0,a.jsx)(i.h3,{id:"import-metadata-for-cbrcbz-containing-a-comicinfoxml-file",children:"Import metadata for CBR/CBZ containing a ComicInfo.xml file"}),"\n",(0,a.jsx)(i.h4,{id:"book-metadata",children:"Book metadata"}),"\n",(0,a.jsxs)(i.p,{children:["This will import the following elements from the ",(0,a.jsx)(i.code,{children:"ComicInfo.xml"})," file in Komga:"]}),"\n",(0,a.jsxs)(i.ul,{children:["\n",(0,a.jsxs)(i.li,{children:[(0,a.jsx)(i.code,{children:"Year"}),", ",(0,a.jsx)(i.code,{children:"Month"}),", and ",(0,a.jsx)(i.code,{children:"Day"})," to form the ",(0,a.jsx)(i.em,{children:"Release Date"})]}),"\n",(0,a.jsxs)(i.li,{children:[(0,a.jsx)(i.code,{children:"Writer"}),", ",(0,a.jsx)(i.code,{children:"Penciller"}),", ",(0,a.jsx)(i.code,{children:"Inker"}),", ",(0,a.jsx)(i.code,{children:"Colorist"}),", ",(0,a.jsx)(i.code,{children:"Letterer"}),", ",(0,a.jsx)(i.code,{children:"CoverArtist"}),", ",(0,a.jsx)(i.code,{children:"Editor"}),", and ",(0,a.jsx)(i.code,{children:"Translator"})," as ",(0,a.jsx)(i.em,{children:"Authors"})," with the according role. A value with multiple names separated by a ",(0,a.jsx)(i.code,{children:","})," will be split in different authors."]}),"\n",(0,a.jsxs)(i.li,{children:[(0,a.jsx)(i.code,{children:"Title"}),", ",(0,a.jsx)(i.code,{children:"Summary"}),", ",(0,a.jsx)(i.code,{children:"Number"})," as their Komga equivalent"]}),"\n",(0,a.jsxs)(i.li,{children:["Valid ",(0,a.jsx)(i.code,{children:"Web"})," links as a book link"]}),"\n",(0,a.jsxs)(i.li,{children:["The ",(0,a.jsx)(i.code,{children:"Tags"})," element will be split by ",(0,a.jsx)(i.code,{children:","})," and added to the book's ",(0,a.jsx)(i.em,{children:"tags"})]}),"\n",(0,a.jsxs)(i.li,{children:["If the ",(0,a.jsx)(i.code,{children:"GTIN"})," element contains a valid ISBN, as the book's ",(0,a.jsx)(i.em,{children:"ISBN"})]}),"\n"]}),"\n",(0,a.jsx)(i.h4,{id:"series-metadata",children:"Series metadata"}),"\n",(0,a.jsxs)(i.p,{children:["This will import the following elements from the ",(0,a.jsx)(i.code,{children:"ComicInfo.xml"})," of the Series' books in Komga:"]}),"\n",(0,a.jsxs)(i.ul,{children:["\n",(0,a.jsxs)(i.li,{children:["The ",(0,a.jsx)(i.code,{children:"Series"})," and ",(0,a.jsx)(i.code,{children:"Volume"})," elements will be used to overwrite the title of the Series, in the form ",(0,a.jsx)(i.code,{children:"jar
file",id:"with-the-jar-file",level:3},{value:"With docker run",id:"with-docker-run",level:3},{value:"With docker-compose",id:"with-docker-compose",level:3},{value:"Available commands",id:"available-commands",level:2},{value:"List users",id:"list-users",level:3},{value:"Reset password for a user",id:"reset-password-for-a-user",level:3}];function c(e){const s={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"command-line-interface",children:"Command Line Interface"})}),"\n",(0,o.jsx)(s.p,{children:"Komga offers a few commands available from the command line."}),"\n",(0,o.jsx)(s.h2,{id:"how-to-use",children:"How to use?"}),"\n",(0,o.jsx)(s.p,{children:"You just need to append the command to the command line. Note that Komga will still start and run as usual."}),"\n",(0,o.jsxs)(s.h3,{id:"with-the-jar-file",children:["With the ",(0,o.jsx)(s.code,{children:"jar"})," file"]}),"\n",(0,o.jsx)(s.p,{children:"Example:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",children:"java -jar komga-x.y.z.jar --list-users\n"})}),"\n",(0,o.jsx)(s.h3,{id:"with-docker-run",children:"With docker run"}),"\n",(0,o.jsx)(s.p,{children:"Example:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",children:"docker run ghcr.io/gotson/komga:latest --list-users\n"})}),"\n",(0,o.jsx)(s.h3,{id:"with-docker-compose",children:"With docker-compose"}),"\n",(0,o.jsxs)(s.p,{children:["You can override the ",(0,o.jsx)(s.code,{children:"command"}),":"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-yaml",children:"services:\n komga:\n image: gotson/komga:latest\n command: --newpassword=toto --reset=admin@example.org\n"})}),"\n",(0,o.jsx)(s.h2,{id:"available-commands",children:"Available commands"}),"\n",(0,o.jsx)(s.h3,{id:"list-users",children:"List users"}),"\n",(0,o.jsxs)(s.p,{children:["Command: ",(0,o.jsx)(s.code,{children:"--list-users"})]}),"\n",(0,o.jsx)(s.p,{children:"This will output all the users configured in the database. The output will be shown in the console or the logs."}),"\n",(0,o.jsx)(s.p,{children:"Example:"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.code,{children:"2023-08-02T13:41:45.215+08:00 INFO 1979 --- [ main] o.g.k.i.apprunner.ListUsersRunner : Here is a list of all users: [admin@example.org, jacky@example.org]"})}),"\n",(0,o.jsx)(s.h3,{id:"reset-password-for-a-user",children:"Reset password for a user"}),"\n",(0,o.jsxs)(s.p,{children:["Command: ",(0,o.jsx)(s.code,{children:"--reset=user@domain.com --newpassword=YourNewPassword"})]}),"\n",(0,o.jsx)(s.p,{children:"This will reset the password for the specified user."}),"\n",(0,o.jsx)(s.p,{children:"Example:"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.code,{children:"2023-08-02T13:50:42.998+08:00 INFO 2806 --- [ main] o.g.k.i.apprunner.PasswordResetRunner : Reset password for user: admin@example.org"})})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},3023:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>a});var r=n(3696);const o={},i=r.createContext(o);function t(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[832],{3477:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"guides/cli","title":"Command Line Interface","description":"Komga offers a few commands available from the command line.","source":"@site/docs/guides/cli.md","sourceDirName":"guides","slug":"/guides/cli","permalink":"/docs/guides/cli","draft":false,"unlisted":false,"editUrl":"https://github.com/gotson/komga-website/tree/master/docs/guides/cli.md","tags":[],"version":"current","lastUpdatedAt":1733190983000,"frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Announcements","permalink":"/docs/guides/announcements"},"next":{"title":"Contribution","permalink":"/docs/contribution"}}');var o=n(2540),i=n(3023);const t={},a="Command Line Interface",l={},d=[{value:"How to use?",id:"how-to-use",level:2},{value:"With the jar
file",id:"with-the-jar-file",level:3},{value:"With docker run",id:"with-docker-run",level:3},{value:"With docker-compose",id:"with-docker-compose",level:3},{value:"Available commands",id:"available-commands",level:2},{value:"List users",id:"list-users",level:3},{value:"Reset password for a user",id:"reset-password-for-a-user",level:3}];function c(e){const s={code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"command-line-interface",children:"Command Line Interface"})}),"\n",(0,o.jsx)(s.p,{children:"Komga offers a few commands available from the command line."}),"\n",(0,o.jsx)(s.h2,{id:"how-to-use",children:"How to use?"}),"\n",(0,o.jsx)(s.p,{children:"You just need to append the command to the command line. Note that Komga will still start and run as usual."}),"\n",(0,o.jsxs)(s.h3,{id:"with-the-jar-file",children:["With the ",(0,o.jsx)(s.code,{children:"jar"})," file"]}),"\n",(0,o.jsx)(s.p,{children:"Example:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",children:"java -jar komga-x.y.z.jar --list-users\n"})}),"\n",(0,o.jsx)(s.h3,{id:"with-docker-run",children:"With docker run"}),"\n",(0,o.jsx)(s.p,{children:"Example:"}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-shell",children:"docker run ghcr.io/gotson/komga:latest --list-users\n"})}),"\n",(0,o.jsx)(s.h3,{id:"with-docker-compose",children:"With docker-compose"}),"\n",(0,o.jsxs)(s.p,{children:["You can override the ",(0,o.jsx)(s.code,{children:"command"}),":"]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-yaml",children:"services:\n komga:\n image: gotson/komga:latest\n command: --newpassword=toto --reset=admin@example.org\n"})}),"\n",(0,o.jsx)(s.h2,{id:"available-commands",children:"Available commands"}),"\n",(0,o.jsx)(s.h3,{id:"list-users",children:"List users"}),"\n",(0,o.jsxs)(s.p,{children:["Command: ",(0,o.jsx)(s.code,{children:"--list-users"})]}),"\n",(0,o.jsx)(s.p,{children:"This will output all the users configured in the database. The output will be shown in the console or the logs."}),"\n",(0,o.jsx)(s.p,{children:"Example:"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.code,{children:"2023-08-02T13:41:45.215+08:00 INFO 1979 --- [ main] o.g.k.i.apprunner.ListUsersRunner : Here is a list of all users: [admin@example.org, jacky@example.org]"})}),"\n",(0,o.jsx)(s.h3,{id:"reset-password-for-a-user",children:"Reset password for a user"}),"\n",(0,o.jsxs)(s.p,{children:["Command: ",(0,o.jsx)(s.code,{children:"--reset=user@domain.com --newpassword=YourNewPassword"})]}),"\n",(0,o.jsx)(s.p,{children:"This will reset the password for the specified user."}),"\n",(0,o.jsx)(s.p,{children:"Example:"}),"\n",(0,o.jsx)(s.p,{children:(0,o.jsx)(s.code,{children:"2023-08-02T13:50:42.998+08:00 INFO 2806 --- [ main] o.g.k.i.apprunner.PasswordResetRunner : Reset password for user: admin@example.org"})})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},3023:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>a});var r=n(3696);const o={},i=r.createContext(o);function t(e){const s=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/206b31bb.73525625.js b/assets/js/206b31bb.0d66ec1f.js
similarity index 99%
rename from assets/js/206b31bb.73525625.js
rename to assets/js/206b31bb.0d66ec1f.js
index dc096519..f00ba00c 100644
--- a/assets/js/206b31bb.73525625.js
+++ b/assets/js/206b31bb.0d66ec1f.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6897],{1074:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>r,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"guides/oneshots","title":"One-Shots","description":"What are One-Shots?","source":"@site/docs/guides/oneshots.md","sourceDirName":"guides","slug":"/guides/oneshots","permalink":"/docs/guides/oneshots","draft":false,"unlisted":false,"editUrl":"https://github.com/gotson/komga-website/tree/master/docs/guides/oneshots.md","tags":[],"version":"current","lastUpdatedAt":1732520982000,"frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Image Types","permalink":"/docs/guides/image-formats"},"next":{"title":"Edit Metadata","permalink":"/docs/guides/edit-metadata"}}');var t=s(2540),o=s(3023);const r={},l="One-Shots",d={},h=[{value:"What are One-Shots?",id:"what-are-one-shots",level:2},{value:"One-Shots handling",id:"one-shots-handling",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Processing",id:"processing",level:3},{value:"Metadata",id:"metadata",level:3},{value:"Dashboard",id:"dashboard",level:3},{value:"REST API",id:"rest-api",level:3}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"one-shots",children:"One-Shots"})}),"\n",(0,t.jsx)(n.h2,{id:"what-are-one-shots",children:"What are One-Shots?"}),"\n",(0,t.jsx)(n.p,{children:"One-Shots are series containing a single book."}),"\n",(0,t.jsx)(n.p,{children:"However not all series containing a single book are One-Shots. Here are some example of single book series that are not One-Shots:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"a series that has multiple books published, but only a single book is collected in Komga"}),"\n",(0,t.jsx)(n.li,{children:"a series that currently has only 1 book published, but will have more in the future"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Historically Komga required each series to be in its own directory on disk. This was cumbersome for One-Shots, as each book needed to be placed in a dedicated directory."}),"\n",(0,t.jsx)(n.p,{children:"With One-Shots handling, this is not necessary anymore."}),"\n",(0,t.jsx)(n.p,{children:"One-Shots are still composed of a series with a single book, but are handled slightly differently."}),"\n",(0,t.jsx)(n.h2,{id:"one-shots-handling",children:"One-Shots handling"}),"\n",(0,t.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(n.p,{children:["You can enable One-Shots handling through ",(0,t.jsx)(n.a,{href:"/docs/guides/libraries#one-shots-directory",children:"Library options"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"processing",children:"Processing"}),"\n",(0,t.jsxs)(n.p,{children:["One-Shots are detected during the scan. Any directory for which the full path contains the configured ",(0,t.jsx)(n.em,{children:"One-Shots directory"})," will generate One-Shot series instead of standard Series."]}),"\n",(0,t.jsxs)(n.p,{children:["Given the following directory structure, with ",(0,t.jsx)(n.em,{children:"One-Shots directory"})," configured to ",(0,t.jsx)(n.code,{children:"_oneshots"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"/data/books/Comics\n\u251c\u2500\u2500 Space Adventures\n\u2502\xa0\xa0 \u251c\u2500\u2500 Space_Adventures_001.cbz\n\u2502\xa0\xa0 \u251c\u2500\u2500 Space_Adventures_002.cbz\n\u2502\xa0\xa0 \u251c\u2500\u2500 Space_Adventures_003.cbz\n\u2502\xa0\xa0 \u2514\u2500\u2500 _oneshots\n\u2502\xa0\xa0 \u2514\u2500\u2500 Pluto Adventures.cbz\n\u251c\u2500\u2500 Super Duck\n\u2502\xa0\xa0 \u251c\u2500\u2500 Super_Duck_001.cbz\n\u2502\xa0\xa0 \u251c\u2500\u2500 Super_Duck_002.cbz\n\u2502\xa0\xa0 \u2514\u2500\u2500 Super_Duck_003.cbz\n\u2514\u2500\u2500 _oneshots\n \u251c\u2500\u2500 A oneshot.cbz\n \u251c\u2500\u2500 Another oneshot.cbz\n \u2514\u2500\u2500 Yet another oneshot.cbz\n"})}),"\n",(0,t.jsx)(n.p,{children:"This will result in:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["2 regular series:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"Space Adventures"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"Super Duck"})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["4 One-Shots:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"Pluto Adventures"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"A oneshot"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"Another oneshot"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"Yet another oneshot"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.em,{children:"One-Shots directory"})," is checked against ",(0,t.jsx)(n.strong,{children:"any part of the directory path"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"_oneshots"})," will match on:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"/data/books/Comics/_oneshots"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"/data/books/Comics/My weirdly named _oneshots"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["To match only directories starting with the provided string, prefix ",(0,t.jsx)(n.em,{children:"One-Shots directory"})," with ",(0,t.jsx)(n.code,{children:"/"}),", like ",(0,t.jsx)(n.code,{children:"/_oneshots"})]})}),"\n",(0,t.jsx)(n.h3,{id:"metadata",children:"Metadata"}),"\n",(0,t.jsx)(n.p,{children:"While the book metadata will be processed as usual, the series metadata for One-Shots will be handled slightly differently:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["the Mylar ",(0,t.jsx)(n.code,{children:"series.json"})," is ignored"]}),"\n",(0,t.jsx)(n.li,{children:"the local artwork is ignored. The one for the book is still processed as usual."}),"\n",(0,t.jsxs)(n.li,{children:["in addition, some metadata is set:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"the series title and summary are set from the one of the book"}),"\n",(0,t.jsxs)(n.li,{children:["the series status is set to ",(0,t.jsx)(n.em,{children:"Ended"})]}),"\n",(0,t.jsx)(n.li,{children:"the series total book count is set to 1"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"dashboard",children:"Dashboard"}),"\n",(0,t.jsx)(n.p,{children:"The Dashboard has specific handling for One-Shots:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"One-Shots are displayed in a new view that shows both series and book metadata fields"}),"\n",(0,t.jsxs)(n.li,{children:["when editing One-Shots metadata, a new dialog will allow to edit both book and series level metadata fields.","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"If you edit multiple items and all are One-Shots, this dialog is also used."}),"\n",(0,t.jsx)(n.li,{children:"If there is a mix of One-Shots and normal items (series or books), the regular dialog will be used instead.s"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"One-Shots can be added to both collections and readlists"}),"\n",(0,t.jsxs)(n.li,{children:["One-Shots will not show in the ",(0,t.jsx)(n.em,{children:"Recently Added Series"})," or ",(0,t.jsx)(n.em,{children:"Recently Updated Series"})," sections, but they will show in ",(0,t.jsx)(n.em,{children:"Recently Added Books"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Item card in Series views (when browsing libraries or collections):","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"will show an unread indicator in the top-right corner, instead of the number of unread books"}),"\n",(0,t.jsxs)(n.li,{children:["will display ",(0,t.jsx)(n.em,{children:"One-shot"})," at the bottom of the card instead of the number of books"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"Item card in Book views (when browsing readlists or recommended) will not display the Series name nor the book number"}),"\n",(0,t.jsxs)(n.li,{children:["the Series filter panel has a ",(0,t.jsx)(n.em,{children:"One-shot"})," filter"]}),"\n",(0,t.jsx)(n.li,{children:"One-Shots will not show in the Series picker dialog when importing books"}),"\n",(0,t.jsx)(n.li,{children:"One-Shots will show only as books in the search bar and detailed search view"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"rest-api",children:"REST API"}),"\n",(0,t.jsxs)(n.p,{children:["One-Shots are still composed of a Series with a single Book, however both have a new ",(0,t.jsx)(n.code,{children:"boolean"})," attribute ",(0,t.jsx)(n.code,{children:"oneshot"})," which can be used in client applications to handle One-Shots differently."]})]})}function c(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},3023:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>l});var i=s(3696);const t={},o=i.createContext(t);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6897],{1074:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>r,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"guides/oneshots","title":"One-Shots","description":"What are One-Shots?","source":"@site/docs/guides/oneshots.md","sourceDirName":"guides","slug":"/guides/oneshots","permalink":"/docs/guides/oneshots","draft":false,"unlisted":false,"editUrl":"https://github.com/gotson/komga-website/tree/master/docs/guides/oneshots.md","tags":[],"version":"current","lastUpdatedAt":1733190983000,"frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Image Types","permalink":"/docs/guides/image-formats"},"next":{"title":"Edit Metadata","permalink":"/docs/guides/edit-metadata"}}');var t=s(2540),o=s(3023);const r={},l="One-Shots",d={},h=[{value:"What are One-Shots?",id:"what-are-one-shots",level:2},{value:"One-Shots handling",id:"one-shots-handling",level:2},{value:"Configuration",id:"configuration",level:3},{value:"Processing",id:"processing",level:3},{value:"Metadata",id:"metadata",level:3},{value:"Dashboard",id:"dashboard",level:3},{value:"REST API",id:"rest-api",level:3}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"one-shots",children:"One-Shots"})}),"\n",(0,t.jsx)(n.h2,{id:"what-are-one-shots",children:"What are One-Shots?"}),"\n",(0,t.jsx)(n.p,{children:"One-Shots are series containing a single book."}),"\n",(0,t.jsx)(n.p,{children:"However not all series containing a single book are One-Shots. Here are some example of single book series that are not One-Shots:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"a series that has multiple books published, but only a single book is collected in Komga"}),"\n",(0,t.jsx)(n.li,{children:"a series that currently has only 1 book published, but will have more in the future"}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Historically Komga required each series to be in its own directory on disk. This was cumbersome for One-Shots, as each book needed to be placed in a dedicated directory."}),"\n",(0,t.jsx)(n.p,{children:"With One-Shots handling, this is not necessary anymore."}),"\n",(0,t.jsx)(n.p,{children:"One-Shots are still composed of a series with a single book, but are handled slightly differently."}),"\n",(0,t.jsx)(n.h2,{id:"one-shots-handling",children:"One-Shots handling"}),"\n",(0,t.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,t.jsxs)(n.p,{children:["You can enable One-Shots handling through ",(0,t.jsx)(n.a,{href:"/docs/guides/libraries#one-shots-directory",children:"Library options"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"processing",children:"Processing"}),"\n",(0,t.jsxs)(n.p,{children:["One-Shots are detected during the scan. Any directory for which the full path contains the configured ",(0,t.jsx)(n.em,{children:"One-Shots directory"})," will generate One-Shot series instead of standard Series."]}),"\n",(0,t.jsxs)(n.p,{children:["Given the following directory structure, with ",(0,t.jsx)(n.em,{children:"One-Shots directory"})," configured to ",(0,t.jsx)(n.code,{children:"_oneshots"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"/data/books/Comics\n\u251c\u2500\u2500 Space Adventures\n\u2502\xa0\xa0 \u251c\u2500\u2500 Space_Adventures_001.cbz\n\u2502\xa0\xa0 \u251c\u2500\u2500 Space_Adventures_002.cbz\n\u2502\xa0\xa0 \u251c\u2500\u2500 Space_Adventures_003.cbz\n\u2502\xa0\xa0 \u2514\u2500\u2500 _oneshots\n\u2502\xa0\xa0 \u2514\u2500\u2500 Pluto Adventures.cbz\n\u251c\u2500\u2500 Super Duck\n\u2502\xa0\xa0 \u251c\u2500\u2500 Super_Duck_001.cbz\n\u2502\xa0\xa0 \u251c\u2500\u2500 Super_Duck_002.cbz\n\u2502\xa0\xa0 \u2514\u2500\u2500 Super_Duck_003.cbz\n\u2514\u2500\u2500 _oneshots\n \u251c\u2500\u2500 A oneshot.cbz\n \u251c\u2500\u2500 Another oneshot.cbz\n \u2514\u2500\u2500 Yet another oneshot.cbz\n"})}),"\n",(0,t.jsx)(n.p,{children:"This will result in:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["2 regular series:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"Space Adventures"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"Super Duck"})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["4 One-Shots:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"Pluto Adventures"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"A oneshot"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"Another oneshot"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.em,{children:"Yet another oneshot"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.em,{children:"One-Shots directory"})," is checked against ",(0,t.jsx)(n.strong,{children:"any part of the directory path"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:"_oneshots"})," will match on:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"/data/books/Comics/_oneshots"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"/data/books/Comics/My weirdly named _oneshots"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["To match only directories starting with the provided string, prefix ",(0,t.jsx)(n.em,{children:"One-Shots directory"})," with ",(0,t.jsx)(n.code,{children:"/"}),", like ",(0,t.jsx)(n.code,{children:"/_oneshots"})]})}),"\n",(0,t.jsx)(n.h3,{id:"metadata",children:"Metadata"}),"\n",(0,t.jsx)(n.p,{children:"While the book metadata will be processed as usual, the series metadata for One-Shots will be handled slightly differently:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["the Mylar ",(0,t.jsx)(n.code,{children:"series.json"})," is ignored"]}),"\n",(0,t.jsx)(n.li,{children:"the local artwork is ignored. The one for the book is still processed as usual."}),"\n",(0,t.jsxs)(n.li,{children:["in addition, some metadata is set:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"the series title and summary are set from the one of the book"}),"\n",(0,t.jsxs)(n.li,{children:["the series status is set to ",(0,t.jsx)(n.em,{children:"Ended"})]}),"\n",(0,t.jsx)(n.li,{children:"the series total book count is set to 1"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"dashboard",children:"Dashboard"}),"\n",(0,t.jsx)(n.p,{children:"The Dashboard has specific handling for One-Shots:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"One-Shots are displayed in a new view that shows both series and book metadata fields"}),"\n",(0,t.jsxs)(n.li,{children:["when editing One-Shots metadata, a new dialog will allow to edit both book and series level metadata fields.","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"If you edit multiple items and all are One-Shots, this dialog is also used."}),"\n",(0,t.jsx)(n.li,{children:"If there is a mix of One-Shots and normal items (series or books), the regular dialog will be used instead.s"}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"One-Shots can be added to both collections and readlists"}),"\n",(0,t.jsxs)(n.li,{children:["One-Shots will not show in the ",(0,t.jsx)(n.em,{children:"Recently Added Series"})," or ",(0,t.jsx)(n.em,{children:"Recently Updated Series"})," sections, but they will show in ",(0,t.jsx)(n.em,{children:"Recently Added Books"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Item card in Series views (when browsing libraries or collections):","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"will show an unread indicator in the top-right corner, instead of the number of unread books"}),"\n",(0,t.jsxs)(n.li,{children:["will display ",(0,t.jsx)(n.em,{children:"One-shot"})," at the bottom of the card instead of the number of books"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:"Item card in Book views (when browsing readlists or recommended) will not display the Series name nor the book number"}),"\n",(0,t.jsxs)(n.li,{children:["the Series filter panel has a ",(0,t.jsx)(n.em,{children:"One-shot"})," filter"]}),"\n",(0,t.jsx)(n.li,{children:"One-Shots will not show in the Series picker dialog when importing books"}),"\n",(0,t.jsx)(n.li,{children:"One-Shots will show only as books in the search bar and detailed search view"}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"rest-api",children:"REST API"}),"\n",(0,t.jsxs)(n.p,{children:["One-Shots are still composed of a Series with a single Book, however both have a new ",(0,t.jsx)(n.code,{children:"boolean"})," attribute ",(0,t.jsx)(n.code,{children:"oneshot"})," which can be used in client applications to handle One-Shots differently."]})]})}function c(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},3023:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>l});var i=s(3696);const t={},o=i.createContext(t);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/24227623.11bfcfad.js b/assets/js/24227623.6819d97d.js
similarity index 98%
rename from assets/js/24227623.11bfcfad.js
rename to assets/js/24227623.6819d97d.js
index 2ada4398..66b6a71b 100644
--- a/assets/js/24227623.11bfcfad.js
+++ b/assets/js/24227623.6819d97d.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7311],{1378:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>t,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"guides/read-progress","title":"Read progress","description":"Komga can track which books you have read, and books that you are currently reading. Reading progress is tracked for each user separately.","source":"@site/docs/guides/read-progress.md","sourceDirName":"guides","slug":"/guides/read-progress","permalink":"/docs/guides/read-progress","draft":false,"unlisted":false,"editUrl":"https://github.com/gotson/komga-website/tree/master/docs/guides/read-progress.md","tags":[],"version":"current","lastUpdatedAt":1732520982000,"frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Server settings & management","permalink":"/docs/guides/server-settings"},"next":{"title":"Collections","permalink":"/docs/guides/collections"}}');var n=s(2540),i=s(3023);const o={},d="Read progress",t={},l=[{value:"Supported readers",id:"supported-readers",level:2},{value:"Webreader",id:"webreader",level:3},{value:"Mihon",id:"mihon",level:3},{value:"CDisplayEx",id:"cdisplayex",level:3},{value:"Unread and in progress indicators",id:"unread-and-in-progress-indicators",level:2},{value:"Marking progress manually",id:"marking-progress-manually",level:2}];function c(e){const r={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.header,{children:(0,n.jsx)(r.h1,{id:"read-progress",children:"Read progress"})}),"\n",(0,n.jsx)(r.p,{children:"Komga can track which books you have read, and books that you are currently reading. Reading progress is tracked for each user separately."}),"\n",(0,n.jsx)(r.h2,{id:"supported-readers",children:"Supported readers"}),"\n",(0,n.jsx)(r.h3,{id:"webreader",children:"Webreader"}),"\n",(0,n.jsx)(r.p,{children:"The webreader can track the progress as you read:"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"when you open a book that is in progress, the webreader will resume reading where you left it."}),"\n",(0,n.jsx)(r.li,{children:"when you finish reading a book, the webreader will mark it as read."}),"\n"]}),"\n",(0,n.jsx)(r.h3,{id:"mihon",children:"Mihon"}),"\n",(0,n.jsxs)(r.p,{children:["Mihon can track progress of read books, using the Komga tracker. See ",(0,n.jsx)(r.a,{href:"/docs/guides/mihon#track-read-progress",children:"here"})," for more details."]}),"\n",(0,n.jsx)(r.h3,{id:"cdisplayex",children:"CDisplayEx"}),"\n",(0,n.jsxs)(r.p,{children:["CDisplayEx syncs read status and reading progress, See ",(0,n.jsx)(r.a,{href:"/docs/guides/cdisplayex#reading-status",children:"here"}),"."]}),"\n",(0,n.jsx)(r.h2,{id:"unread-and-in-progress-indicators",children:"Unread and in progress indicators"}),"\n",(0,n.jsx)(r.p,{children:"The book card will display read progress indicators:"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"Unread books will display an orange tick in the top right corner:"}),"\n"]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/read-progress/book-card-unread.png",style:{maxHeight:"300px"},alt:"Book card showing unread indicator"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"In progress books will display a progress bar at the bottom of the thumbnail:"}),"\n"]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/read-progress/book-card-inprogress.png",style:{maxHeight:"300px"},alt:"Book card showing reading progress"}),"\n",(0,n.jsx)(r.p,{children:"In addition, the series card will display the number of unread books in the top right corner:"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/read-progress/series-card-unread-count.png",style:{maxHeight:"300px"},alt:"Series card showing unread count of books"}),"\n",(0,n.jsx)(r.h2,{id:"marking-progress-manually",children:"Marking progress manually"}),"\n",(0,n.jsxs)(r.p,{children:["You can mark books or series as read or unread manually. Look for the action menu icon ",(0,n.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.jsx)(r.em,{children:"Mark as read"})," or ",(0,n.jsx)(r.em,{children:"Mark as unread"}),"."]})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},3023:(e,r,s)=>{s.d(r,{R:()=>o,x:()=>d});var a=s(3696);const n={},i=a.createContext(n);function o(e){const r=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),a.createElement(i.Provider,{value:r},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7311],{1378:(e,r,s)=>{s.r(r),s.d(r,{assets:()=>t,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"guides/read-progress","title":"Read progress","description":"Komga can track which books you have read, and books that you are currently reading. Reading progress is tracked for each user separately.","source":"@site/docs/guides/read-progress.md","sourceDirName":"guides","slug":"/guides/read-progress","permalink":"/docs/guides/read-progress","draft":false,"unlisted":false,"editUrl":"https://github.com/gotson/komga-website/tree/master/docs/guides/read-progress.md","tags":[],"version":"current","lastUpdatedAt":1733190983000,"frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Server settings & management","permalink":"/docs/guides/server-settings"},"next":{"title":"Collections","permalink":"/docs/guides/collections"}}');var n=s(2540),i=s(3023);const o={},d="Read progress",t={},l=[{value:"Supported readers",id:"supported-readers",level:2},{value:"Webreader",id:"webreader",level:3},{value:"Mihon",id:"mihon",level:3},{value:"CDisplayEx",id:"cdisplayex",level:3},{value:"Unread and in progress indicators",id:"unread-and-in-progress-indicators",level:2},{value:"Marking progress manually",id:"marking-progress-manually",level:2}];function c(e){const r={a:"a",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.header,{children:(0,n.jsx)(r.h1,{id:"read-progress",children:"Read progress"})}),"\n",(0,n.jsx)(r.p,{children:"Komga can track which books you have read, and books that you are currently reading. Reading progress is tracked for each user separately."}),"\n",(0,n.jsx)(r.h2,{id:"supported-readers",children:"Supported readers"}),"\n",(0,n.jsx)(r.h3,{id:"webreader",children:"Webreader"}),"\n",(0,n.jsx)(r.p,{children:"The webreader can track the progress as you read:"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"when you open a book that is in progress, the webreader will resume reading where you left it."}),"\n",(0,n.jsx)(r.li,{children:"when you finish reading a book, the webreader will mark it as read."}),"\n"]}),"\n",(0,n.jsx)(r.h3,{id:"mihon",children:"Mihon"}),"\n",(0,n.jsxs)(r.p,{children:["Mihon can track progress of read books, using the Komga tracker. See ",(0,n.jsx)(r.a,{href:"/docs/guides/mihon#track-read-progress",children:"here"})," for more details."]}),"\n",(0,n.jsx)(r.h3,{id:"cdisplayex",children:"CDisplayEx"}),"\n",(0,n.jsxs)(r.p,{children:["CDisplayEx syncs read status and reading progress, See ",(0,n.jsx)(r.a,{href:"/docs/guides/cdisplayex#reading-status",children:"here"}),"."]}),"\n",(0,n.jsx)(r.h2,{id:"unread-and-in-progress-indicators",children:"Unread and in progress indicators"}),"\n",(0,n.jsx)(r.p,{children:"The book card will display read progress indicators:"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"Unread books will display an orange tick in the top right corner:"}),"\n"]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/read-progress/book-card-unread.png",style:{maxHeight:"300px"},alt:"Book card showing unread indicator"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsx)(r.li,{children:"In progress books will display a progress bar at the bottom of the thumbnail:"}),"\n"]}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/read-progress/book-card-inprogress.png",style:{maxHeight:"300px"},alt:"Book card showing reading progress"}),"\n",(0,n.jsx)(r.p,{children:"In addition, the series card will display the number of unread books in the top right corner:"}),"\n",(0,n.jsx)("img",{src:"/assets/media/guides/read-progress/series-card-unread-count.png",style:{maxHeight:"300px"},alt:"Series card showing unread count of books"}),"\n",(0,n.jsx)(r.h2,{id:"marking-progress-manually",children:"Marking progress manually"}),"\n",(0,n.jsxs)(r.p,{children:["You can mark books or series as read or unread manually. Look for the action menu icon ",(0,n.jsx)("img",{src:"/assets/media/guides/action-menu-icon.png",style:{verticalAlign:"middle",maxHeight:"32px"}})," and click on ",(0,n.jsx)(r.em,{children:"Mark as read"})," or ",(0,n.jsx)(r.em,{children:"Mark as unread"}),"."]})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},3023:(e,r,s)=>{s.d(r,{R:()=>o,x:()=>d});var a=s(3696);const n={},i=a.createContext(n);function o(e){const r=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),a.createElement(i.Provider,{value:r},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/2b8f2de1.992f3d9e.js b/assets/js/2b8f2de1.d0e36786.js
similarity index 99%
rename from assets/js/2b8f2de1.992f3d9e.js
rename to assets/js/2b8f2de1.d0e36786.js
index 8fb9b77d..f7b39e63 100644
--- a/assets/js/2b8f2de1.992f3d9e.js
+++ b/assets/js/2b8f2de1.d0e36786.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7769],{9845:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"guides/opds","title":"Read with any OPDS reader","description":"Komga should work with any OPDS reader, whether they use OPDS v1 or v2.","source":"@site/docs/guides/opds.md","sourceDirName":"guides","slug":"/guides/opds","permalink":"/docs/guides/opds","draft":false,"unlisted":false,"editUrl":"https://github.com/gotson/komga-website/tree/master/docs/guides/opds.md","tags":[],"version":"current","lastUpdatedAt":1732520982000,"frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Read with CDisplayEx","permalink":"/docs/guides/cdisplayex"},"next":{"title":"Read with Panels on iOS","permalink":"/docs/guides/panels"}}');var n=r(2540),d=r(3023);const i={},l="Read with any OPDS reader",o={},c=[{value:"OPDS v2",id:"opds-v2",level:2},{value:"OPDS v1",id:"opds-v1",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"read-with-any-opds-reader",children:"Read with any OPDS reader"})}),"\n",(0,n.jsx)(t.p,{children:"Komga should work with any OPDS reader, whether they use OPDS v1 or v2."}),"\n",(0,n.jsx)(t.h2,{id:"opds-v2",children:"OPDS v2"}),"\n",(0,n.jsx)(t.p,{children:"You will need to configure the following URL in your OPDS reader:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"http(s)://your-server(:25600)(/baseUrl)/opds/v2/catalog\n"})}),"\n",(0,n.jsx)(t.p,{children:"Here is a list of reader applications that have been tested:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"OS"}),(0,n.jsx)(t.th,{children:"App name"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Status"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Sync read progress"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Streaming"})]})}),(0,n.jsx)(t.tbody,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Android / iOS"}),(0,n.jsxs)(t.td,{children:["Cantook by Aldiko (",(0,n.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.aldiko.android",children:"Android"}),", ",(0,n.jsx)(t.a,{href:"https://apps.apple.com/us/app/cantook-by-aldiko/id1476410111",children:"iOS"}),")"]}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Covers are not showing properly"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Yes"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]})})]}),"\n",(0,n.jsx)(t.h2,{id:"opds-v1",children:"OPDS v1"}),"\n",(0,n.jsx)(t.p,{children:"You will need to configure the following URL in your OPDS reader:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"http(s)://your-server(:25600)(/baseUrl)/opds/v1.2/catalog\n"})}),"\n",(0,n.jsx)(t.p,{children:"Here is a list of reader applications that have been tested:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"OS"}),(0,n.jsx)(t.th,{children:"App name"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Status"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"OpenSearch support"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Page streaming support"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Android"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=org.geometerplus.zlibrary.ui.android",children:"FBReader: Favorite Book Reader"})}),(0,n.jsxs)(t.td,{style:{textAlign:"center"},children:["\u274c"," Can't download CBR/CBZ, only PDF. PDF only supported in Premium version. Does not remember password."]}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Android"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.flyersoft.moonreader",children:"Moon+ Reader"})}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Android"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.foobnix.pdf.reader",children:"Librera"})}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Android"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.obreey.reader",children:"PocketBook"})}),(0,n.jsxs)(t.td,{style:{textAlign:"center"},children:["\u274c"," Doesn't show CBR/CBZ"]}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"iOS"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"http://kybook-reader.com/",children:"KyBook 3"})}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:(0,n.jsx)(t.strong,{children:"Yes"})}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"iOS"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://panels.app/",children:"Panels"})}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,n.jsxs)(t.td,{style:{textAlign:"center"},children:[(0,n.jsx)(t.strong,{children:"Yes"})," ",(0,n.jsx)("br",{}),"(v3.0.0+)"]}),(0,n.jsxs)(t.td,{style:{textAlign:"center"},children:[(0,n.jsx)(t.strong,{children:"OPDS PSE 1.0"})," (v2.8.0+)",(0,n.jsx)("br",{}),(0,n.jsx)(t.strong,{children:"OPDS PSE 1.1"})," (v2.9.7+)"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"iPadOS"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://apps.apple.com/us/app/chunky-comic-reader/id663567628",children:"Chunky Comic Reader"})}),(0,n.jsxs)(t.td,{style:{textAlign:"center"},children:["\u274c"," Does not work anymore with Komga 1.4.0+"]}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:(0,n.jsx)(t.strong,{children:"OPDS PSE 1.0"})})]})]})]}),"\n",(0,n.jsx)(t.p,{children:"The OPDS v1 feed also supports:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["OpenSearch functionality, to search by ",(0,n.jsx)(t.code,{children:"Series"})]}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://anansi-project.github.io/docs/opds-pse/intro",children:"OPDS Page Streaming Extension 1.2"})}),"\n"]})]})}function a(e={}){const{wrapper:t}={...(0,d.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},3023:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>l});var s=r(3696);const n={},d=s.createContext(n);function i(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7769],{9845:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"guides/opds","title":"Read with any OPDS reader","description":"Komga should work with any OPDS reader, whether they use OPDS v1 or v2.","source":"@site/docs/guides/opds.md","sourceDirName":"guides","slug":"/guides/opds","permalink":"/docs/guides/opds","draft":false,"unlisted":false,"editUrl":"https://github.com/gotson/komga-website/tree/master/docs/guides/opds.md","tags":[],"version":"current","lastUpdatedAt":1733190983000,"frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Read with CDisplayEx","permalink":"/docs/guides/cdisplayex"},"next":{"title":"Read with Panels on iOS","permalink":"/docs/guides/panels"}}');var n=r(2540),d=r(3023);const i={},l="Read with any OPDS reader",o={},c=[{value:"OPDS v2",id:"opds-v2",level:2},{value:"OPDS v1",id:"opds-v1",level:2}];function h(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"read-with-any-opds-reader",children:"Read with any OPDS reader"})}),"\n",(0,n.jsx)(t.p,{children:"Komga should work with any OPDS reader, whether they use OPDS v1 or v2."}),"\n",(0,n.jsx)(t.h2,{id:"opds-v2",children:"OPDS v2"}),"\n",(0,n.jsx)(t.p,{children:"You will need to configure the following URL in your OPDS reader:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"http(s)://your-server(:25600)(/baseUrl)/opds/v2/catalog\n"})}),"\n",(0,n.jsx)(t.p,{children:"Here is a list of reader applications that have been tested:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"OS"}),(0,n.jsx)(t.th,{children:"App name"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Status"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Sync read progress"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Streaming"})]})}),(0,n.jsx)(t.tbody,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Android / iOS"}),(0,n.jsxs)(t.td,{children:["Cantook by Aldiko (",(0,n.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.aldiko.android",children:"Android"}),", ",(0,n.jsx)(t.a,{href:"https://apps.apple.com/us/app/cantook-by-aldiko/id1476410111",children:"iOS"}),")"]}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Covers are not showing properly"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"Yes"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]})})]}),"\n",(0,n.jsx)(t.h2,{id:"opds-v1",children:"OPDS v1"}),"\n",(0,n.jsx)(t.p,{children:"You will need to configure the following URL in your OPDS reader:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"http(s)://your-server(:25600)(/baseUrl)/opds/v1.2/catalog\n"})}),"\n",(0,n.jsx)(t.p,{children:"Here is a list of reader applications that have been tested:"}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"OS"}),(0,n.jsx)(t.th,{children:"App name"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Status"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"OpenSearch support"}),(0,n.jsx)(t.th,{style:{textAlign:"center"},children:"Page streaming support"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Android"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=org.geometerplus.zlibrary.ui.android",children:"FBReader: Favorite Book Reader"})}),(0,n.jsxs)(t.td,{style:{textAlign:"center"},children:["\u274c"," Can't download CBR/CBZ, only PDF. PDF only supported in Premium version. Does not remember password."]}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Android"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.flyersoft.moonreader",children:"Moon+ Reader"})}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Android"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.foobnix.pdf.reader",children:"Librera"})}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"Android"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://play.google.com/store/apps/details?id=com.obreey.reader",children:"PocketBook"})}),(0,n.jsxs)(t.td,{style:{textAlign:"center"},children:["\u274c"," Doesn't show CBR/CBZ"]}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"iOS"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"http://kybook-reader.com/",children:"KyBook 3"})}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:(0,n.jsx)(t.strong,{children:"Yes"})}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"iOS"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://panels.app/",children:"Panels"})}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"\u2714\ufe0f"}),(0,n.jsxs)(t.td,{style:{textAlign:"center"},children:[(0,n.jsx)(t.strong,{children:"Yes"})," ",(0,n.jsx)("br",{}),"(v3.0.0+)"]}),(0,n.jsxs)(t.td,{style:{textAlign:"center"},children:[(0,n.jsx)(t.strong,{children:"OPDS PSE 1.0"})," (v2.8.0+)",(0,n.jsx)("br",{}),(0,n.jsx)(t.strong,{children:"OPDS PSE 1.1"})," (v2.9.7+)"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"iPadOS"}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://apps.apple.com/us/app/chunky-comic-reader/id663567628",children:"Chunky Comic Reader"})}),(0,n.jsxs)(t.td,{style:{textAlign:"center"},children:["\u274c"," Does not work anymore with Komga 1.4.0+"]}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:"No"}),(0,n.jsx)(t.td,{style:{textAlign:"center"},children:(0,n.jsx)(t.strong,{children:"OPDS PSE 1.0"})})]})]})]}),"\n",(0,n.jsx)(t.p,{children:"The OPDS v1 feed also supports:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:["OpenSearch functionality, to search by ",(0,n.jsx)(t.code,{children:"Series"})]}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"https://anansi-project.github.io/docs/opds-pse/intro",children:"OPDS Page Streaming Extension 1.2"})}),"\n"]})]})}function a(e={}){const{wrapper:t}={...(0,d.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},3023:(e,t,r)=>{r.d(t,{R:()=>i,x:()=>l});var s=r(3696);const n={},d=s.createContext(n);function i(e){const t=s.useContext(d);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(d.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/33e67961.911e3759.js b/assets/js/33e67961.eee49cfa.js
similarity index 99%
rename from assets/js/33e67961.911e3759.js
rename to assets/js/33e67961.eee49cfa.js
index 26122dc4..d817b38a 100644
--- a/assets/js/33e67961.911e3759.js
+++ b/assets/js/33e67961.eee49cfa.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[2579],{9416:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"guides/kobo","title":"Read with Kobo","description":"The Kobo integration is based on the native Kobo Sync capability, where your Kobo eReader will sync to a Komga server instead of the official Kobo servers.","source":"@site/docs/guides/kobo.md","sourceDirName":"guides","slug":"/guides/kobo","permalink":"/docs/guides/kobo","draft":false,"unlisted":false,"editUrl":"https://github.com/gotson/komga-website/tree/master/docs/guides/kobo.md","tags":[],"version":"current","lastUpdatedAt":1732520982000,"frontMatter":{},"sidebar":"docsSidebar","previous":{"title":"Read with Mihon","permalink":"/docs/guides/mihon"},"next":{"title":"Read with Paperback","permalink":"/docs/guides/paperback"}}');var r=n(2540),s=n(3023);const t={},a="Read with Kobo",l={},d=[{value:"Features supported and limitations",id:"features-supported-and-limitations",level:2},{value:"Configuration",id:"configuration",level:2},{value:"Generate API key",id:"generate-api-key",level:3},{value:"Kepubify",id:"kepubify",level:3},{value:"Setup Kobo",id:"setup-kobo",level:3},{value:"Force external port",id:"force-external-port",level:3},{value:"Migrating from Calibre-Web",id:"migrating-from-calibre-web",level:2},{value:"Privacy and Security",id:"privacy-and-security",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Force Kobo Sync",id:"force-kobo-sync",level:3},{value:"Access Kobo eReader logs",id:"access-kobo-ereader-logs",level:3},{value:"Komga logs",id:"komga-logs",level:3}];function c(e){const o={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.header,{children:(0,r.jsx)(o.h1,{id:"read-with-kobo",children:"Read with Kobo"})}),"\n",(0,r.jsx)(o.p,{children:"The Kobo integration is based on the native Kobo Sync capability, where your Kobo eReader will sync to a Komga server instead of the official Kobo servers."}),"\n",(0,r.jsx)(o.h2,{id:"features-supported-and-limitations",children:"Features supported and limitations"}),"\n",(0,r.jsx)(o.p,{children:"This is what is currently supported:"}),"\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsxs)(o.li,{children:["Only ",(0,r.jsx)(o.strong,{children:"EPUB"})," books from all libraries, along with their metadata and cover image, will be synced."]}),"\n",(0,r.jsx)(o.li,{children:"When books metadata or cover is edited in Komga, they will be updated on the Kobo eReader."}),"\n",(0,r.jsx)(o.li,{children:"When books are deleted in Komga, they will be deleted on the Kobo eReader."}),"\n",(0,r.jsx)(o.li,{children:"Read progress is synced both ways"}),"\n",(0,r.jsxs)(o.li,{children:["EPUB books will be converted to KEPUB on-the-fly when downloaded by the Kobo, if Kepubify is configured and available (see ",(0,r.jsx)(o.a,{href:"#kepubify",children:"Kepubify"}),")"]}),"\n",(0,r.jsxs)(o.li,{children:["If Kobo proxying is enabled in ",(0,r.jsx)(o.em,{children:"Server Settings"}),", Komga will relay requests to the official Kobo servers, and return both the Komga content and Kobo content to the Kobo eReader. This can be useful if you have official Kobo purchases."]}),"\n"]}),"\n",(0,r.jsx)(o.p,{children:"Read progress syncs in the following way:"}),"\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsx)(o.li,{children:"For pre-paginated books, the read progress will be accurate per page."}),"\n",(0,r.jsx)(o.li,{children:"For regular EPUB books, Kobo can only keep track of read progress at the beginning of a chapter, not within a chapter. Mid-chapter read progress will be lost when switching from Kobo to Komga or Komga to Kobo. This is a Kobo limitation."}),"\n",(0,r.jsx)(o.li,{children:"For Kobo EPUB (KEPUB) books, Kobo uses its own mechanism to track progress. Komga does its best to map the Kobo specific read progress to Komga, but it may be off by a few pages."}),"\n"]}),"\n",(0,r.jsx)(o.h2,{id:"configuration",children:"Configuration"}),"\n",(0,r.jsxs)(o.p,{children:["In order to use Kobo Sync with Komga, a Komga user must have the roles ",(0,r.jsx)(o.code,{children:"KOBO_SYNC"})," and ",(0,r.jsx)(o.code,{children:"FILE_DOWNLOAD"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:["Proxying of unknown requests to the official Kobo servers can be enabled in ",(0,r.jsx)(o.em,{children:"Server Settings"}),". This is enabled globally for all users on the server."]}),"\n",(0,r.jsx)(o.h3,{id:"generate-api-key",children:"Generate API key"}),"\n",(0,r.jsxs)(o.p,{children:["The Kobo Sync Komga API uses a dedicated set of endpoints which require an API key to be accessed. Users can generate API keys from the ",(0,r.jsx)(o.em,{children:"Account Settings"})," page. Make sure to write down the generated key, as it won't be shown afterwards."]}),"\n",(0,r.jsx)(o.p,{children:"If you have multiple Kobo devices, it is recommended to use a different API key for each."}),"\n",(0,r.jsx)(o.h3,{id:"kepubify",children:"Kepubify"}),"\n",(0,r.jsxs)(o.p,{children:["Komga uses ",(0,r.jsx)(o.a,{href:"https://pgaskin.net/kepubify/",children:"Kepubify"})," to automatically convert EPUB books to KEPUB when the Kobo requests a file."]}),"\n",(0,r.jsx)(o.p,{children:"Kepubify is bundled on the following distributions:"}),"\n",(0,r.jsxs)(o.ul,{children:["\n",(0,r.jsx)(o.li,{children:"Windows app"}),"\n",(0,r.jsx)(o.li,{children:"macOS app"}),"\n",(0,r.jsx)(o.li,{children:"Docker amd64"}),"\n",(0,r.jsx)(o.li,{children:"Docker arm64"}),"\n",(0,r.jsx)(o.li,{children:"Docker arm"}),"\n"]}),"\n",(0,r.jsxs)(o.p,{children:["When using the ",(0,r.jsx)(o.code,{children:"jar"}),", you will need to configure the path to ",(0,r.jsx)(o.code,{children:"kepubify"})," or ",(0,r.jsx)(o.code,{children:"kepubify.exe"})," from the ",(0,r.jsx)(o.em,{children:"Server Settings"}),"."]}),"\n",(0,r.jsx)(o.h3,{id:"setup-kobo",children:"Setup Kobo"}),"\n",(0,r.jsxs)(o.p,{children:["Connect your Kobo eReader to your computer and open the ",(0,r.jsx)(o.code,{children:".kobo/Kobo/Kobo eReader.conf"})," file (you may need to display hidden files on Mac/Linux)."]}),"\n",(0,r.jsx)(o.p,{children:"The file should contain the following line (among others):"}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"api_endpoint=https://storeapi.kobo.com\n"})}),"\n",(0,r.jsxs)(o.p,{children:["If the line does not exist, it must be created under the ",(0,r.jsx)(o.code,{children:"[OneStoreServices]"})," group."]}),"\n",(0,r.jsx)(o.p,{children:"You will need to replace this line with your external server address, in the following form:"}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:"api_endpoint=https://<directory>
",id:"komga_configdir--komgaconfig-dir-directory",level:4},{value:"SERVER_PORT / server.port: <port>
",id:"server_port--serverport-port",level:4},{value:"SERVER_SERVLET_CONTEXT_PATH / server.servlet.context-path: <baseUrl>
",id:"server_servlet_context_path--serverservletcontext-path-baseurl",level:4},{value:"SERVER_SERVLET_SESSION_TIMEOUT / server.servlet.session.timeout: <duration>
",id:"server_servlet_session_timeout--serverservletsessiontimeout-duration",level:4},{value:"KOMGA_DATABASE_FILE / komga.database.file: <file path>
",id:"komga_database_file--komgadatabasefile-file-path",level:4},{value:"KOMGA_CORS_ALLOWED_ORIGINS / komga.cors.allowed-origins: <origins>
",id:"komga_cors_allowed_origins--komgacorsallowed-origins-origins",level:4},{value:"KOMGA_OAUTH2_ACCOUNT_CREATION / komga.oauth2-account-creation: <true/false>
",id:"komga_oauth2_account_creation--komgaoauth2-account-creation-truefalse",level:4},{value:"KOMGA_OIDC_EMAIL_VERIFICATION / komga.oidc-email-verification: <true/false>
",id:"komga_oidc_email_verification--komgaoidc-email-verification-truefalse",level:4},{value:"LOGGING_FILE_NAME / logging.file.name: <logfile name>
",id:"logging_file_name--loggingfilename-logfile-name",level:4},{value:"Sample Configuration File",id:"sample-configuration-file",level:2},{value:"Database performance",id:"database-performance",level:2}];function d(e){const i={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.header,{children:(0,r.jsx)(i.h1,{id:"configuration-options",children:"Configuration options"})}),"\n",(0,r.jsxs)(i.admonition,{type:"tip",children:[(0,r.jsx)(i.p,{children:"Komga has sensible default values for all configuration keys. You only need to configure it if you want to change the default behaviour."}),(0,r.jsxs)(i.p,{children:["The ",(0,r.jsx)(i.code,{children:"application.yml"})," file does not exist by default, you need to create one if you want to customize the configuration."]})]}),"\n",(0,r.jsxs)(i.p,{children:["Komga relies heavily on ",(0,r.jsx)(i.a,{href:"https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html",children:"Spring Boot's configuration"}),", leveraging ",(0,r.jsx)(i.code,{children:"profiles"})," and configuration ",(0,r.jsx)(i.code,{children:"properties"}),"."]}),"\n",(0,r.jsxs)(i.p,{children:["The easiest way to configure is either via environment variables (a good fit for ",(0,r.jsx)(i.code,{children:"docker"})," and ",(0,r.jsx)(i.code,{children:"docker-compose"}),") or by using an ",(0,r.jsx)(i.code,{children:"application.yml"})," file located in the configuration directory:"]}),"\n",(0,r.jsxs)(i.ul,{children:["\n",(0,r.jsxs)(i.li,{children:["The Docker image will load any ",(0,r.jsx)(i.code,{children:"application.yml"})," file located in the ",(0,r.jsx)(i.code,{children:"/config"})," mounted folder."]}),"\n",(0,r.jsxs)(i.li,{children:["The Jar will load any ",(0,r.jsx)(i.code,{children:"application.yml"})," file located in the ",(0,r.jsx)(i.code,{children:"komga.config-dir"})," directory (defaults to ",(0,r.jsx)(i.code,{children:"~/.komga"}),", ",(0,r.jsx)(i.a,{href:"#komga_configdir--komgaconfig-dir-directory",children:"more details"}),")."]}),"\n"]}),"\n",(0,r.jsxs)(i.p,{children:["Each configuration key can have a different format depending if it's from the environment variable, or from the ",(0,r.jsx)(i.code,{children:"application.yml"})," file. In the following section I will provide both format in the form ",(0,r.jsx)(i.code,{children:"ENVIRONMENT_VARIABLE"})," / ",(0,r.jsx)(i.code,{children:"application-property"}),"."]}),"\n",(0,r.jsxs)(i.p,{children:["You can also specify configuration via the command line, when launching the ",(0,r.jsx)(i.code,{children:"jar"}),". Use the ",(0,r.jsx)(i.code,{children:"application-property"})," form, and prefix with ",(0,r.jsx)(i.code,{children:"--"}),". For example:"]}),"\n",(0,r.jsx)(i.pre,{children:(0,r.jsx)(i.code,{className:"language-shell",children:'java -jar komga.jar --server.servlet.context-path="/komga" --server.port=8443\n'})}),"\n",(0,r.jsx)(i.h2,{id:"optional-configuration",children:"Optional configuration"}),"\n",(0,r.jsx)(i.p,{children:"You can use some optional configuration keys:"}),"\n",(0,r.jsxs)(i.h4,{id:"komga_configdir--komgaconfig-dir-directory",children:["KOMGA_CONFIGDIR / komga.config-dir: ",(0,r.jsx)(i.code,{children:"<directory>
",id:"komga_configdir--komgaconfig-dir-directory",level:4},{value:"SERVER_PORT / server.port: <port>
",id:"server_port--serverport-port",level:4},{value:"SERVER_SERVLET_CONTEXT_PATH / server.servlet.context-path: <baseUrl>
",id:"server_servlet_context_path--serverservletcontext-path-baseurl",level:4},{value:"SERVER_SERVLET_SESSION_TIMEOUT / server.servlet.session.timeout: <duration>
",id:"server_servlet_session_timeout--serverservletsessiontimeout-duration",level:4},{value:"<cron>
<true/false>
<exclusions>
<key>
<duration>
<duration>
<file path>
",id:"komga_database_file--komgadatabasefile-file-path",level:4},{value:"KOMGA_CORS_ALLOWED_ORIGINS / komga.cors.allowed-origins: <origins>
",id:"komga_cors_allowed_origins--komgacorsallowed-origins-origins",level:4},{value:"<true/false>
<true/false>
<true/false>
",id:"komga_oauth2_account_creation--komgaoauth2-account-creation-truefalse",level:4},{value:"KOMGA_OIDC_EMAIL_VERIFICATION / komga.oidc-email-verification: <true/false>
",id:"komga_oidc_email_verification--komgaoidc-email-verification-truefalse",level:4},{value:"LOGGING_FILE_NAME / logging.file.name: <logfile name>
",id:"logging_file_name--loggingfilename-logfile-name",level:4},{value:"<int>
<int>