Your folders. Your Calibre.
Add ordinary book and comic folders, or point at a Calibre library’s metadata.db. Source libraries stay read-only; Armarium writes to its own data folder.
Self-hosted. Open source. Yours.
A small Go server for your books and comics. Point it at a folder or a Calibre library. Browse, read, and serve your collection over OPDS.
One binary. Your existing files. A little more room to read.
A shelf worth coming back to.
01 / The idea
armarium / noun
The cupboard where a medieval monastery kept its books.
I wanted a simple way to serve my collection.
Kavita and Calibre-Web felt resource-heavy for what I needed: a lightweight OPDS server for my own books and comics. So I made Armarium in Go.
It keeps the job small. Read the files I already have, make them easy to browse, and get them to the reader I want to use. A single binary, an embedded web UI, and SQLite, with incremental scans that only open new or changed files.
Keep managing metadata in Calibre if you like. Armarium reads its library directly, including titles, authors, series, tags, covers, and available formats.
Add ordinary book and comic folders, or point at a Calibre library’s metadata.db. Source libraries stay read-only; Armarium writes to its own data folder.
A cover grid, search, and filters, with an EPUB reader, a comic viewer, and PDFs opened in the browser. Works on a desktop or a phone.
OPDS 1.2 with search, recent additions, and continue reading. Stream CBZ and CBR pages with OPDS-PSE, or download the whole file.
Server-side progress is shared by the web UI, OPDS page streaming, and readers using the Armarium API. Import existing progress from Kavita.
Pair Skrivist Books or Comics with an Admin QR code. Each device gets its own revocable token. The web UI uses an owner login.
Pure-Go SQLite, an embedded UI, and no background scanning by default. Run in Docker on your NAS, or use the binary with a small JSON API for your own tools.
Other Calibre formats, including MOBI and AZW3, are available as downloads.
Built for a personal collection. Metadata editing, scraping, and multiple user accounts are outside Armarium’s scope.
Armarium needs a configuration file, a writable data folder, and read access to your collection.
Docker images are available for Linux amd64 and arm64. The deployment guide also covers Synology and systemd.
See all settingsAfter starting, log in and run a scan from Admin. Your covers and collection will appear in the library.
mkdir -p armarium/data && cd armarium
curl -LO https://raw.githubusercontent.com/c0ze/armarium/main/deploy/compose.yaml
curl -L -o armarium.toml https://raw.githubusercontent.com/c0ze/armarium/main/deploy/armarium.example.tomlEdit compose.yaml: replace the library mount paths with your own and keep :ro. Set user: to the owner of ./data (check with id -u and id -g).
In armarium.toml, use listen = "0.0.0.0:8580", add the host names or IP addresses you’ll use to allowed_hosts, and set each library’s path as seen inside the container.
docker run --rm -i ghcr.io/c0ze/armarium hash-passwordEnter a password of at least eight characters. Paste the printed hash into password_hash in your config, then start Armarium:
docker compose up -dOpen http://localhost:8580 on the server, or http://<your-host>:8580 from another device. Log in and scan from Admin.
Get and unpack the matching archive from GitHub Releases. The web UI is already inside the binary.
curl -L -o armarium.toml https://raw.githubusercontent.com/c0ze/armarium/main/deploy/armarium.example.toml
./armarium hash-passwordOn Windows, run .\armarium.exe in place of ./armarium.
Paste the printed hash into password_hash. Set data_dir to a writable folder and change the [[library]] roots to your collection’s actual paths. Use calibre = true for a Calibre library.
The default address, 127.0.0.1:8580, is for this computer. To serve other devices, set listen = "0.0.0.0:8580" and add the host names or IP addresses to allowed_hosts.
./armarium serveOpen http://127.0.0.1:8580, log in, and run a scan from Admin. For an always-on Linux setup, follow the systemd instructions.
Prefer to build it? Source instructions use Go 1.25+, Node 22+, and make.
A quiet EPUB and PDF reader in your browser. Adjust the type and paper, navigate chapters, and save notes. Open books from Armarium’s OPDS catalogue and keep downloaded books on your device for offline reading.
Open Skrivist BooksA CBZ, CBR, and PDF reader with guided panel-by-panel reading. Panel detection runs in your browser. Browse your Armarium catalogue, choose an issue, and download it for reading, including offline.
Open Skrivist ComicsBetter together
The hosted Skrivist apps connect directly to Armarium from your browser. Give your server an HTTPS address the phone can reach, then allow both readers in your config.
Books and issues downloaded through OPDS keep their reading positions in that browser. Server progress sync is available through Armarium’s web UI, OPDS page streaming, and the Comics reader’s Armarium mode.
allowed_hosts = ["armarium.example.com"]
public_url = "https://armarium.example.com"
cors_origins = [
"https://books.skriv.ist",
"https://comics.skriv.ist",
"tauri://localhost",
"http://tauri.localhost",
"https://tauri.localhost"
]
secure_cookie = trueThis list supports the Skrivist macOS and Windows apps with Armarium v0.3.2 or later, too. Replace the corresponding top-level settings in your config, before any [scan], [limits], or [[library]] sections. Use a reverse proxy such as Caddy, Synology’s proxy, or Tailscale Serve for HTTPS.
A home-network or Tailscale server works if the phone is on that network too. Download a title before going offline; wait for the reader’s offline assets to finish caching.
Pairing and connectivity guideAdd https://<your-host>/opds/v1.2/catalog to your OPDS 1.2 reader. Create a token in Admin → API tokens, use any username, and enter the token as the Basic auth password.
For apps without Basic auth, use https://<your-host>/opds/t/<token>/v1.2/catalog. Treat that address as a credential. OPDS clients such as KOReader, Panels, and Chunky can use these feeds; capabilities vary by reader.
A small server. A full shelf.