- Add KOReader sync endpoints to main application router - Create Bruno API collection for testing KOReader endpoints - Add integration tests for KOReader functionality - Include comprehensive README with setup instructions - Test coverage for progress, metadata, library, and bookmarks sync - Part of Phase 3 KOReader Integration implementation
KOReader Integration
Overview
Bookmann provides full Calibre-compatible wireless sync for KOReader devices, enabling seamless reading progress, highlights, and notes synchronization.
Setup
1. Register Your Device
First, register your KOReader device with Bookmann:
POST /api/devices/register
{
"device_name": "My Kindle Paperwhite",
"device_type": "koreader",
"device_identifier": "unique-hardware-id"
}
You'll receive:
- A registration URL to approve the device
- A QR code for easy setup
- Setup instructions for your device type
2. Approve Device
Visit the approval URL in your web browser (or scan the QR code) to authenticate the device.
3. Configure KOReader
In KOReader settings, set:
- Calibre wireless URL:
https://your-bookmann-domain.com/api/sync/koreader - Enable wireless sync: ON
- Sync frequency: Every page turn (recommended)
4. Enter Device Token
After approval, you'll receive a device token. Add this to KOReader:
- Settings → Wireless sync → Password
- Paste the token:
dev_xxxxx...
API Endpoints
Sync Progress
Updates reading progress for one or more books.
POST /api/sync/koreader/progress
Authorization: Bearer {device_token}
Content-Type: application/json
{
"books": [
{
"uuid": "book-uuid",
"title": "Book Title",
"authors": ["Author Name"],
"percentage": 0.45,
"progress": 0.45,
"chapter": 5,
"character": 15432,
"epubcfi": "epubcfi(/6/4/2:15)",
"page": 89,
"total_pages": 200,
"last_read": "2026-01-30T20:00:00Z"
}
],
"sync_mode": "immediate"
}
Response (202 Accepted):
{
"sync_status": "accepted",
"books_synced": 1,
"conflicts": [],
"timestamp": "2026-01-30T20:00:00Z",
"device_updated": true
}
Get Book Metadata
Fetches progress and annotations for a specific book.
GET /api/sync/koreader/metadata/{book_uuid}
Authorization: Bearer {device_token}
Response (200 OK):
{
"uuid": "book-uuid",
"title": "Book Title",
"authors": ["Author Name"],
"progress": {
"percentage": 0.45,
"chapter": 5,
"epubcfi": "epubcfi(/6/4/2:15)",
"character": 15432,
"page": 89,
"total_pages": 200
},
"annotations": {
"highlights": [
{
"text": "highlighted text",
"pos0": "epubcfi(/6/4/2:15)",
"pos1": "epubcfi(/6/4/2:20)",
"color": "#ffff00",
"datetime": "2026-01-30T19:55:00Z"
}
],
"notes": [
{
"text": "My note",
"pos0": "epubcfi(/6/4/2:15)",
"datetime": "2026-01-30T19:55:00Z"
}
]
},
"last_sync": "2026-01-30T20:00:00Z"
}
Get Library
Fetches all books available for sync.
GET /api/sync/koreader/library
Authorization: Bearer {device_token}
Response (200 OK):
{
"library_sync": [
{
"uuid": "book-uuid",
"title": "Book Title",
"author": "Author Name",
"content_type": "6",
"percent_read": 45.0,
"pages_remaining": 115,
"bookmark_count": 3,
"last_modified": "2026-01-30T20:00:00Z"
}
],
"total_books": 10,
"last_sync": "2026-01-30T20:00:00Z"
}
Sync Bookmarks/Notes/Highlights
Syncs annotations for a specific book.
POST /api/sync/koreader/bookmarks
Authorization: Bearer {device_token}
Content-Type: application/json
{
"book_uuid": "book-uuid",
"bookmarks": [
{
"chapter": 3,
"datetime": "2026-01-30T19:55:00Z",
"pos0": "epubcfi(/6/4/2:15)",
"page": 45,
"text": "Bookmarked text",
"type": "bookmark"
}
],
"highlights": [
{
"chapter": 3,
"datetime": "2026-01-30T19:55:00Z",
"pos0": "epubcfi(/6/4/2:15)",
"pos1": "epubcfi(/6/4/2:20)",
"page": 45,
"text": "highlighted text",
"color": "#ffff00"
}
],
"notes": [
{
"chapter": 3,
"datetime": "2026-01-30T19:55:00Z",
"pos0": "epubcfi(/6/4/2:15)",
"notes": "My note content",
"page": 45
}
]
}
Response (200 OK):
{
"sync_status": "completed",
"bookmarks_synced": 1,
"notes_synced": 1,
"highlights_synced": 1,
"total_synced": 3,
"timestamp": "2026-01-30T20:00:00Z"
}
Sync Modes
Immediate Mode (Recommended)
Syncs on every page turn for real-time updates across all devices.
{ "sync_mode": "immediate" }
Checkpoint Mode
Syncs periodically to save bandwidth.
{
"sync_mode": "checkpoint",
"checkpoint_id": "checkpoint-uuid",
"since_timestamp": "2026-01-30T19:00:00Z"
}
Rate Limits
- Sync requests: 60/minute
- Progress updates: 120/minute
- Metadata requests: 30/minute
Device Matching
Bookmann tries multiple strategies to match books:
- By UUID: Most reliable if your book files have unique IDs
- By file path: Matches exact file path
- By title + author: Fallback for unmatched books
Conflict Resolution
When the same book is read on multiple devices within 5 minutes:
- Auto-resolution uses "most recent progress wins"
- Conflicts are logged for review
- Users can manually resolve conflicts via the web UI
Troubleshooting
Sync Not Working
- Check device token: Ensure token is valid and not revoked
- Verify sync enabled: Device must have
sync_enabled: true - Check rate limits: Device may be rate-limited
- Book matching: Ensure books can be matched by UUID, path, or title
Progress Not Updating
- Verify percentage value: Must be between 0.0 and 1.0
- Check book ownership: User must have access to the book
- Review sync logs: Check for error messages
Authentication Errors
- Token expired: Re-register device
- Device revoked: Check device status in web UI
- Invalid token format: Ensure
Bearer dev_xxxxx...format
Testing
Use the Bruno API collection in /bruno/koreader/ to test endpoints:
Sync Progress.bru- Test progress syncGet Book Metadata.bru- Test metadata retrievalGet Library.bru- Test library syncSync Bookmarks.bru- Test annotation sync
Required variables:
baseUrl- Your Bookmann server URLdevice_token- Device authentication tokenbook_uuid- UUID of a test book
Implementation Notes
- Compatible with Calibre wireless protocol
- Supports EPUB CFI for precise locations
- Handles reflowable and fixed-layout formats
- Bidirectional sync (KOReader ↔ Bookmann)
- Real-time updates via WebSocket (coming in Phase 3b)
Next Steps
See Phase 3 implementation guide for:
- WebSocket real-time sync
- Advanced conflict resolution
- Offline sync queue management
- Performance optimization