Lightweight, self-hosted web app to manage eBook and audiobook requests. It searches Readarr and public sources, lets users request titles, and helps admins send those into Readarr with a simple dark UI.
This README is meant to be a quick start; deeper details live in API.md and the source.
- Multi-source search (Readarr, Amazon public pages, Open Library).
- Request queue with approve/decline/delete and bulk actions.
- Dual Readarr instances (ebooks + audiobooks) with profiles and root folders.
- First-run setup wizard (server URL, admin user, Readarr, OAuth).
- Local auth plus optional OAuth/OIDC login with role-based access.
- Notifications via ntfy, email (SMTP), and Discord (incl. one-click approvals).
- Dark, Tailwind + HTMX-powered web UI.
All of these are implemented in this repo today.
- Users search for titles, pick a result, and submit a request (kind = ebook or audiobook).
- Requests land on the admin queue where bulk or single approvals push books into the matching Readarr instance using pre-set profiles/root folders/tags.
- Readarr handles the monitoring; Scriptorum tracks request status and shows it back to the requester.
- Notifications (optional) ping admins or requesters via ntfy/email/Discord with one-click approval links.
The UI sits on top of a single SQLite database (data/scriptorum.db) and a YAML config (data/scriptorum.yaml).
- Docker: see "Docker quick start" below (recommended).
- Native: use
build.ps1on Windows orgo build. - Config file:
data/scriptorum.yaml(created on first run if absent). - Default HTTP listen port:
:8491(can be changed viahttp.listen). - Health endpoints:
/healthzand/version.
- Clone the repository:
git clone https://github.com/your-username/scriptorum.git
cd scriptorum- Start with Docker Compose (builds the image if needed):
docker compose up -d --build- Open the UI in your browser. The repo's
docker-compose.ymlmaps host port8491→ container port8491by default:
Notes
- If you change
http.listenin your config, update the compose port mapping. - To view logs:
docker compose logs -f scriptorum- To stop and remove containers:
docker compose downUse the included PowerShell helper on Windows (works on other platforms with Go installed).
Prerequisites
- Go 1.25+
- SQLite3 (optional; the binary uses the modernc SQLite driver)
- Node.js / npm (optional for rebuilding CSS)
Build and run using the helper script:
# build the binary
./build.ps1 build
# run tests
./build.ps1 test
# run the app (builds first if needed)
./build.ps1 runOr build and run directly with Go:
go build -o ./bin/scriptorum ./cmd/scriptorum
./bin/scriptorumBy default the app will create data/scriptorum.yaml and data/scriptorum.db on first run if they don't exist. Override paths with environment variables (PowerShell example):
$env:SCRIPTORUM_CONFIG_PATH = "C:\data\scriptorum.yaml"
$env:SCRIPTORUM_DB_PATH = "C:\data\scriptorum.db"-
Everything works out of the box. Skip straight to running the container if you just want the defaults; the wizard will prompt for anything essential.
-
Example config:
scriptorum.example.yaml(repo root). Copy it todata/scriptorum.yamland edit. -
Key fields you’ll likely touch:
http.listen— HTTP listen address.db.path— SQLite DB location.readarr.ebooks/readarr.audiobooks—base_url,api_key, profile, root folder, tags.notifications— ntfy/SMTP/Discord settings and which events to send.oauth— OIDC issuer, client id/secret, scopes, username claim, allowlists.
After changing data/scriptorum.yaml, restart the app or container.
- At least one admin account (created via setup wizard or
/users). readarr.ebooksand/orreadarr.audiobooksbase_url+api_key(can skip one if you only run the other).- Optional: notification providers (ntfy/SMTP/Discord) and OAuth if you prefer SSO.
/requests— queue with filters, bulk approve/decline, request history./users— manage local accounts, roles, and password resets./settings— Readarr targets, quality profiles, root folders, OAuth, and general settings./notifications— configure/test ntfy, SMTP, Discord./approve/{token}— one-click approvals from notification links.
All admin pages are HTMX-driven and require the admin role.
- Config:
data/scriptorum.yaml(override withSCRIPTORUM_CONFIG_PATH). - Database:
data/scriptorum.db(override withSCRIPTORUM_DB_PATH). - Static assets and built CSS live under
internal/httpapi/webandassets/.
Back up the YAML + SQLite files together. The database is small and safe to snapshot while the app is stopped.
- API and advanced options: see
API.md. - License: GNU GPLv3 (see
LICENSE).
Made for the self-hosted media community.