Personal project · On my server · 2026

Manga

My own manga reader: shared library, per-person progress and a phone app.

See it live ↗

My role

Everything: setup, redesign with my brand, upload pipeline and file optimization.

Stack

  • Kavita
  • Docker
  • Python
  • rsync
  • systemd
  • CSS
  • PWA
  • Cloudflare Tunnel
  • Linux

The problem

Manga lived scattered across Telegram PDFs and files on the phone, and everyone had to remember which volume they were on. Now it is a library with covers on my server, read in the browser or as an app, and each person has an account with their own progress. Adding a new one is dropping it into a folder on my laptop.

Highlights

  1. 01Automatic uploads: a Python script watches a folder on my laptop, converts and uploads only what is new, resumes interrupted uploads, can be paused and notifies me on Telegram.
  2. 02Lossless PDF to CBZ: when every page is a single image, it extracts the original bytes instead of re-encoding (72 of 72 volumes converted this way).
  3. 03Measured optimization: I compared JPEG, WebP and AVIF at several resolutions on real pages; one series went from 13 GB to 2.7 GB (−79 %) with no visible loss on a phone.
  4. 04Full redesign with the rOS identity, including the login screen the theme system does not cover, applied in a way that survives updates.
  5. 05Installable app (PWA) with its own name and icon, and one account per person with their own progress.

What I learned

  • → 01Measure before compressing: at 2000 px the manga screentone turned grey when zooming in; at 2400 px it held up with almost the same savings.
  • → 02Customize without breaking updates: instead of editing files inside the container, a startup script re-applies the branding every time it starts.
  • → 03Design for interruptions from day one: a multi-gigabyte upload over the internet will get cut, so the script had to resume without starting over.

Live

Running on my server

Projects running on my homelab, under my own domain. Open each one to see how it works.

Posts about this project

Next project

transcribe →

← Back