https://github.com/aha-hyeong/kumiho
kumiho is self-hosting web media server.
https://github.com/aha-hyeong/kumiho
comics docker ebook epub library manga novel pdf self-hosted txt webtoon
Last synced: 3 months ago
JSON representation
kumiho is self-hosting web media server.
- Host: GitHub
- URL: https://github.com/aha-hyeong/kumiho
- Owner: aha-hyeong
- License: apache-2.0
- Created: 2026-01-13T09:37:10.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2026-03-26T14:49:43.000Z (4 months ago)
- Last Synced: 2026-03-26T15:42:47.706Z (4 months ago)
- Topics: comics, docker, ebook, epub, library, manga, novel, pdf, self-hosted, txt, webtoon
- Language: TypeScript
- Homepage:
- Size: 84.4 MB
- Stars: 69
- Watchers: 0
- Forks: 1
- Open Issues: 18
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
#
Kumiho
[](https://discord.gg/KYaWSCUNQt)





**Ultra-lightweight, High-performance, Self-hosted Web Media Server**

---
π **Language**: English | [ζ₯ζ¬θͺ](README.ja.md) | [νκ΅μ΄](README.ko.md)
---
> [!IMPORTANT]
>
> **v0.15.0 Library Rescan Notice**: The recursive leaf-series scanner changes how nested folders are interpreted. After updating, a library rescan is required, and existing reading progress or metadata links are not guaranteed to carry over for libraries whose series layout is rebuilt.
>
> **v0.14.0 Plugin Secret Key**
> A `PLUGIN_SECRET_KEY` environment variable has been added to encrypt plugin credentials (API keys, tokens, etc.).
>
> If not set, a key is auto-generated and saved to `data/.plugin_secret_key`. The server will start without any configuration, but **without the original generated key file, stored plugin credentials cannot be decrypted**. For reliable operation, it is recommended to set `PLUGIN_SECRET_KEY` explicitly in your environment.
>
> **v0.10.x Docker update**: Docker base images were changed for CGO/native-library compatibility. Please re-pull the image and recreate the container when updating.
>
> **v0.9.0 Security Enhancement & Breaking Change**
> For improved security, the container execution privilege has been changed from `root` to a standard user (`appuser`).
>
> **Note for existing users**: If thumbnails are broken or you encounter "Permission Denied" errors, please ensure you set the `PUID` and `PGID` environment variables to match your account IDs (check with the `id` command in your terminal).
---
## πΊπΈ What is Kumiho?
**Kumiho** is a self-hosted web media server designed to manage and stream your personal collection of comics and e-books.
It was originally developed by a developer for personal convenience, after feeling limitations with existing solutions. Written in **Golang**, Kumiho is lightweight and fast.
### β¨ Key Features
| Feature | Description |
| :--------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------- |
| **π Blazing Fast** | Built with Golang, Kumiho runs as a native binary without JVM overhead, offering incredible scan speeds. |
| **π Recursive Leaf Discovery** | It recursively scans nested folders and collects actual readable leaf series without requiring complex metadata matching. |
| **β‘ Lightweight** | Optimized for low-resource environments. It runs smoothly with minimal memory footprint. |
| **π± Responsive Viewer** | Provides a seamless streaming experience on PC, Tablet, and Mobile devices. Supports 'Webtoon' scrolling mode. |
| **π§ Audiobook Support** | Supports audiobook libraries with chapter list, resume playback, progress tracking, bookmarks, and sleep timer. |
| **π΅ Immersive BGM** | Automatically plays audio files (`.mp3`) within the series folder when the filename matches. |
### Supported Formats
| Category | Supported Extensions |
| :----------- | :--------------------------------------------------------------------------------------- |
| **Images** | `.jpg`, `.jpeg`, `.png`, `.webp`, `.gif`, `.bmp` |
| **Archives** | `.zip`, `.cbz` |
| **E-books** | `.epub`, `.pdf`, `.txt` |
| **Audio** | `.mp3`, `.wav`, `.ogg`, `.oga`, `.flac`, `.m4a`, `.m4b`, `.aac`, `.wma`, `.opus`, `.mp4` |
> π **Folder Structure**: Automatically recognizes image files in folders or archive files and organizes them into volumes/chapters.
#### π Coming Soon
| Category | Planned Extensions |
| :----------- | :---------------------------- |
| **Archives** | `.cbr`, `.rar`, `.cb7`, `.7z` |
- Support `comicInfo.xml`
- Metadata management interaction
- OPDS Support
- Mobile viewer application support
### π Recommended Library Structure
#### 1) Series folder with volume/chapter files directly
```text
/books
βββ My Series
βββ 001.zip
βββ 002.pdf
βββ 003.epub
```
#### 2) Series folder with chapter/volume subfolders
```text
/books
βββ My Series
βββ Chapter 01
β βββ 001.zip
β βββ 002.zip
βββ Chapter 02
β βββ 001.pdf
βββ Chapter 03
βββ 001.epub
```
#### 3) Nested Folders (Infinite Hierarchy)
Kumiho supports **infinite folder hierarchy** through recursive leaf discovery. You can organize your files with any level of subfolders, and Kumiho will scan down to the actual readable leaf series.
```text
/books
βββ Grand Parent Category
βββ Parent Category
βββ My Series
βββ Volume 01
β βββ Chapter 01
β β βββ 001.zip
β βββ Chapter 02.pdf
βββ 002.epub
```
In the example above, Kumiho uses the nested folders for discovery, then adds the resulting leaf series to the library list instead of rendering the entire folder tree as a separate browse UI.
### π΅ BGM Auto-Play Rule
- Supported audio formats: `.mp3`, `.ogg`, `.wav`, `.flac`, `.m4a`
- BGM auto-plays when the audio file has the same base filename as the currently opened volume/chapter file.
- Example: `001.zip` β `001.mp3`, `001.epub` β `001.mp3`
### π§ Audiobook Support
- Supported audiobook formats: `.mp3`, `.wav`, `.ogg`, `.oga`, `.flac`, `.m4a`, `.m4b`, `.aac`, `.wma`, `.opus`, `.mp4`
- Supports resume playback, chapter-based navigation, progress tracking, bookmarks, and sleep timer
- Audiobooks can be organized with the same nested folder structure used for books
- When creating a library for audiobooks, set the library type to **Audiobook**
### π Installation (Docker)
#### Docker Compose (Recommended)
```yaml
version: "3.8"
services:
kumiho:
image: ahahyeong/kumiho:latest
container_name: kumiho
restart: unless-stopped
ports:
- "9999:9999"
volumes:
- ./data:/app/data # Path to store database and data
- ./config:/app/config # Path to store configuration
- ./books:/books # Path to your library
environment:
- PUID=1000 # User ID (Can be found via `id` command)
- PGID=1000 # Group ID
- TZ=Asia/Seoul
- JWT_SECRET=your_secret_key # Recommended for security
- PLUGIN_SECRET_KEY=your_plugin_secret_key # Required: without this, plugin credentials cannot be decrypted after reinstall
```
#### Docker Run
```bash
docker run -d \
--name kumiho \
-p 9999:9999 \
-v $(pwd)/data:/app/data \
-v $(pwd)/config:/app/config \
-v $(pwd)/books:/books \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Seoul \
-e JWT_SECRET=your_secret_key \
-e PLUGIN_SECRET_KEY=your_plugin_secret_key \
--restart unless-stopped \
ahahyeong/kumiho:latest
```
### π Library Path Setup Guide
If you mounted `./books:/books` in your Docker Compose `volumes` configuration, you must enter the **container internal path** `/books` on the Kumiho settings page.

1. Go to the **Settings > Libraries** tab.
2. Click the **Add New Library** button.
3. Enter `/books` in the **Set Path** field. (Do NOT use the host path `./books`!)
> Note: The scanner automatically excludes `@eaDir`, `#recycle`, `.DS_Store`, and `Thumbs.db`.
## π Bug Reports & Feature Requests
- [GitHub Issues](https://github.com/aha-hyeong/kumiho/issues)
- ahahyeong@gmail.com