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.
Go to file
Evan Reichard 546600db93
All checks were successful
continuous-integration/drone/push Build is passing
feat(admin): handle user demotion & promotion
2024-05-25 21:12:07 -04:00
_test_files [add] better error handling, [add] font selector, [add] tailwind generation 2023-10-25 19:52:01 -04:00
api feat(admin): handle user demotion & promotion 2024-05-25 21:12:07 -04:00
assets feat(admin): handle user demotion & promotion 2024-05-25 21:12:07 -04:00
client [fix] SyncNinja status message 2023-11-26 15:51:47 -05:00
config tests(all): improve tests, refactor(api): saving books 2024-02-24 20:45:26 -05:00
database feat(admin): adding user & importing 2024-05-25 20:02:57 -04:00
graph [fix] xpath & cfi resolution 2023-11-07 19:19:06 -05:00
metadata chore(dev): dynamically load templates during dev 2024-02-25 14:54:50 -05:00
opds tests(all): improve tests, refactor(api): saving books 2024-02-24 20:45:26 -05:00
screenshots [add] rename to AnthoLume 2023-11-04 19:55:38 -04:00
search tests(all): improve tests, refactor(api): saving books 2024-02-24 20:45:26 -05:00
server chore(dev): dynamically load templates during dev 2024-02-25 14:54:50 -05:00
templates feat(admin): handle user demotion & promotion 2024-05-25 21:12:07 -04:00
utils tests(all): improve tests, refactor(api): saving books 2024-02-24 20:45:26 -05:00
.djlintrc chore(formatting): djlint templates 2024-01-24 21:40:14 -05:00
.drone.yml tests(all): improve tests, refactor(api): saving books 2024-02-24 20:45:26 -05:00
.envrc Initial Commit 2023-09-19 08:01:15 -04:00
.gitignore tests(all): improve tests, refactor(api): saving books 2024-02-24 20:45:26 -05:00
.sqlfluff Initial Commit 2023-09-19 08:01:15 -04:00
banner.png [add] logo & banner, [fix] mobile alignment issue 2023-11-05 13:20:19 -05:00
banner.xcf [add] logo & banner, [fix] mobile alignment issue 2023-11-05 13:20:19 -05:00
docker-compose.yml [add] rename to AnthoLume 2023-11-04 19:55:38 -04:00
Dockerfile fix(tz): add tzdata to docker image 2024-04-06 09:39:04 -04:00
Dockerfile-BuildKit fix(tz): add tzdata to docker image 2024-04-06 09:39:04 -04:00
go.mod feat(admin): adding user & importing 2024-05-25 20:02:57 -04:00
go.sum tests(all): improve tests, refactor(api): saving books 2024-02-24 20:45:26 -05:00
LICENSE Initial Commit 2023-09-19 08:01:15 -04:00
main.go chore(dev): dynamically load templates during dev 2024-02-25 14:54:50 -05:00
Makefile tests(all): improve tests, refactor(api): saving books 2024-02-24 20:45:26 -05:00
README.md feat(logging): improve logging & migrate to json logger 2024-01-26 20:45:07 -05:00
shell.nix add: db migrations & update 2024-01-25 19:22:57 -05:00
sqlc.yaml feat(admin): adding user & importing 2024-05-25 20:02:57 -04:00
tailwind.config.js chore(formatting): djlint templates 2024-01-24 21:40:14 -05:00

ScreenshotsDemo Server

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.

Server

Docker Image: docker pull gitea.va.reichard.io/evan/antholume:latest

Local / Offline Reader

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

KOSync API

The KOSync compatible API endpoint is located at: http(s)://<SERVER>/api/ko

OPDS API

The OPDS API endpoint is located at: http(s)://<SERVER>/api/opds

Quick Start

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.

Configuration

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)

Security

Authentication

  • 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)

Notes

  • 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

Client (KOReader Plugin)

See documentation in the client subfolder: SyncNinja

Development

SQLC Generation (v1.21.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

Building

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

Notes