meine
meine 🌒 - A CLI file manager and system utility built with Textual. It combines intuitive command parsing with rich t…
A fast, self-hosted comic library server. Scan your comics, read in browser, or use any OPDS client.
Your personal comic library server
Host your digital comics (CBZ/CBR/CB7/PDF files) on your home server and read them on any device. Issued automatically organizes your collection and makes it available through mobile apps like Panels, Chunky, or a built-in web reader.
Issued works with all common digital comic formats:
unrar)Issued detects the real container from the file contents. Misnamed archives, such
as a .cbz file that is actually compressed with 7-Zip, are handled automatically.
All formats support:
Docker users: skip this section — the Docker image includes everything you need.
For CBR files only (skip if you only have CBZ or PDF):
Install unrar on your computer:
brew install rarsudo apt install rarNote: CBZ, CB7, and PDF files work without any extra software. CBR files need
unrarto extract.
Best for: Running on a home server or NAS. Everything is pre-configured, including unrar.
Step 1: Create a docker-compose.yml file anywhere on your server:
services:
issued:
image: ghcr.io/metalogico/issued:latest
restart: unless-stopped
ports:
- "8181:8181"
volumes:
- ./data:/app/data
- /path/to/your/comics:/comics:ro # ← Change this path
Change /path/to/your/comics to your comics folder:
- /home/user/Comics:/comics:ro # Linux - /Users/john/Comics:/comics:ro # macOS - C:/Comics:/comics:ro # Windows
Step 2: Start the server
docker compose up -d
Done! Your comics are now available at:
http://YOUR-SERVER-IP:8181/opds/http://YOUR-SERVER-IP:8181/reader/Replace
YOUR-SERVER-IPwith your computer's IP address (e.g.,192.168.1.100)
Alternative: docker run
docker run -d --name issued \ --restart unless-stopped \ -p 8181:8181 \ -v /path/to/your/comics:/comics:ro \ -v issued_data:/app/data \ ghcr.io/metalogico/issued:latest
Alternative: docker create (create now, start later)
docker create \ --name=issued \ --user 1000:1000 \ -p 8181:8181 \ --mount type=bind,source=/path/to/your/comics,target=/comics,readonly \ --mount type=bind,source=/path/to/data,target=/app/data \ --restart unless-stopped \ ghcr.io/metalogico/issued:latest
Then start it:
docker start issued
The image is also available on Docker Hub as metalogico/issued.
Best for: Quick setup on your personal computer.
Windows note: Put the executable in a writable folder, such as your Desktop or another folder inside your user profile. Avoid
C:\Program Filesunless you run it with permissions to write there, because Issued storesconfig.ini,library.db, logs, and thumbnails beside the executable by default.
Step 1: Download for your system
Get the latest release from GitHub Releases:
issued-macosissued-linuxissued.exeStep 2: Make it executable (macOS/Linux only)
chmod +x issued # macOS only: If blocked by security xattr -d com.apple.quarantine issued
Step 3: Initialize your library
# Replace with your actual comics folder path ./issued init --library /path/to/your/comics
Examples:
./issued init --library ~/Comics # macOS/Linux ./issued init --library C:\Users\You\Comics # Windows
Step 4: Scan your comics
./issued scan
This will:
Step 5: Start the server
./issued serve
Done! Your comics are now available at:
http://YOUR-COMPUTER-IP:8181/opds/http://YOUR-COMPUTER-IP:8181/reader/Tip: Keep the terminal window open while the server runs. New comics will be detected automatically.
Popular apps that work with Issued:
How to connect:
http://YOUR-IP:8181/opds/Finding your IP:
- macOS/Linux: Run
ifconfigorip addr- Windows: Run
ipconfig- Look for something like
192.168.1.100
Just open: http://localhost:8181/reader/
From the web reader you can browse folders, search your library, read comics, edit comic details, and keep track of what you are reading.
If you follow series that are still coming out, Issued can keep them together for you.
The Ongoing page shows the latest added issue, how many issues are in the series, and possible missing issue numbers. The button appears on series folders that contain comics directly.
Optional: Add password protection by editing config.ini:
[reader] user = yourname password = yourpassword
Just copy them to your comics folder! If the server is running, they'll be detected automatically.
You can also start a scan from the web reader: click the refresh icon in the top menu. Issued will scan your library, show how many comics were added, updated, or deleted, and then refresh the page.
Or manually scan from the command line:
./issued scan
./issued scan --force
./issued stats
./issued thumbnails --regenerate
Edit config.ini in the app data folder. For standalone executables this is the
same folder as the executable unless you set DATA_DIR; for Docker it is
/app/data inside the container, usually backed by your mounted volume.
[server] → port = 8080[reader] → user = name, password = pass[thumbnails] → width, height, qualityEdit config.ini for more options:
[library] path = /path/to/comics # Your comics folder name = My Comics # Library name shown in apps [server] host = 0.0.0.0 # Listen on all network interfaces port = 8181 # Change if port is already in use [thumbnails] width = 300 # Thumbnail width in pixels height = 450 # Thumbnail height in pixels quality = 85 # JPEG quality (1-100) format = jpeg # jpeg or webp [monitoring] enabled = true # Auto-detect new comics debounce_seconds = 2 # Wait time before processing changes [reader] user = # Leave empty for no password password = # Leave empty for no password
Issued keeps its two public route prefixes when served through a reverse proxy:
https://issued.example.com/reader/https://issued.example.com/opds/Do not strip or rewrite /reader or /opds. For example, with nginx:
server {
listen 443 ssl;
server_name issued.example.com;
location / {
proxy_pass http://issued:8181;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Reader assets and images use origin-relative URLs, so they work with either an
IP address or a domain. OPDS clients require absolute URLs; forwarding Host
and X-Forwarded-Proto ensures those URLs contain the public domain and
protocol.
When nginx, Caddy, Traefik, or another proxy runs in a separate container, add
FORWARDED_ALLOW_IPS=* to the Issued container environment, or replace *
with the proxy network/IP range. This lets Uvicorn trust the forwarded protocol.
Check the scan worked:
./issued stats
Should show your comic count.
Try a forced rescan:
./issued scan --force
Use your computer's IP address, not localhost
ifconfig (Mac/Linux) or ipconfig (Windows)http://192.168.1.100:8181/opds/Check firewall:
Make sure both devices are on the same network
Install unrar:
brew install unrarsudo apt install unrarThen restart the server.
xattr -d com.apple.quarantine issued
Edit config.ini and change the port:
[server] port = 8080
Then use http://YOUR-IP:8080/opds/ instead.
Docker: It runs in the background automatically.
Executable: Run in the background:
# macOS/Linux nohup ./issued serve & # Or use screen/tmux screen -S issued ./issued serve # Press Ctrl+A then D to detach
This project uses the violet accent color just because my baby daughter is called Violet <3
If you're stuck:
MIT. See LICENSE for details.
more like this
meine 🌒 - A CLI file manager and system utility built with Textual. It combines intuitive command parsing with rich t…
search projects, people, and tags