Age of Exposition
What book should I read next?
What It Does
I'm trying to read a hundred books this year. I often read books through the local library apps and they don't have great interfaces for sorting and filtering by book length and topic, so I started with pulling my content out of those apps and making it all navigable. That escalated quickly and now it's merged with my personal reading database and behaves kind of like a curated, non-social version of Goodreads to really help me dig into what I want to read and figure out what makes sense for my time constraints at the moment.
How it works
Although there were various technical layers to get there like pulling information out of reverse-engineered library APIs, now it's become a curated and sortable database similar to Deep Cuts and Completionist. It's a web-only project today but probably will be iOS-native two days from now.
Built with
- Built with: Python/FastAPI serving server-rendered HTML โ no frontend framework, no JS build; every page (the library grid, /aoe's letterpress reading surface, /maybe) is a string-templated document with its own CSS, and read state lives in a marks-authoritative SQLite layer (user_marks/user_removals) that imports structurally can't clobber. A canonical-books pipeline dedupes and normalizes titles/authors across CloudLibrary and Hoopla exports, then projects curated prize/canon lists (Pulitzer, Booker, Modern Library, Bloom, Great Books โ scraped from wikitext) onto the catalog to compute completion fractions.
- Runs as a Docker container behind Caddy on a VPS, with the canonical SQLite DB on a bind mount so redeploys never touch data; enrichment is a set of one-shot scripts against the Google Books and Open Library APIs (on-disk response caches) plus the Anthropic SDK for topic classification and metadata hydration.