Skip to content

KOReader Sync

KOReader sync lets you push and pull reading progress between KOReader and Grimmory. Read a few chapters on your e-reader, push the progress, and it shows up in Grimmory. Pick up on another device, pull the latest position, and continue where you left off.

Grimmory matches books by file content hash, so the same physical file must exist in both places. In practice this means KOReader needs to have downloaded the book from Grimmory (typically via OPDS) so the file bytes match. A book sideloaded from a different source won’t produce the same hash, and progress won’t link up.


Step 1: Configure KOReader Sync in Grimmory

Section titled “Step 1: Configure KOReader Sync in Grimmory”

Go to Settings > Devices in Grimmory. You’ll see the KOReader Settings section with an enable toggle, an API path, and username/password fields.

  1. Click Edit to unlock the credential fields
Grimmory Settings > Devices page showing KOReader Settings with Enable toggle, API Path, Username, and Password fields with an Edit button
  1. Enter a username and password for KOReader to authenticate with (these are KOReader-specific credentials, separate from your Grimmory login)
  2. Click Save
  3. Toggle Enable KOReader Sync on
  4. Copy the KOReader API Path shown (e.g., http://192.168.0.2:6060/api/koreader). You’ll need this in KOReader.
KOReader Settings with sync enabled, API path populated, username and password filled in, and Save button Settings > Users page showing the user list with permission columns including KOReader Sync

Open a book in KOReader to access the tools menu.

  1. Tap the tools icon (wrench) in the top toolbar, then select Progress sync
KOReader tools menu showing Progress sync option
  1. Tap Custom sync server and enter the API path you copied from Grimmory
KOReader Custom sync server dialog with the Grimmory API URL entered
  1. Tap Register / Login, enter the username and password you set in Grimmory, and tap Login
KOReader login dialog with username and password fields and Login button
  1. You’re connected. Use Push progress from this device now to send your current position to Grimmory, or Pull progress from other devices now to retrieve the latest position from Grimmory.
KOReader Progress sync menu showing Push and Pull options, along with auto-sync settings
  1. One important setting: tap Document matching method and make sure Binary is selected. This matches books by file content (the same method Grimmory uses), ensuring the right book gets the right progress.
KOReader Document matching method menu Binary option selected: "Only identical files will be kept in sync"

KOReader progress appears on the book’s detail page in Grimmory as KOReader Progress with a percentage and a green progress indicator.

Book detail page for Digital Fortress showing KOReader Progress at 21.1% alongside Grimmory Progress and other metadata

Click the reset icon next to the KOReader progress to clear it in Grimmory. This does not affect the reading position stored on your KOReader device.


ProblemWhat to check
Login fails in KOReaderMake sure the username and password match exactly what you set in Grimmory’s Devices settings. These are case-sensitive. Also verify the API path is reachable from your e-reader’s network.
Progress not appearing in GrimmoryTap Push progress from this device now in KOReader after reading. If auto-sync is off, progress doesn’t send automatically.
Wrong book gets the progressMake sure Document matching method is set to Binary, not Filename. Binary matches by file content hash, which is what Grimmory expects.
Sideloaded book won’t syncThe book file must be byte-identical to the one in Grimmory. Download it from Grimmory via OPDS to ensure the hashes match. A file from a different source (even the same title) will have a different hash.
API path not accessibleIf Grimmory is behind a reverse proxy, make sure /api/koreader/** paths are forwarded correctly. If using Docker, the API path shown in settings may use a container IP that isn’t reachable from your e-reader’s network. Use your external hostname or LAN IP instead.