Home / Blog Menu ↓

Blog: #bookshelf

Bookshelf in 2024

In writing my /uses page, I realized it’s been a little while since I last showed what my Bookshelf app looks like. Time for an update. (What is Bookshelf, you ask? A web app I wrote to track my reading.)

Here’s the current state, and note that I took this screenshot last night, so the monthly stats are for February:


I forgot to mention this back in 2020, but the app started in late 2011 as Bookkeeper. A few years later I rewrote it in Python (Django) and renamed it (because o-o k-k e-e). I’m pretty happy with its current incarnation and use it every day except Sundays. My brain likes those stats. It really does. I’m sure I’d still read a lot even without them, but boy, the stats certainly motivate me to spend more time reading. (Well, some days more than others.)


  • Top left is monthly stats (genre breakdown, pages read, books read this month to date, average pages per day, and how far into the month we are).
  • Top right is yearly stats.
  • The bar chart tracks how many pages I’ve read over the past couple weeks, with each color representing a different genre (red is nonfiction, green is fantasy, blue is science fiction, brown is general fiction, etc.). The page count gets brighter the closer I get to my goal of 100 pages per day. And yes, the dashed gray dividers are one pixel off. I need to fix that.
  • For each book, I have some metadata under the title and author: percentage completed, number of pages I’ve read so far (included because in ebook land most books don’t start on page 1), number of days I’ve been reading the book, how many days are left at my current rate, how many pages per day I’m averaging so far, how many pages I’ve read today (this is used as my current rate if it’s greater than my average pages per day, and this is red if it’s lower than my average pages per day, as motivation to maintain my rate for each book), and how many pages are left.
  • The part at the right of each book row is the current page and how long it’s been since I last read that book (which also affects the background color). I tap the page number to enter whatever page I’m on. If it’s a book in Libby, by the way, I tag the book that way when adding it and it’ll adjust how it counts the pages (it takes around three Libby screens to get to a page the way I’m counting it).
  • The very faint ellipsis button in the lower right opens a menu with links to add books, search, see previous reads, and see stats for previous years.

tl;dr I’m nerdier than you thought.

Reply via email

Since the phone is now the window to the soul, here’s my current home screen:


Things of possible interest (or more likely imminent boredom):

  • 30 Seconds is a system shortcut I made that starts a thirty-second timer, which I use for my physical therapy exercises morning and night (I used to use a third-party app until I realized I didn’t need one)
  • Projectile (an app version of my project tracker), Bookshelf (reading tracker), Slash (blog engine), Storybook (writing app), Momentum (time tracker), and Liszt (to-do list) are all PWAs I’ve built
  • While it’s kind of weird (they’re the same exact app), I love that Marvin SxS is on the App Store alongside Marvin; I use the dark-background Marvin for fiction and the white-background Marvin for nonfiction
  • From left, the three bottom apps in the dock are Codex (notes app), Saturn (launcher), and Gate (Drafts clone), which are also PWAs I’ve built, and clearly I have a problem
  • I currently have 136 tabs open in mobile Safari, and clearly I have two problems

Reply via email

Bookshelf intro

Yet another entry in the forever-long series talking about my personal productivity tools.

Bookshelf is my reading tracking app. It’s a Python app running Django. The name comes from, uh, the thing that holds books.


Behold the books:


At the top there’s the stats panel, which shows how much I read the last six days with color coding for the genre tags (and yes, Wednesday and Friday I didn’t meet my 100-pages-per-day goal), my page total so far this month (932), how many books I’ve finished so far this month (2), and how much of my reading this month has come from each tag (I usually try to read around 50% nonfiction, but I usually fail).

And then there’s the book list itself. Title, progress bar with some extra data (including how long since I started the book), current page number (clicking this opens a panel where I can record the page I’m on along with a comment), and how long it’s been since my last entry.

Each book has a staleness limit (default is five days), where if I haven’t read the book at all in that period of time, it changes the color of the title to a glaring, awful red, and that’s sufficient motivation for me to get back to that book. (To be honest, lately I haven’t seen it come up much since I’ve been reading only a few books at a time, but in those crazy days when I was reading twenty to thirty books at a time, I saw it a lot.)

Also: the sixth book (in case you were wondering) is A Disciple’s Life, which is only visible on Sundays (I reserve it for Sunday reading).

And the mobile view, for the heck of it, and since it’s the one I use almost all of the time:


There’s also a stats page, since the statistics are surprisingly helpful in motivating me to make time for reading:


(Yes, as of a couple days ago I’ve read more this year so far than all of last year in total. This makes me inordinately proud even though it really doesn’t matter.)

And, lastly, the hopefully self-evident history page:


How I use Bookshelf

On my phone, I have it saved to my homescreen as a PWA, and that’s primarily where I use it, since I mainly read on my phone these days. On my laptop, I have it open in Firefox as a pinned tab.

I use Bookshelf every day to track my reading, both for individual books and for my daily/monthly reading goals. It’s handy, too, as a bookmark that toddlers can’t pull out.

The future

The desktop view needs some love, particularly that stats page. (I added those genre tags to it a month or two ago and realize now that I never actually looked at the desktop version. Whoops.)

Also (this should be no surprise by now), I’m planning to switch it to FastAPI along with plain text files for storage, for the same reasons I gave in those other posts.

Reply via email