Building Myself a Reading Tracker App with Airtable and Deno Fresh, Part 1

I’m a bit of a fanatic when it comes to my library of books. When I’m not reading, I’m obsessing over which editions are the best, what shelf organization method to employ on any given week, and how I can best keep track of what I read.

For me, an effective reading tracker would not only provide a chronological list of titles read, but would uncover the manifold associations of influence and interest that are constantly being formed from the books I read. Like all libraries, my library carries a unique personal signature that has developed out of such a web of connections, and part of the joy of reading is the continual rediscovery of how and where ideas and themes overlap, especially when such connections might not immediately be evident.

Dark-themed app dashboard showing the cover, book information, and reading activity stats for the book Left Hand of Darkness by Ursula K. Le Guin.
A preview of what I’m building with Airtable and Deno Fresh.

The Ideal Reading Tracker App

On a less lofty note, there are a number of other considerations—some practical, some aesthetic, some undoubtedly vain—that I’ve collected from experiences with all the ways I’ve tried to track my reading, whether that is a simple spreadsheet or a site like Goodreads. Here is a list of some of those considerations, or what is essentially my wishlist for the ideal reading tracker app (with the open acknowledgment that many of these are gripes directed specifically at Goodreads):

  • Sensible feeds. In my opinion, the most annoying thing about Goodreads is how its social media-type activity feed logs a date for every possible user update or interaction. Here is a novel idea (sorry for the pun): when I track reading activity, I want to track when I start or finish a book, or when I post a review. In other words, I want the feed to reflect the actual dates I interacted with the book in my day-to-day life, and not when I made the change to the underlying data.
  • Linked but separate category types like activity, shelves, and reading paths. A book can be categorized in many ways. Goodreads treats everything under one big umbrella of “shelf,” but I want simultaneously more separation and more fluidity in how books are categorized. In my ideal schema, an activity would track if and when a book was read; a shelf would associate books of a particular theme; and a reading path would group books of any shelf in a larger meta-category incorporating both chronology and theme. This last idea is the most exciting to me, as it traces the chronological development of reading in a given area—how this book led to that book led to this author, and so on. But despite their definitional separation, these categories would all be linked in an organic way with each other.
  • A way to track progress beyond the “reading” and “finished” binary. “I read this book” can be an ambiguous statement. Well, at least for me—I’ve recently made peace with the fact that I don’t read all my books cover to cover. But that doesn’t mean I didn’t get something, or even the main argument/theme/message, out of a particular book. (A lot hinges on type and genre. I couldn’t leave a novel unfinished, for example, but a tortuous book on theory might lend itself to skipping around.) So in some cases I would want a way to mark a book as “read” but not necessarily “finished.”
  • Data customization. There is a lot of data out there, some of it good and some of it bad or superfluous. It would be great to have available a lot of meta-information about the books I’m tracking (publisher, publish date, edition info, etc.), but it would also be nice to be able to exclude or edit some of that data (e.g., if it’s inaccurate data or if I want information about a different edition).
  • Public APIs. How to get book data in the first place? And how to use my reading data where I want, for example on this blog to show my current reading list? Both of these problems can be solved with public APIs that make data accessible to other parts of the web. As many companies increasingly put up walls around what can accessed (Goodreads, which is owned by Amazon, yanked all access to their API years ago), it is imperative for me to have some measure of access to and control over the data I’m using and creating.
  • Good design and luxurious displays. Good design is a matter of both compelling visuals/typography and intuitive functionality, and the lack of both is a big reason why it hurts to use Goodreads, whose cramped style is a major eyesore and whose navigation is confusing. Also, book covers: covers are magnificent, and I want to be able to see them in all their glory. When browsing through my reading data, I want it to feel akin to stepping into an actual room and looking at my actual books, but with hypertext goggles on.
  • Control over social interactions. This might not be true for everyone, but I don’t get much out of the social component of sites like Goodreads. It’s nice to read a few comments and have someone like your review, but that’s about it. When I think about what real social engagement with my books looks like, it would be cool for people to offer recommendations and like or maybe respond to my reviews—something more akin to a blog or traditional feed than a social media experience.

I gave Goodreads a good try for a long while, but its limitations and the considerations above made me look elsewhere for a better reading tracker experience. I also tried some of the the newer and more stylish Goodreads replacement sites like and libib, but I think they too have some of the same shortcomings. So it was out of necessity that I did what any normal person would do—I set to work building my own reading tracker app. 😅

In the next few posts, I’ll unpack more about how I set things up, and how I am using Airtable as a backend and the Deno Fresh framework as a frontend for my own customized reading tracker app.