{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreiba5neof6cqq63pss56vtru2y654ghkqfk7i42jk3gyp57x6odsga",
    "uri": "at://did:plc:kdqmqcktioifzh7pkptg7msh/app.bsky.feed.post/3mo4ozlstydx2"
  },
  "coverImage": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreifucmmsnrvzn7lzyc3snroojdzskcg7r36uu33nczwgps3uhpn7um"
    },
    "mimeType": "image/png",
    "size": 111600
  },
  "path": "/post/21656",
  "publishedAt": "2026-06-11T20:52:17.000Z",
  "site": "https://lemmy.porn",
  "tags": [
    "Selfhosted",
    "n2024",
    "50 comments",
    "https://varbook.hophop.be/",
    "varbook.hophop.be",
    "…hophop.be/…/varbook-bibliotheque-epub-self-hoste…",
    "github.com/ndieschburg/varbook",
    "github.com/ndieschburg/varbook.koplugin"
  ],
  "textContent": "submitted by n2024 to selfhosted\n215 points | 50 comments\nhttps://varbook.hophop.be/\n\nI read every single day. At home it’s on my Kobo running KOReader (yes, I’m _that_ open-source guy), and I love it. The problem: I don’t always have the e-reader on me. On the train, at work, waiting somewhere — I just have my phone.\n\nI tried Kobo’s own Android app to bridge the gap and… I really didn’t like it. Promos everywhere, adding your own books is a pain, the reader itself feels clunky, and the Wi-Fi handling is annoying.\n\nSo I built my own thing: **Varbook** , a small self-hosted EPUB library.\n\nYou drop EPUBs into it in one click. From there:\n\n  * They’re readable on your phone through a simple but well-made **PWA**. Books are cached locally, so you can read offline; when you’re back online your reading position syncs to the server.\n  * The server exposes everything over **OPDS** , so any compatible app works (KOReader, Moon+ Reader, etc.).\n  * I also wrote a **KOReader plugin** that pushes/pulls your reading position to the server in a single gesture.\n\n\n\nMy actual daily workflow:\n\n  * **Evening, at home:** I wake up my Kobo in KOReader, tap the top-right corner → Wi-Fi turns on, my current book jumps to the right position, Wi-Fi turns back off to save battery.\n  * I read.\n  * **Done reading:** tap the top-right corner again → Wi-Fi on, my reading time + position sync to the server.\n  * **Next day, at work:** I open the PWA on my phone. It drops me exactly where I left off, and syncs my position on every page turn.\n  * **Evening:** back to the Kobo, which picks up my position from the phone.\n\n\n\nAll of this with fully open-source software, no commercial service in the loop, my books staying on my own server.\n\nThe trickiest part was cross-device position sync — every reader engine (epub.js in the browser, KOReader’s CREngine, Moon+) tracks position differently. Varbook uses a “pivot” format based on EPUB spine items (chapter index + percentage) so your position survives the jump from one device to another without throwing you 30 pages off.\n\nIt’s **open source (MIT)** , built with Laravel + React, and ships as a single Docker container (SQLite by default, no external DB needed). The entire UI is translated in **English, French, and Spanish**.\n\n**Honest disclaimer:** a good chunk of this is vibe-coded. That said, I’ve been a developer for 20 years, so it’s _opinionated_ vibe-coding — I know what I’m looking at. It’s been used daily and intensively by about 5 people for the last 3 months, and I keep improving it regularly. It’s not bug-free, but I’d call it reasonably stable. I’m being upfront so you know what you’re getting into.\n\nThere’s a **free public instance if you just want to try it without installing anything** : varbook.hophop.be\n\n  * Full write-up on my blog: …hophop.be/…/varbook-bibliotheque-epub-self-hoste…\n  * Code: github.com/ndieschburg/varbook\n  * KOReader plugin: github.com/ndieschburg/varbook.koplugin\n\n\n\nHappy to answer questions or hear what’s missing — it scratches my own itch, but I’d love to know if it’s useful to anyone else.",
  "title": "I read every day but rarely have my e-reader on me — so I built a self-hosted EPUB library that syncs my reading position between my Kobo and my phone"
}