Self-hosted digital library — successor to BookLore, with smart shelves, metadata, Kobo/KOReader sync, OPDS support, and a built-in reader.
| Registry | ghcr.io/daemonless/grimmory |
| Source | https://github.com/grimmory-tools/grimmory |
| Website | https://grimmory.org/ |
| Tag | Description | Best For |
|---|---|---|
latest |
Upstream Binary. Built from official release. | Most users. Matches Linux Docker behavior. |
Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions.
services:
grimmory:
image: ghcr.io/daemonless/grimmory:latest
container_name: grimmory
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- DATABASE_URL=jdbc:mariadb://127.0.0.1:3306/grimmory
- DATABASE_USERNAME=grimmory
- DATABASE_PASSWORD=changeme
- SWAGGER_ENABLED=false
- FORCE_DISABLE_OIDC=false
volumes:
- "/path/to/containers/grimmory/app/data:/app/data"
- "/path/to/books:/books"
- "/path/to/containers/grimmory/bookdrop:/bookdrop"
restart: unless-stopped.env:
DIRECTOR_PROJECT=grimmory
PUID=1000
PGID=1000
TZ=Etc/UTC
DATABASE_URL=jdbc:mariadb://127.0.0.1:3306/grimmory
DATABASE_USERNAME=grimmory
DATABASE_PASSWORD=changeme
SWAGGER_ENABLED=false
FORCE_DISABLE_OIDC=false
appjail-director.yml:
options:
- virtualnet: ':<random> default'
- nat:
services:
grimmory:
name: grimmory
options:
- container: 'boot args:--pull'
oci:
user: root
environment:
- PUID: !ENV '${PUID}'
- PGID: !ENV '${PGID}'
- TZ: !ENV '${TZ}'
- DATABASE_URL: !ENV '${DATABASE_URL}'
- DATABASE_USERNAME: !ENV '${DATABASE_USERNAME}'
- DATABASE_PASSWORD: !ENV '${DATABASE_PASSWORD}'
- SWAGGER_ENABLED: !ENV '${SWAGGER_ENABLED}'
- FORCE_DISABLE_OIDC: !ENV '${FORCE_DISABLE_OIDC}'
volumes:
- grimmory_app_data: /app/data
- books: /books
- grimmory_bookdrop: /bookdrop
volumes:
grimmory_app_data:
device: '/path/to/containers/grimmory/app/data'
books:
device: 'books'
grimmory_bookdrop:
device: '/path/to/containers/grimmory/bookdrop'Makejail:
ARG tag=latest
OPTION overwrite=force
OPTION from=ghcr.io/daemonless/grimmory:${tag}
podman run -d --name grimmory \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e DATABASE_URL=jdbc:mariadb://127.0.0.1:3306/grimmory \
-e DATABASE_USERNAME=grimmory \
-e DATABASE_PASSWORD=changeme \
-e SWAGGER_ENABLED=false \
-e FORCE_DISABLE_OIDC=false \
-v /path/to/containers/grimmory/app/data:/app/data \
-v /path/to/books:/books \
-v /path/to/containers/grimmory/bookdrop:/bookdrop \
ghcr.io/daemonless/grimmory:latest- name: Deploy grimmory
containers.podman.podman_container:
name: grimmory
image: ghcr.io/daemonless/grimmory:latest
state: started
restart_policy: always
env:
PUID: "1000"
PGID: "1000"
TZ: "Etc/UTC"
DATABASE_URL: "jdbc:mariadb://127.0.0.1:3306/grimmory"
DATABASE_USERNAME: "grimmory"
DATABASE_PASSWORD: "changeme"
SWAGGER_ENABLED: "false"
FORCE_DISABLE_OIDC: "false"
volumes:
- "/path/to/containers/grimmory/app/data:/app/data"
- "/path/to/books:/books"
- "/path/to/containers/grimmory/bookdrop:/bookdrop"| Variable | Default | Description |
|---|---|---|
PUID |
1000 |
|
PGID |
1000 |
|
TZ |
Etc/UTC |
|
DATABASE_URL |
jdbc:mariadb://127.0.0.1:3306/grimmory |
MariaDB JDBC URL (e.g., jdbc:mariadb://127.0.0.1:3306/grimmory) |
DATABASE_USERNAME |
grimmory |
Database username |
DATABASE_PASSWORD |
changeme |
Database password |
SWAGGER_ENABLED |
false |
Enable Swagger UI (default: false) |
FORCE_DISABLE_OIDC |
false |
Force-disable OIDC authentication (default: false) |
| Path | Description |
|---|---|
/app/data |
Configuration and application data |
/books |
Book library directory |
/bookdrop |
Drop folder for automatic imports |
Architectures: amd64
User: bsd (UID/GID via PUID/PGID, defaults to 1000:1000)
Base: FreeBSD 15.0
Need help? Join our Discord community.