Self-hosted comic book (CBR/CBZ) reading server. A lightweight web UI with a built-in reader, cached covers, and persistent reading progress, run your own comics library without relying on external services.
- CBR/CBZ support in the browser via
libarchive.js(WASM) archives are extracted client-side, no conversion step required. - Series-based browsing organize your library by series, each in its own folder.
- Lazy-loaded covers cover thumbnails are only extracted and requested as they scroll into view, not all at once.
- Server-side cover caching once a cover is extracted, it's resized, recompressed as JPEG, and cached on disk so it never has to be re-extracted from the archive again.
- Persistent reading progress the last page read per comic is saved in
localStorage, so you can pick up right where you left off. - Full-screen page reader with page prefetching for smooth navigation.
- RAR filter fallback comics using unsupported RAR compression filters are automatically converted server-side so they can still be read.
You need a PHP-capable web server. Two supported options:
- XAMPP (or any Apache + PHP stack) the simplest option if you already have it installed.
- Bundled Python server (
php_server.py) a minimal, dependency-free alternative that serves static files and runs.phpscripts throughphp-cgi, with no need to install a full Apache stack.- Requires PHP with
php-cgiavailable (see comments at the top ofphp_server.pyfor per-OS install instructions).
- Requires PHP with
- Clone this repository into your server's web root (or anywhere, if using the bundled Python server).
- Drop your comic archives into the
comics/folder, organized as:comics/ <series>/ issue-01.cbz issue-02.cbr - Start the server:
- XAMPP: place the project in
htdocs/and start Apache from the XAMPP control panel. - Bundled server:
python php_server.py(edit thePHP_CGIpath at the top of the file ifphp-cgiisn't on your systemPATH).
- XAMPP: place the project in
- Open
http://localhost/in your browser.
- Category banners (background image, years, synopsis) are configured in
data/category-info.json. - Category images default to
images/categories/<CategoryName>.jpg, or can be overridden per-category in the JSON above. - Cover thumbnail size and quality can be tuned in
js/app.js(COVER_MAX_WIDTH,COVER_MAX_HEIGHT,COVER_JPEG_QUALITY).
├── api/ # PHP backend (listing, cover caching)
├── css/ # Stylesheet
├── data/ # category-info.json
├── images/categories/ # Category banner images
├── js/ # Frontend app + vendored libarchive.js
├── comics/ # Your comic library (series/archive.cbr)
├── php_server.py # Optional standalone Python server
└── index.html
Licensed under the MIT License.
Note: this license covers the project's own code only. Comics you place under lectura/ are your own content and are not covered by this license. libarchive.js (in js/vendor/) is a third-party dependency check its own license before redistributing.
