This repository has been archived and is no longer maintained.
β‘οΈ New Location: abs-kosync-bridge (Enhanced)
The project has been reorganized as a proper fork of the original abs-kosync-bridge project with significant enhancements.
Old repo (abs-kosync-web-ui):
- Loose collection of features
- No clear relationship to original project
- Inconsistent versioning
New repo (abs-kosync-bridge fork):
- β Proper fork relationship to original project
- β Clean, organized codebase
- β Professional documentation
- β Started fresh at v1.0.0
- β All features preserved and enhanced
All future development happens here: https://github.com/cporcellijr/abs-kosync-bridge
- Submit issues there
- Get latest releases there
- Follow documentation there
This repository remains for historical reference only.
- β Filter by Currently Reading - Show only books in progress (0-99%)
- β Sort Options - Sort by Title, Progress, Status, or Last Sync
- β Booklore Integration - Auto-add matched books to Booklore shelf
- β Persistent Preferences - Filter and sort settings saved in browser
- β ABS Collection Auto-Add - Matched books automatically added to "Synced with KOReader" collection
- β Web UI - Visual dashboard with cover art and progress tracking
- β Batch Matching - Queue multiple books for sync setup
π Visual book matching with cover art
π Real-time 3-way progress tracking
π Auto-refresh every 30 seconds
π Search and filter books
π€ AI-powered audio transcription
π·οΈ Auto-organize in ABS collections
π Auto-organize in Booklore shelves
β‘ Smart filtering and sorting with saved preferences
- Running Audiobookshelf instance
- Running KOSync server
- (Optional) Running Storyteller for word highlighting
- (Optional) Running Booklore for ebook management
- Clone the repository:
git clone https://github.com/cporcellijr/abs-kosync-enhanced.git
cd abs-kosync-enhanced-
Edit
docker-compose.ymlwith your settings (see Configuration below) -
Start the container:
docker compose up -d- Access the web UI at
http://localhost:8080
| Variable | Description | Required | Default |
|---|---|---|---|
| Core Settings | |||
ABS_SERVER |
Audiobookshelf server URL | Yes | - |
ABS_KEY |
Audiobookshelf API key | Yes | - |
KOSYNC_SERVER |
KOSync server URL | Yes | - |
KOSYNC_USER |
KOSync username | Yes | - |
KOSYNC_KEY |
KOSync password | Yes | - |
TZ |
Timezone | No | America/New_York |
LOG_LEVEL |
Logging level | No | INFO |
| Storyteller | |||
STORYTELLER_DB_PATH |
Path to Storyteller database | No | - |
STORYTELLER_USER_ID |
Your Storyteller user UUID | No | - |
MONITOR_INTERVAL |
Readaloud check interval (seconds) | No | 3600 |
| Booklore (v1.0.4+) | |||
BOOKLORE_SERVER |
Booklore server URL | No | - |
BOOKLORE_USER |
Booklore username | No | - |
BOOKLORE_PASSWORD |
Booklore password | No | - |
BOOKLORE_SHELF_NAME |
Shelf name for synced books | No | "Linked to ABS" |
| Mount Point | Purpose | Example |
|---|---|---|
/books |
Your EPUB collection | /path/to/LargeEPUBs |
/data |
Sync state and mappings | /path/to/abs_kosync/data |
/media_books |
Storyteller processing folder | /path/to/Books |
/audiobooks |
Audiobookshelf library root | /path/to/Audiobooks |
/storyteller_data |
Storyteller database location | /path/to/Storyteller |
# Connect to Storyteller database
sqlite3 /path/to/storyteller.db
# Get your user ID
SELECT id, username FROM user;services:
abs-kosync-web:
build: .
container_name: abs_kosync_web
restart: unless-stopped
command: python /app/web_server.py
environment:
# Core Settings
- TZ=America/New_York
- LOG_LEVEL=INFO
# Audiobookshelf
- ABS_SERVER=https://audiobookshelf.example.com
- ABS_KEY=your_abs_api_key
# KOSync
- KOSYNC_SERVER=https://kosync.example.com
- KOSYNC_USER=your_username
- KOSYNC_KEY=your_password
# Storyteller Integration (Optional)
- STORYTELLER_DB_PATH=/storyteller_data/storyteller.db
- STORYTELLER_USER_ID=your-uuid-from-db
- MONITOR_INTERVAL=3600
# Booklore Integration (Optional - v1.0.4+)
- BOOKLORE_SERVER=https://booklore.example.com
- BOOKLORE_USER=your_booklore_username
- BOOKLORE_PASSWORD=your_booklore_password
- BOOKLORE_SHELF_NAME=Linked to ABS
volumes:
# Core sync data
- ./data:/data
# Book locations
- /path/to/LargeEPUBs:/books
- /path/to/Audiobooks:/audiobooks
# Storyteller integration (Optional)
- /path/to/Books:/media_books
- /path/to/Storyteller:/storyteller_data
# File overrides (see Technical Details)
- ./main.py:/app/src/main.py
- ./storyteller_db.py:/app/src/storyteller_db.py
- ./web_server.py:/app/web_server.py
- ./templates:/app/templates
ports:
- 8080:5757
networks:
- your-network
networks:
your-network:
external: true- Click "Single Match" or "Batch Match"
- Use search to filter books
- Click an audiobook cover to select it
- Choose the matching EPUB from dropdown
- Click "Create Mapping"
Auto-Organization:
- β Book automatically added to ABS collection "Synced with KOReader"
- β Book automatically added to Booklore shelf (if configured)
Sort Options:
- Title (A-Z)
- Progress (highest to lowest)
- Status (active, pending, failed)
- Last Sync (most recent first)
Filter:
- Toggle "Show Only Currently Reading" to see books with 0-99% progress
- Settings persist across page refreshes
The Book Linker automates Storyteller processing:
- Navigate to "Book Linker"
- Search for a book title/author
- Select EPUB(s) and audiobook(s)
- Click "Process Selected"
- Files are copied to
/media_booksfor Storyteller - Monitor automatically detects completed
(readaloud).epubfiles - Processed files moved back to
/booksand cleanup occurs
Manual Check: Click "Check Now" to trigger monitor immediately (default: checks hourly)
- Dashboard shows all active mappings with unified progress bars
- Three-way progress display: π§ Audiobook | π KOReader | π Storyteller
- Auto-refreshes every 30 seconds
- Sort by title, progress, status, or last sync time
- Filter to show only currently reading books
This enhanced version modifies the original 2-way sync to include Storyteller:
Original: ABS β KoSync (2-way)
Enhanced: ABS β KoSync β Storyteller (3-way)
Key Changes:
main.py- Enhanced with Storyteller sync logicstoryteller_db.py- New Storyteller database clientweb_server.py- Web UI with Book Linker and integrations
abs-kosync-enhanced/
βββ README.md
βββ dockerfile # Builds on base image, adds Flask
βββ docker-compose.yml
β
# Core sync files (override base image):
βββ main.py # β οΈ Enhanced 3-way sync
βββ storyteller_db.py # New Storyteller integration
βββ api_clients.py # Enhanced with integrations
βββ ebook_utils.py # Enhanced EPUB parsing
βββ transcriber.py # AI transcription
β
# Web UI files:
βββ web_server.py # Flask web server + Book Linker
βββ templates/
βββ index.html # Dashboard with sort/filter
βββ match.html # Single mapping
βββ batch_match.html # Batch queue
βββ book_linker.html # Storyteller workflow
The base 00jlich/abs-kosync-bridge image only supports 2-way sync. To add Storyteller:
- We override
main.pywith our enhanced 3-way version - We add
storyteller_db.pyas a new dependency - We add
web_server.pyfor the web interface
This approach lets you:
- β Pull upstream updates from the base image
- β Keep your enhancements separate
- β Easily enable/disable features
ABS Collections (v1.0.3+): When you create a mapping, the audiobook is automatically added to a collection named "Synced with KOReader" in Audiobookshelf. The collection is created if it doesn't exist.
Booklore Shelves (v1.0.4+): When you create a mapping, the ebook is automatically added to a Booklore shelf (default: "Linked to ABS"). Configure with:
BOOKLORE_SERVER- Your Booklore instance URLBOOKLORE_USER- Your Booklore usernameBOOKLORE_PASSWORD- Your Booklore passwordBOOKLORE_SHELF_NAME- Custom shelf name (optional)
If Booklore is not configured, this feature is silently skipped.
# Pull latest base image
docker pull 00jlich/abs-kosync-bridge:latest
# Rebuild with your enhancements
docker compose build --no-cache
# Restart
docker compose up -d- Verify
STORYTELLER_DB_PATHpoints to actual database - Check
STORYTELLER_USER_IDmatches your user in the database - Ensure
/storyteller_datavolume is mounted correctly
- Check monitor logs:
docker logs abs_kosync_web - Verify
/media_booksand/audiobooksvolumes are correct - Files must be >10 minutes old before processing (safety check)
- Large audiobooks are auto-split into 45min chunks
- Check available RAM (transcription is memory-intensive)
- Review logs for specific errors
- Verify all
BOOKLORE_*environment variables are set - Check Booklore server is accessible from container
- Ensure ebook filename in
/booksmatches filename in Booklore - Check logs for authentication errors
- Verify
ABS_KEYhas permission to create collections - Check logs for API errors
- Ensure ABS server is accessible
Built on abs-kosync-bridge by 00jlich
MIT