I 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.

I 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.

So I built my own thing: Varbook, a small self-hosted EPUB library.

Varbook library on mobile: dark UI with a "Continue Reading" section showing progress bars and reading time, search bar, status/sort filters, and a book cover grid below

You drop EPUBs into it in one click. From there:

  • 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.
  • The server exposes everything over OPDS, so any compatible app works (KOReader, Moon+ Reader, etc.).
  • I also wrote a KOReader plugin that pushes/pulls your reading position to the server in a single gesture.

Varbook EPUB reader on mobile: dark theme, large serif font, chapter title and progress bar at the bottom showing 52.4%, reading time, and page count

My actual daily workflow:

  • 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.
  • I read.
  • Done reading: tap the top-right corner again → Wi-Fi on, my reading time + position sync to the server.
  • 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.
  • Evening: back to the Kobo, which picks up my position from the phone.

All of this with fully open-source software, no commercial service in the loop, my books staying on my own server.

The 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.

Varbook reading statistics on mobile: KPI cards (17 books, 3 finished, 80h59m reading time, 2017 sessions), book status breakdown, and reading time by device (KOReader 8.8h, Moon+ 0.6h, Web Reader 71.6h)

It’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.

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.

There’s a free public instance if you just want to try it without installing anything: https://varbook.hophop.be/

Happy 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.

  • n2024@lemmy.worldOP
    link
    fedilink
    English
    arrow-up
    9
    arrow-down
    2
    ·
    5 hours ago

    Okay folks, a word on the vibe-coding thing, since I can see it stirred up a lot and clearly rubs some of you the wrong way. Let me just drop a few numbers so you have an idea of what this actually is.

    I started this project in February. I work on it mostly in the evenings, after my day job. Over ~4 months I estimate I’ve put around 100 hours into it. I use it every single day, and I’ve tested and optimized it quite a bit. So no, this isn’t some thing I threw together in 2 hours with zero investment.

    Yes, I built it with AI in the loop. But without it, I’d never have had the time to make something this “polished” on the side. And honestly, why would I deny myself that on a personal project? When a carpenter builds a piece of furniture, I don’t hold it against him for using a power drill instead of a hand brace.

    That’s it, just a small rant. I won’t engage with the AI criticism beyond this. Back to talking about the actual software for anyone interested. Cheers.

    • pech@lemmy.world
      link
      fedilink
      English
      arrow-up
      6
      ·
      5 hours ago

      I bet you used a keyboard, instead of a magnetic needle and a steady hand to code this too.

      /s

      For real though, nice work. 🎉