Gutenberg Stacks: Browse 1,000 Free Books Like a Deck of Cards

⬅️ Back to Tutorials

Gutenberg Stacks is a card-and-stack browser for the 1,000 most-downloaded books on Project Gutenberg. Instead of a search bar and a list of results, you wander. The home screen is a wall of black stacks (Project Gutenberg categories). Each stack opens into era stacks, which open into subject stacks, which hold book cards with covers, author names, and LLM-written hooks. Everything links straight to the free book on gutenberg.org.

It is an open-source live site at tmfnk.github.io/Gutenberg-Stacks, built to run on GitHub Pages with no backend.

TLDR:

  • Browse 1,000 free public-domain books by drilling through Category → Era → Subject stacks
  • Each book card shows a cover, author, LLM-written hook, and a “stacks (N)” button that shows every stack the book belongs to
  • Click any author name to see a stack of every book by that author
  • Mobile has a full-height swipe carousel for flicking through books in a stack
  • Global full-text search across all stacks from any screen
  • Entire site is static. This means no database, no API, no server, no account, no setup. Clone and run locally with npm install && npm run dev

Reference: Gutenberg-Stacks on GitHub (AGPL-3.0)

The design is the point

The interface is a faithful implementation of Winnie Lim’s self-directed learning network prototype, a Vue + Firebase project she built as part of her design essays. The same card anatomy, the same nested-stack drill-down, the same black-and-white visual language. The difference is that this version is a standalone static site: plain HTML and CSS with TypeScript compiling to vanilla JS. No Vue, no Firebase, no backend.

The design philosophy is that discovery works better when you browse by context, not by keyword. A search form assumes you already know what you want. Stacks assume you are exploring. You start from a category (Fiction, History, Philosophy), drill into an era (19th Century, Before 1800), then into a subject, and find books you would never have searched for.

Stacks are everywhere

Two design choices make this more than a nested folder view:

The pivot. Every book card has a “stacks (N)” button. Click it and you see every stack that book belongs to. A philosophy book might also be in History, in 19th Century, and in French Literature. One click jumps you into that stack, so you can follow threads sideways instead of drilling back up.

Authors are stacks. Click any author name on a card and you get a stack of every book by that author in the corpus. This also appears in the pivot modal and in search results. It is the closest thing to walking to a different section of the library because the first book was good.

How the data is built

A Python pipeline runs once, offline, and the output is committed to the repo so the frontend never needs it.

  1. Catalog: fetch metadata from the Gutendex API (title, author, subjects, download counts)
  2. Excerpts: download each book’s plain text, strip Project Gutenberg boilerplate, keep the first ~2,000 words
  3. Embed: run title + subjects + excerpt through sentence-transformers locally (no API cost)
  4. Layout: project embeddings to 2D with UMAP, group into clusters with HDBSCAN
  5. Enrich: send clusters to an LLM via OpenRouter to name each cluster and tag every book with mood, themes, difficulty, and a one-line hook
  6. Export: write the compact JSON the frontend consumes

Every stage caches its output, so the pipeline is resumable. The enrich step requires an OpenRouter API key; everything else runs on-device.

Gutenberg-Book-Finder

Gutenberg Stacks grew out of a previous project, Gutenberg-Book-Finder, which uses the same pipeline and data but shows a more traditional search-and-filter grid with facet filters, a 2D map view, and a “Surprise me” button. Both are live and maintained. Stacks is the evolution toward browsing over searching.

What to read next

The 1,000-book corpus covers the most-downloaded titles on Project Gutenberg, so you get the classics you expect (Dracula, Pride and Prejudice, Frankenstein) and the long tail of obscure works that somehow made the list. The LLM hooks are often surprisingly good at selling a book you otherwise would skip.

Related TMFNK Content

Crepi il lupo! 🐺