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!
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!
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.
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:
- At the risk of looking like a minion serving the AI companies devouring books mirror, I can now see if I own a given book before I buy it. Simultaneously, I can also be painfully aware of how much I have yet to read.
- If I ever get a book scanning setup together, I'd have a nice way of sharing the results online. Previous attempts are here (and apparently not working as of this writing whoops).
- When my kids get older and need a first job, they can use this inventory system to help sell my unwanted books online for me. Could also come in handy I kick the bucket without liquidating my shit first!
- Serves as a reference for a home insurance claim [1].
- Indexing allows for deduplication, reshelving, surprise rediscoveries, and an opportunity to apply my bookplate to some old favorites.
- I have the beginnings of a lightweight, self-hosted reading log/next-to-read system similar to bookwyrm mirror but without the having-to-interact-with-people part...
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:
- Tracking read books
- More sorting options to flex my antiquarian selections and ease physical reorganization
- Tags that are actually tags and can be used to group books
To follow along with the development or try it out yourself, checkout the source here mirror.
[1] Hopefully my server doesn't burn up at the same time!