Building My Own Kindle Ecosystem

I recently got nerd sniped by the miniature Xteink readers. I’ve always been interested in handheld e-reader devices like the BOOX Palma, but I’ve never been able to convince myself that it was a worthwhile investment. The X4 Pro was only 99 bucks, so I decided to pull the trigger and try it out.

As a result, I’ve been forced to rethink how I manage my reading media. Historically, I’ve been basic, living fully within the Amazon ecosystem. I almost always get my books from the library using Libby. Occasionally, I will buy a book from Amazon when I don’t want to wait, and there are some very rare occasions when I will spin up Calibre to sideload a book that has been difficult to obtain.

This setup works great when you exist fully within the Kindle ecosystem, but the Xteink devices forced me to rethink this entirely.

My original plan was to just have a basic Calibre setup where books live on my laptop and I sync them to the Kindle or X4 depending on what I’m reading and manage my progress in each book myself. But then I wondered: can I do even better? What if I could create a Kindle-esque reading setup without using Amazon? It turns out that with KOReader, CrossPoint, and BookOrbit, I could emulate so much of what Amazon provides with my own hardware. Loop in Tailscale so that I could access it from everywhere, and now I have a fully featured e-reading setup where I can read on many devices and automatically sync the reading state between them.

As I embarked on this journey, I got incredibly lucky with the Kindle jailbreak process. I didn’t realize that jailbreaking wasn’t something that was always possible, and you have to rely on a jailbreak existing for the firmware that you are running. Five days before I bought my X4 Pro, the Kindle Modding community released a new jailbreak, which allowed me to root the device and install KOReader, making all of the following possible.

My final setup looks like this:

+-------------------------- Tailscale tailnet ----------------------------+
|                                                                         |
|  +----------------------+        +------------------------------+       |
|  | Home server          |<------>| Kindle                       |       |
|  | BookOrbit            |        | KOReader                     |       |
|  |                      |        +------------------------------+       |
|  | - Library            |<------>| X4 Pro                       |       |
|  | - OPDS catalog       |        | CrossPoint                   |       |
|  | - KOReader sync      |        +------------------------------+       |
|  | - Web reader         |<------>| iPhone                       |       |
|  +----------------------+        | BookOrbit web app            |       |
|                                  +------------------------------+       |
|                                                                         |
+-------------------------------------------------------------------------+

BookOrbit runs continuously on my hardware at home and provides the KOReader syncing endpoint as well as the OPDS catalog, so I can download and manage my library remotely. Saving BookOrbit as a bookmark on my iPhone’s home screen makes it feel like a real application, and it allows me to access the web e-reader on the go when I don’t have an e-reader with me.

Running Tailscale on the Kindle was rather easy, given the existing koreader-tailscale plugin, which did a lot of the heavy lifting. You do have to run traffic through the local tailscale HTTP Proxy as the tailscale integration runs in userspace which breaks a lot of the outbound connections to the public internet. In order to get around this, I hacked in some convenience shortcuts for turning it on and off. Long pressing the left bottom corner toggles the tailscale integration on/off, but otherwise this integration was straightforward.

The biggest complication was Tailscale on my X4 Pro. Originally, I had been resigned to it not being possible because there is no official Tailscale client for ESP32 devices. But then I found microlink, an existing GitHub repo that provides Tailscale integration for ESP32 devices. I was able to fix some bugs in my microlink fork and then integrate it with my CrossPoint fork so that I can dynamically connect to Tailscale when communicating with internal IPs or MagicDNS entries in my tailnet.

Ta-da! I finally had a fully functional e-reading setup that I could access from anywhere. Syncing my reading state between devices is trivial and reliable. I am constantly switching between the X4 Pro when I’m on the go and the Kindle when I’m doing longer reading sessions in the comfort of my own home. This experience has given me a much better understanding of my devices and has unlocked my ability to customize them. Koreader definitely feels like a step up in reading in the reading experience as opposed to the Kindle native software. It is more responsive and all around a much snappier experience.

An unexpected bonus is just the pleasant user experience that BookOrbit offers. I was not expecting such a complete product offering which the amount of features that it exposes. It’s even gone as far as replacing GoodReads as my main tool for tracking books that I’ve read and my opinion of them.

As I look to the future, I plan to improve my homelab setup by moving it off my gaming PC and onto a dedicated mini PC. I plan to integrate CrossPoint more closely with BookOrbit so that I can properly track stats and reading sessions with the same fidelity as KOReader.

Happy reading.