user: demo • pass: demo
AnthoLume is a Progressive Web App (PWA) that manages your EPUB documents, provides an EPUB reader, and tracks your reading activity! It also has a KOReader KOSync compatible API, and a KOReader Plugin used to sync activity from your Kindle. Some additional features include:
- OPDS API Endpoint
- Local / Offline Reader (via ServiceWorker)
- Metadata Scraping (Thanks OpenLibrary & Google Books API)
- Words / Minute (WPM) Tracking & Leaderboard (Amongst Server Users)
While some features require JavaScript (Service Worker & EPUB Reader), we make an effort to limit JavaScript usage. Outside of the two aforementioned features, no JavaScript is used.
Docker Image: docker pull gitea.va.reichard.io/evan/antholume:latest
The Local / Offline reader allows you to use any AnthoLume server as a standalone offline accessible reading app! Some features:
- Add local EPUB documents
- Read both local and any cached server documents
- Maintains progress for all types of documents (server / local)
- Uploads any progress or activity for cached server documents once the internet is accessible
The KOSync compatible API endpoint is located at: http(s)://<SERVER>/api/ko
The OPDS API endpoint is located at: http(s)://<SERVER>/api/opds
NOTE: If you're accessing your instance over HTTP (not HTTPS), you must set COOKIE_SECURE=false
, otherwise you will not be able to login.
# Make Data Directory
mkdir -p antholume_data
# Run Server
docker run \
-p 8585:8585 \
-e COOKIE_SECURE=false \
-e REGISTRATION_ENABLED=true \
-v ./antholume_data:/config \
-v ./antholume_data:/data \
gitea.va.reichard.io/evan/antholume:latest
The service is now accessible at: http://localhost:8585
. I recommend registering an account and then disabling registration unless you expect more users.
Environment Variable | Default Value | Description |
---|---|---|
DATABASE_TYPE | SQLite | Currently only "SQLite" is supported |
DATABASE_NAME | antholume | The database name, or in SQLite's case, the filename |
CONFIG_PATH | /config | Directory where to store SQLite's DB |
DATA_PATH | /data | Directory where to store the documents and cover metadata |
LISTEN_PORT | 8585 | Port the server listens at |
LOG_LEVEL | info | Set server log level |
REGISTRATION_ENABLED | false | Whether to allow registration (applies to both WebApp & KOSync API) |
COOKIE_AUTH_KEY | Optional secret cookie authentication key (auto generated if not provided) | |
COOKIE_ENC_KEY | Optional secret cookie encryption key (16 or 32 bytes) | |
COOKIE_SECURE | true | Set Cookie Secure attribute (i.e. only works over HTTPS) |
COOKIE_HTTP_ONLY | true | Set Cookie HttpOnly attribute (i.e. inacessible via JavaScript) |
- Web App / PWA - Session based token (7 day expiry, refresh after 6 days)
- KOSync & SyncNinja API - Header based -
X-Auth-User
&X-Auth-Key
(KOSync compatibility) - OPDS API - Basic authentication (KOReader OPDS compatibility)
- Credentials are the same amongst all endpoints
- The native KOSync plugin sends an MD5 hash of the password. Due to that:
- We store an Argon2 hash and per-password salt of the MD5 hashed original password
See documentation in the client
subfolder: SyncNinja
SQLC Generation (v1.26.0):
go install github.com/sqlc-dev/sqlc/cmd/sqlc@latest
~/go/bin/sqlc generate
Goose Migrations:
go install github.com/pressly/goose/v3/cmd/goose@latest
Run Development:
CONFIG_PATH=./data DATA_PATH=./data REGISTRATION_ENABLED=true go run main.go serve
The Dockerfile
and Makefile
contain the build information:
# Build Local (Linux & Darwin - arm64 & amd64)
make build_local
# Build Local Docker Image
make docker_build_local
# Build Docker & Push Latest or Dev (Linux - arm64 & amd64)
make docker_build_release_latest
make docker_build_release_dev
# Generate Tailwind CSS
make build_tailwind
# Clean Local Build
make clean
# Tests (Unit & Integration - Google Books API)
make tests_unit
make tests_integration