I really like e-books. I've hoarded about 500 of them over the years. I've collected them from a variety of sources, in plenty of formats, and I've created what I consider to be a quite effective way of managing all of that.
Calibre in the center
Like plenty of other e-book fans out there, Calibre is in the center of my setup. Each time I acquire an e-book, I drag and drop it from my downloads folder into Calibre, and use my pal Apprentice Alf to get rid of the awful DRM if it's present.
In order to utilize Calibre to its fullest, I have defined a couple of custom columns:
- Read: A boolean (yes/no) value that indicates whether I've read the book or not.
- Pages: A field that gets populated by the Count Pages plugin.
- Percentage: Marks my reading position when I'm reading the book, so that I can switch between different devices.
Magic part: The web component
An ebook folder on my laptop gets automatically synced to my server using Nextcloud . That server is also running an alternative web interface for Calibre (janeczku/calibre-web ). As a result, moments after I drag and drop a new e-book to Calibre on my laptop, it also becomes available via a web interface.
This web interface gives me a few key features that I wouldn't get otherwise. Most notably:
I can sort my e-books into shelves. This is a crucial feature that is pretty inexplicably missing from within Calibre out of the box, though it can be achieved with a custom tag-like column. I personally find it simpler to maintain shelves from the web interface.
It has an integrated OPDS feed, allowing me to easily download my e-books to my phone straight from my preferred e-book reading app: Moon+ Reader (note: OPDS support is a premium feature).
I can send my e-books to my e-reader. There's a button to transfer an e-book to my Kindle Paperwhite straight from my browser. If a conversion needs to be made (for example, from EPUB to MOBI), that gets done server-side automatically — no interaction necessary. After the conversion gets completed, the server sends an email with the e-book as an attachment to the email address associated with my e-reader.
I've used Goodreads for years, even though everything about it is broken . Once I've started to ignore all of the Goodreads' social features that I didn't actively use anyway, I've started to see it for what it really is: a list making app.
Specifically, Goodreads' main feature is allowing you to easily maintain three lists:
- Books you're planning on reading
- Books you're currently reading
- Books you've read
Once I've realized that, I came up with plenty of options on how to better manage those lists. Most of them ended up revolving around Markdown , since that's how I write all of my notes and blog posts. However, when I've discovered Calibre-Web, I went back to managing my lists in a browser tab. I have defined the following shelves:
- Books I've read (one shelf for each year since I keep track)
- My favorites
- To-read list
- Currently reading list
I add or move things from them from time to time, leave the rating for the book, and finally...
Make the end result public
As a final step in the chain, I have created a script that allow me to publish the list of books I've read on my website. Since Calibre-Web doesn't have an API, I ended up scraping my own server using Python Requests and BeautifulSoup . After about one hundred lines of spaghetti code gets executed, I end up with two files:
books-read.md, which goes straight to my CMS, allowing me to publicly share the list of books I have read, sorted by the year in which I've finished reading them.
reading-stats.json, which gets processed using Chart.js into bar charts that provide the answers to the following questions:
- How many books do I read per year?
- How many pages do they contain in total?
- What's the average rating I gave to the books I've finished reading?
The end results can be seen here:
Overall, I'm pretty satisfied with how well this system behaves with little to no maintenance needed (at least for now). The only improvement I could think of is that I want to create another page on my website showcasing my favorite books.