RPi5 Home Server — Part 4: Books, Tools & Utilities
Part 4 — the final part — of the RPi5 home server series. Add jDownloader2 for bulk downloads, Kavita and Calibre for a self-hosted digital library, IT-Tools for developer utilities, and Stirling PDF for private document processing.
This is Part 4 of the Raspberry Pi 5 Home Server series — the final part. This covers the reading, reference, and utility layer of the stack.
What We're Installing
| Service | Purpose | Port |
|---|---|---|
| jDownloader2 | Bulk file and archive downloader | 5800 |
| Kavita | Digital library — manga, comics, books | 5000 |
| Calibre | E-book management suite | 3003 |
| Calibre-Web | Web reading interface for Calibre | 3004 |
| IT-Tools | Developer and sysadmin utility toolkit | 8083 |
| Stirling PDF | Private PDF manipulation and conversion | 8084 |
jDownloader2 — Bulk File Downloader
jDownloader2 is the industry standard for downloading from file hosting sites. It handles multi-part archives, password-protected downloads, and automatic extraction once downloads complete — everything MeTube doesn't cover.
Key capabilities:
- Automatically extracts
.zipand.rararchives after download - Handles multi-part archives (
.part1.rar,.part2.rar, etc.) - Supports hundreds of file hosting sites
- Browser extension lets you push links from your main computer to the Pi
1. Create the directory structure
mkdir -p /mnt/data/storage/Downloads/jdownloader
mkdir -p /mnt/data/docker-compose/appdata/jdownloader22. Docker Compose configuration
Add this to your docker-compose.yml under services::
jdownloader2:
image: jlesage/jdownloader-2:latest
container_name: jdownloader2
restart: unless-stopped
ports:
- "5800:5800"
volumes:
- /mnt/data/docker-compose/appdata/jdownloader2:/config
- /mnt/data/storage/Downloads/jdownloader:/output
environment:
- PUID=1000
- PGID=1000Deploy:
cd /mnt/data/docker-compose
docker compose up -d jdownloader2Access jDownloader2 at http://192.168.1.150:5800
The interface renders jDownloader2's full desktop GUI in your browser via a built-in VNC session.
3. My.jDownloader — push links from anywhere
My.jDownloader is a free relay service that lets you send download links from your browser directly to the Pi — even remotely via Tailscale.
- Create a free account at my.jdownloader.org
- Inside jDownloader2, go to Settings → My.jDownloader
- Enter your email and password
- Install the browser extension on your main computer
Once connected, right-clicking any link shows a "Send to jDownloader" option — the Pi picks it up and starts downloading immediately.
4. Auto-watch folder
jDownloader2 can monitor a folder for text files containing download links.
Drop a .txt file full of URLs via Filebrowser and jDownloader2 starts
downloading automatically — no UI interaction required.
Enable this in Settings → LinkGrabber → Auto-add links from files and configure a watch folder inside your downloads directory.
5. Homepage integration
- Tools:
- jDownloader2:
icon: jdownloader.png
href: http://192.168.1.150:5800
description: Bulk File DownloaderKavita — Digital Library Server
Kavita is a reading server built specifically for manga, comics, and e-books. Think of it as a self-hosted Kindle library — except it runs on your Pi, your data never leaves your network, and it handles CBZ, CBR, PDF, and EPUB formats natively.
What makes Kavita stand out:
- Understands series logic — automatically groups volumes and chapters
- Tracks read/unread status per user across devices
- Right-to-left reading mode for manga
- Webtoon mode for vertical-scrolling comics
- OPDS support for connecting external reading apps (Panels, Moon+ Reader)
- Combined with Tailscale, sync your reading position across all devices
1. Create the directory structure
mkdir -p /mnt/data/storage/Books/Manga
mkdir -p /mnt/data/storage/Books/Novels
mkdir -p /mnt/data/storage/Books/Comics
mkdir -p /mnt/data/docker-compose/appdata/kavita2. Docker Compose configuration
kavita:
image: lscr.io/linuxserver/kavita:latest
container_name: kavita
restart: unless-stopped
ports:
- "5000:5000"
volumes:
- /mnt/data/docker-compose/appdata/kavita:/config
- /mnt/data/storage/Books:/data:ro
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTCThe :ro flag mounts your Books folder as read-only. Kavita reads your
library but cannot modify, delete, or move your files — your collection
is safe even if something goes wrong with the container.
Deploy:
cd /mnt/data/docker-compose
docker compose up -d kavitaAccess Kavita at http://192.168.1.150:5000
3. Library configuration
On first login, create an admin account. Then:
- Go to Server Settings → Libraries
- Add a library for each content type:
/data/Manga→ Type: Manga/data/Novels→ Type: Book/data/Comics→ Type: Comic
- Click Scan Library to index your files
Kavita loves consistent file naming. For best results use
Series Name - v01.cbz for manga volumes and Series Name - c001.cbz
for individual chapters. Inconsistent naming is the most common reason
series don't group correctly.
4. Pro tips
Webtoon mode — for vertically scrolling manhwa, click the eye icon in the reader to enable continuous scroll mode.
OPDS — connect reading apps directly to
http://192.168.1.150:5000/api/opds/ for native app integration.
NVMe advantage — with your library on NVMe storage, page turns and cover art loading are near-instant even with large high-resolution manga files.
5. Homepage integration
- Media:
- Kavita:
icon: kavita.png
href: http://192.168.1.150:5000
description: Digital LibraryCalibre & Calibre-Web — E-Book Management
Calibre is the gold standard for e-book library management — format conversion, metadata editing, cover art downloading, and more. Calibre-Web provides a clean, mobile-friendly reading interface backed by the same library.
Running both gives the best of both worlds:
- Calibre — the engine room. Fix messy metadata, convert formats, download covers, manage your library in bulk.
- Calibre-Web — the showroom. Beautiful browser interface optimized for reading and mobile use.
Both point at the same library folder on the NVMe, keeping them in sync automatically.
1. Create the directory structure
mkdir -p /mnt/data/storage/Books/Calibre-Library
mkdir -p /mnt/data/docker-compose/appdata/calibre
mkdir -p /mnt/data/docker-compose/appdata/calibre-web2. Docker Compose configuration
calibre:
image: lscr.io/linuxserver/calibre:latest
container_name: calibre
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- PASSWORD=your_secure_password
volumes:
- /mnt/data/docker-compose/appdata/calibre:/config
- /mnt/data/storage/Books/Calibre-Library:/config/Calibre Library
ports:
- "3003:8080"
- "8086:8081"
calibre-web:
image: lscr.io/linuxserver/calibre-web:latest
container_name: calibre-web
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- DOCKER_MODS=linuxserver/mods:universal-calibre
volumes:
- /mnt/data/docker-compose/appdata/calibre-web:/config
- /mnt/data/storage/Books/Calibre-Library:/books
ports:
- "3004:8083"
depends_on:
- calibreChange your_secure_password before deploying. This protects the Calibre
desktop GUI accessible in your browser.
Deploy:
cd /mnt/data/docker-compose
docker compose up -d calibre calibre-web3. Initial setup — the sync step
Follow this order carefully since Calibre-Web depends on an existing Calibre database:
-
Set up Calibre first — access at
http://192.168.1.150:3003and log in with the password you set. Complete the initial wizard. Calibre creates ametadata.dbfile in the library folder. -
Set up Calibre-Web — access at
http://192.168.1.150:3004. Default login:admin/admin123. When asked for the Calibre database location, enter/books. -
Enable uploads — in Calibre-Web go to Admin → Basic Configuration → Feature Configuration and enable Enable Uploads.
Change the Calibre-Web default password immediately after first login. Go to Admin → Edit User to update it.
4. Homepage integration
- Media:
- Calibre:
icon: calibre.png
href: http://192.168.1.150:3003
description: Library Management
- Calibre Web:
icon: calibre-web.png
href: http://192.168.1.150:3004
description: Book ReaderIT-Tools — Developer Utility Toolkit
IT-Tools is a massive collection of on-demand developer and sysadmin utilities. Instead of sending your data to random online tools, everything runs locally in your browser — nothing leaves your network.
Included tools: JSON formatter, Base64 encoder/decoder, UUID generator, password generator, cron expression builder, SQL formatter, case converter, QR code generator, JWT decoder, Docker Compose generator, and dozens more.
IT-Tools is stateless — no storage folders or configuration needed.
1. Docker Compose configuration
it-tools:
image: corentinth/it-tools:latest
container_name: it-tools
restart: unless-stopped
ports:
- "8083:80"Deploy:
cd /mnt/data/docker-compose
docker compose up -d it-toolsAccess IT-Tools at http://192.168.1.150:8083
No setup required — every tool is immediately available.
2. Homepage integration
- Tools:
- IT Tools:
icon: it-tools.png
href: http://192.168.1.150:8083
description: Developer UtilitiesIT-Tools uses almost zero CPU when idle — it's a static web app that runs calculations entirely in your browser. It's effectively a free addition to your stack in terms of Pi resources.
Stirling PDF — Private Document Processing
Stirling PDF is a comprehensive PDF toolkit. Merge, split, rotate, compress, convert, OCR — all running locally on your Pi. Your documents never touch an external server.
Why this matters: Most "free online PDF tools" process documents on their servers. Tax returns, identification documents, contracts — these should never be uploaded to a random website. Stirling PDF eliminates that risk entirely.
1. Create the directory structure
mkdir -p /mnt/data/docker-compose/appdata/stirling-pdf/trainingData
mkdir -p /mnt/data/docker-compose/appdata/stirling-pdf/configs2. Docker Compose configuration
stirling-pdf:
image: stirlingtools/stirling-pdf:latest
container_name: stirling-pdf
restart: unless-stopped
ports:
- "8084:8080"
volumes:
- /mnt/data/docker-compose/appdata/stirling-pdf/trainingData:/usr/share/tessdata
- /mnt/data/docker-compose/appdata/stirling-pdf/configs:/configs
environment:
- DOCKER_ENABLE_SECURITY=false
- INSTALL_BOOK_AND_ADVANCED_HTML_OPS=falseINSTALL_BOOK_AND_ADVANCED_HTML_OPS=false skips installing Calibre and
Chromium inside the container. These are heavy dependencies that aren't
needed for standard PDF operations and would significantly increase RAM
usage on the Pi. Enable only if you specifically need e-book format
conversion or HTML-to-PDF.
Deploy:
cd /mnt/data/docker-compose
docker compose up -d stirling-pdfAccess Stirling PDF at http://192.168.1.150:8084
3. OCR language support
To add OCR languages beyond English, download the appropriate
.traineddata files from the
tessdata repository and place
them in /mnt/data/docker-compose/appdata/stirling-pdf/trainingData/.
Restart the container after adding new language files:
docker compose restart stirling-pdf4. Homepage integration
- Tools:
- Stirling PDF:
icon: stirling-pdf.png
href: http://192.168.1.150:8084
description: PDF ToolkitComplete Port Reference
A full port map across the entire series:
| Service | Port | Part |
|---|---|---|
| Homepage | 3000 | Part 1 |
| Filebrowser | 8080 | Part 1 |
| Pi-hole | 8082 | Part 2 |
| Glances | 61208 | Part 2 |
| qBittorrent (via Gluetun) | 8090 | Part 3 |
| MeTube (via Gluetun) | 8081 | Part 3 |
| jDownloader2 | 5800 | Part 4 |
| Kavita | 5000 | Part 4 |
| Calibre | 3003 | Part 4 |
| Calibre-Web | 3004 | Part 4 |
| IT-Tools | 8083 | Part 4 |
| Stirling PDF | 8084 | Part 4 |
Troubleshooting
jDownloader2 interface is blank
The VNC session may not have started. Check the logs:
docker compose logs jdownloader2If the container is running but the interface is blank, try a hard refresh: Ctrl+Shift+R
jDownloader2 downloads to the wrong location
Inside jDownloader2, go to Settings → Save To and verify the path is
set to /output (the container-side path, not the host path).
Kavita library scan finds no files
- Verify files are in the correct subfolder for their library type
- Confirm file format is supported (CBZ, CBR, PDF, EPUB)
- Check permissions:
ls -la /mnt/data/storage/Books/
Calibre-Web can't find the library
The database path must be set to /books (the container-side mount
point). If you entered the host path, go to Admin → Basic Configuration
and correct it.
IT-Tools page is blank
Clear your browser cache. IT-Tools is a single-page app that occasionally gets stuck on a stale cache after an update.
Stirling PDF OCR returns garbled text
The language model may not match the document language. Download the
correct .traineddata file for your language, place it in the
trainingData folder, and restart the container.
"bind: address already in use"
Run docker ps to find what's using the conflicting port, then change
the left-hand number in the ports: mapping.
What's Next
With all four parts complete, your Raspberry Pi 5 is running a full
self-hosted infrastructure stack. Adding new services is as simple as
appending a block to docker-compose.yml and running docker compose up -d.
Some containers worth exploring next:
- AdGuard Home — an alternative to Pi-hole with a more modern UI and DNS-over-HTTPS support
- Uptime Kuma — a beautiful monitoring tool that checks whether all your services are online and sends alerts when they're not
- Nextcloud — self-hosted cloud storage and productivity platform
- Home Assistant — smart home automation integrating thousands of devices
- Vaultwarden — a self-hosted Bitwarden-compatible password manager
Legal Notice
All tools documented in this series are legitimate software with many lawful uses. Please ensure your use complies with your local laws and the terms of service of any platforms you interact with. These guides are provided for educational and personal use only.