My E-Reader Setup

By Christopher Burg

I was a huge fan of the Amazon Kindle when it came out. E-Paper was a game changed for reading documents on electronic devices. Amazon also did an excellent job with its Kindle bookstore. However, as with all things technology, enshittification eventually settled in. The original Kindles all had cellular radios built-in. That was eventually dropped. Amazon decided to milk a few extra nickels out of users by selling ad supported devices and charging extra for devices that didn't display ads. The straw that broke the camel's back for me though was when they changed the DRM scheme. The original DRM scheme that Amazon used was easily broken with a Calibre plugin. This means that you could actually own the books you bought from the Kindle store. That was no possible after they changed the DRM scheme (although I suspect it was broken at some point). That means you could only rent books from the Kindle store and that wasn't acceptable to me.

I've relied heavily on physical books since. Used and sometimes even new physical books can often be had for less than what you pay for a Kindle version. With physical books, the seller also can't take them back whenever they decide to do so like Amazon can with Kindle books. The downside is that they take up a lot of space. Traveling with multiple physical books is much harder than traveling with an e-reader. There is also a plethora of free digital books available online. I prefer reading those on an e-reader than on my laptop or phone.

Some time ago I bought a Boox Palma 2 for traveling. The Palma 2 is a phone-ish sized e-paper device that runs Android. Because it's a certified Android device manufactured by a random Chinese company, I don't trust the device with personal data. But I also never had to sign into any accounts. Since it's a standard Android device, I installed Obtanium and used that to install KOReader from the code repository. I then used Calibre to synchronize my e-books to the device. I considered it my least effort but viable solution. It worked well. The downside was syncing progress between multiple devices. Since I relied on Calibre, I had to be running Calibre on my laptop and have the device connection feature running, which is not a secure protocol. This wasn't a big issue when I only had the Palma 2. It became a bigger issue when I ordered a Boox Go 6 (Gen II) because I didn't want to power up my laptop and start Calibre every time I wanted to sync information between my two e-readers.

KOReader has a built-in progress sync plugin and the server can be self-hosted. I thought about going this route, but I didn't want yet another server running on my network that I have to maintain. Instead I looked for options that could utilize my existing infrastructure. I settled on the AnnotationSync plugin. KOReader already has WebDAV support built-in, which means I can connect it to my Nextcloud server. By default, KOReader only synchronizes books stored on a WebDAV instanced with the local file system. It doesn't sync highlights, reading progress, etc. That's where AnnotationSync comes in. AnnotationSync synchronizes all of those extras.

This setup isn't as streamlined as the Kindle experience, but it's pretty good. More importantly, it's completely under my control. However, there is that minor point I brought up about not trusting the Boox devices. Fortunately with my setup, I can treat them like Internet of Things devices. I isolate them to a guest Wi-Fi network so they can't communicate with devices on my LAN. My Nextcloud server is available to them through the WAN interface so they connect like any other non-local device. I also created a separate account on my Nextcloud server for my KOReader devices. The account can only use the WebDAV functionality. I do share the directory storing my e-books with my main account so I can upload new e-books without logging into the KOReader account, but nothing from my account is shared with the KOReader account.

On each Boox device, I open up KOReader, log into the KOReader Nextcloud account in the application using a per-device app password, and synchronize from there. I consider this setup a good balance between security and usability. So far the setup has worked decently well.