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.

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.

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.

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/
- Full write-up on my blog: https://trucs.hophop.be/en/blog/varbook-bibliotheque-epub-self-hosted
- Code: https://github.com/ndieschburg/varbook
- KOReader plugin: https://github.com/ndieschburg/varbook.koplugin
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.



That site appears to look for superficial signals (commit messages, claude.MD file). I wouldn’t put too much faith in it for detecting “slop”.
Ironically, the best way to see if something is slop (if a person was so inclined) is to point Claude or ChatGPT at a repo or code example and ask “did a human code this? Why or why not?”.
Unsteered Ai tends to produce immaculate code with logic gaps. Humans tend to produce weird shit that somehow works and actually makes sense when you step back and look at it.
Probably the best tell is when code clearly bears the marks of “oh, this guy got fucked by this problem; I can see the patch job. It’s not elegant but it makes sense if X occurred, which is what Y appears to be for.”
I believe “opinionated” and “belt and suspenders” is the Americanism for that. Kludge and bodge are also true.
IMHO and YMMV.
making an analysis of the codebase itself, especially with ai, is gonna lead to very subjective results. this website is good because it finds telltale sings, like commit messages. if a commit says “written by claude”, you can’t really deny it! not to mention that for someone who doesn’t want to use ai because of ethical reasons, “just ask ai” is not gonna cut it.
of course the website is not perfect. if someone hides their tracks, it won’t detect it. and it can have false positives: it’s gonna detect any agents.md (or similar) file, even one that says “this project does not accept ai-generated contributions” (example), and i’ve seen a case where it labeled a commit as generated by claude because it came from someone with an anthropic.com email address (i looked, and this person is not an ai but just an employee of anthropic lol). then, as with any tool, it becomes your job to do your due diligence and check for these sorts of things.