A self-hostable sync server for KOReader. Keeps reading progress in sync across all your devices.

Requirements: Docker. That's it.
docker run -d -p 3000:3000 -v koreader-data:/app/data ghcr.io/nperez0111/koreader-sync:latest
The server is now running at http://localhost:3000. The SQLite database is persisted in the koreader-data volume.
For a more permanent setup:
services:
kosync:
image: ghcr.io/nperez0111/koreader-sync:latest
container_name: kosync
ports:
- 3000:3000
healthcheck:
test: ["CMD", "bun", "-e", "fetch('http://localhost:3000/health').then(r => { if (!r.ok) process.exit(1) })"]
interval: 5m
timeout: 3s
restart: unless-stopped
volumes:
- data:/app/data
volumes:
data:Save as docker-compose.yml and run docker compose up -d.
Note: Registration is open by default. Set DISABLE_USER_REGISTRATION=true to block new accounts after you've registered.