Kavita is a fast, open-source reading server for manga, comics (CBZ/CBR/CB7), ebooks (EPUB, PDF) and light novels. It scans your folders, groups files into series and volumes, and gives you a polished web reader with progress tracking, collections, reading lists and multiple users. It’s lightweight enough for a small VPS.
Ebook-focused alternative: Calibre-Web.
Requirements
- 1 vCPU and 1 GB RAM for a personal library. Scanning large libraries and generating covers uses more CPU briefly.
- Disk for your files. Comics are large (20–200 MB per volume). See storage VPS.
Install with Docker
# /opt/kavita/compose.yaml
services:
kavita:
image: jvmilazz0/kavita:latest
restart: unless-stopped
environment:
TZ: Etc/UTC
volumes:
- ./config:/kavita/config
- /srv/library/manga:/manga
- /srv/library/comics:/comics
- /srv/library/books:/books
ports:
- "127.0.0.1:5000:5000"
cd /opt/kavita && docker compose up -d
Open the site, and create the admin account on the first visit. Do this right away.
Organise files so Kavita understands them
Kavita relies on folder and file names. Use one folder per series:
/manga/
One Example Series/
One Example Series Vol. 01.cbz
One Example Series Vol. 02.cbz
One Example Series Ch. 015.cbz
/books/
Author Name/
Book Title.epub
- Put volume and chapter numbers in the file names (
Vol. 01,Ch. 015). - Embedded metadata (
ComicInfo.xmlin comics, EPUB metadata) improves titles, authors and genres. - Tools like Komga’s naming guides, Mylar or Tachiyomi/Mihon exports help keep things tidy.
Upload files with rsync or SFTP. See rsync and SFTPGo.
Libraries
Server Settings → Libraries → Add library: choose the type (Manga, Comic, Book, Light Novel) and the folder. The type changes parsing rules and the reader behaviour. Kavita scans automatically when folders change, and you can trigger a scan manually after big uploads.
Users and permissions
- Invite users by email or create them directly, and give each access to specific libraries.
- Age rating restrictions per user (based on metadata) for shared family servers.
- Users get their own progress, want-to-read list, collections and reading lists.
Reading
- The web reader supports manga mode (right-to-left), webtoon (vertical scroll), double-page spreads, and an EPUB reader with font and theme settings.
- OPDS feeds (per user, with an API key in the URL) work in Panels, Chunky, KOReader and other apps. Treat the OPDS URL as a password.
- KOReader can sync progress with Kavita.
HTTPS with Nginx
server {
server_name read.example.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# listen 443 ssl; certbot --nginx -d read.example.com
}
Kavita uses SignalR (WebSockets) for live updates. See Nginx WebSocket proxy.
Performance tips
- Keep the
configfolder (database, covers cache) on fast SSD storage. - Prefer CBZ over CBR (ZIP is faster to read than RAR).
- WebP or AVIF images inside archives cut size and bandwidth a lot.
Content and legality
Host only content you have the right to store and share. Keep the server private (accounts only), and don’t run a public library of copyrighted content. That leads to abuse complaints. See the legal policies.
Backups and updates
- Back up
./config(database, settings, user progress). Your library files should have their own backup. See backup strategy. - Update with
docker compose pull && docker compose up -d. See updating self-hosted apps.
Quick reference
| Item | Value |
|---|---|
| Port | 5000 |
| Config/database | /kavita/config |
| Library types | Manga, Comic, Book, Light Novel |
| Naming | one folder per series; Vol. NN, Ch. NNN |
| OPDS | per-user URL with API key |