All the information is stored in a PostgreSQL database.
When I want to add a new review, I run the master Python program, '~/html/books/new.py'. It's very short and does nothing itself, it just uses other Python programs as modules and binds them together appropriately. Each one of the modules can also be run from the command line so debugging or enhancing any part of the system is trivial.
The different modules/programs are:
addbook.py Launches Emacs with a template file in which I fill in the review's information, which it then reads from the file and stores in the database, returning the id of the new review.
set_img.py Opens a new tab in Firefox in which it does a Google image search to find a cover image for the book. I select the one I like the best, copy that image's URL back to the program, which then downloads it and stores it locally.
update_books_html.py Redoes all the generated pages (author/name lists, per-year files, per-book files, last-15, RSS feed), which takes ~2 seconds.
gen_books_graph.py Generates the graph of total books read over time.