Michael Wolf
Projects and thoughts from Cincinnati San Jose Oakland an undisclosed location in Grass Valley
Home Library Mastodon Nullbrook RSS
Bookfool: A Personal Book Index
Last edited - 2026/08/26

Two full bookshelves and a messy desk framing a window looking out onto some woodland

I own a lot of books. And yet I continue to browse the stacks at used bookstores and swaps. I often find myself wondering if I have already picked up a given John McPhee or DK Eyewitness volume. I also love distracting myself from actually reading those books!

Thus, when I came across drdrang's Library Database Success Story mirror, I knew I wanted to waste time making something similar for myself. All I needed was slim interface over a database of books which could be available on my phone and easily updated to cover all the books in the house. Simple!

a chaotic stack of recently purchased books that haven't been shelved

Things look great until you see what all remains unshelved

I had started by manually cataloging books. I entered each ISBN, title, author, publisher, and date into a spreadsheet. Eventually, after only about 800 manual entries, I realized I could leverage an ISBN database to autofill the details. Something about an hour of thinking can save you a month of work?

Thus was Bookfool mirror born!

a 15th century woodcut of a scholar dusting many unread books

Bookfool provides a (very) simple interface that allows querying books and adding new ones with optional ISBN querying support. The Django application itself is only a couple dozen lines of Python, some shitty templates, and the worlds simplest database model. The real work happens with the ISBN database.

The name of the project derives from the stock character mirror of the scholar who spends more time dusting their books than reading them. This lovely Public Domain Review article mirror tipped me off to the perfectly self-deprecating term and the Albrecht Durer woodcut that serves as Bookfool's logo.

As publicly searchable ISBN databases are not free for programmatic requests. I've taken advantage of Open Library mirror provided by the Internet Archive to bootstrap a self-hosted postgres database of (nearly) all books that have been assigned ISBN numbers. How big would you expect that database to be? As of 2026 it's like 60 gigabytes of text. When openlibrary-search mirror, the project that provides tools for transforming the Open Library data blobs into a postgres database, says to run the tools on the same machine as the database, there's a reason for it!

This project took longer than I expected to complete (mostly because I ignored those very important directions I just described), but the time spent has already paid off. I'm zooming through my book collection. You can see my collection here and I've added a Library link to the top of this blog. At the time of this post I'm about 60% of the way through all of the books in the household including all the kids books.

book submission form for bookfool with isbn filled out listing of books in my personal library... alphabetized by title

ISBN entering with a numpad is mighty quick. And probably 95% of ISBNs I've entered have hits in the database. The most time-consuming part of the enterprise now is finding where the publisher has hidden the ISBN. While nowadays the ISBN is reliably above the barcode on the back cover, in the early days of the standard (1970s-1980s) the ISBN might be printed sans-barcode on the back or only near the publisher's copyright a few pages inside the book.

I thought about using a barcode scanner like a sleazy book scalper but many of my books are from before the era of the standardized ISBN. OCR could work on maybe half of them but I can't imagine it'd be faster or more accurate than the numpad. Putting my fingers to work for now!

I've gotten a few major benefits from this collection introspection:

While I feel like Bookfool is ready for action in its current state, there's still more I'd like to add like if I ever come back to it:

To follow along with the development or try it out yourself, checkout the source here mirror.

Footnotes

[1] Hopefully my server doesn't burn up at the same time!