Books!

New project alert: I spent a few days building an online archive of books I’ve read and remember. (Click books in the navigation bar).

I created this project as a personal reading catalogue to share with friends and the world at large. It is a non-exhaustive record of ~700 books.

I ran out of steam uploading the back catalogue (my Reading List app was a godsend, but the manual .csv file entries were tedious as hell).

I plan to update it periodically, both with recent reads and those that return to my memory.

The problem with existing solutions

Is there one? I don’t know.

Goodreads is the obvious choice, but it’s clunky, ad-ridden, and owned by Amazon. I didn’t want social features, reviews, or recommendations from algorithms. I just wanted a clean, fast, browsable catalog that I controlled.

The stack

  • Database: SQLite—a single file, no server, easy to back up and query
  • Scripts: Python—for importing books, enriching metadata, and exporting to JSON
  • Static site: Eleventy—fast, flexible, no framework overhead
  • Interactivity: Alpine.js—lightweight filtering and search without a build step
  • Metadata: OpenLibrary and Google Books APIs—for covers, page counts, and descriptions
  • Hosting: Netlify—free tier, auto-deploys from GitHub

Total cost: $0/year (excluding the domain I already owned).

How it works

Books live in a SQLite database. Each book has a title, author, ISBN, themes, and—where warranted—a ‘recommended’ flag. Python scripts handle the grunt work:

  • cli.py — add, edit, delete, list books
  • enrich.py — fetch covers and metadata from OpenLibrary/Google Books
  • export.py — dump the database to JSON for the static site

Eleventy consumes the JSON and generates a static HTML page for each book, plus the main browse page.

Alpine.js handles client-side filtering by theme and search by title/author—no page reloads, no backend.

What I learned

  1. ISBN matters. Title/author searches against book APIs return wrong editions constantly. ISBNs are the only reliable way to get the right metadata. (And even then, gremlins emerge!)
  2. Don’t trust Excel with ISBNs. It converts them to scientific notation and corrupts them. Edit CSVs in VS Code.
  3. Metadata is messy. Some books returned German or Dutch descriptions. Some returned covers for completely different books. Manual cleanup is unavoidable.
  4. Static sites are underrated. No database to secure, no server to maintain, instant page loads, free hosting. For read-heavy, write-rarely projects like this, it’s awesome.

What’s next

Maybe a /stats page with reading trends over time. Maybe sorting by author last name. Maybe not. It does what I need, and I think I’d rather build a ‘scrollytelling’ site next …

The code is on GitHub if you want to build something similar.


Posted

in

by

Tags:

Discover more from Mike Casey

Subscribe now to keep reading and get access to the full archive.

Continue reading