How 289 books became an interactive coffee table.
I have a shelf of books that shaped how I think about culture, strategy, taste, and design. I want to turn it into a website, but not a list or a database. Something that feels like walking into someone's living room and seeing their books scattered on the coffee table. You pick one up, flip it over, put it back. That feeling.
Saturday night, 15 March 2026. That was the starting brief.
A screenshot saved to Downloads. A wooden bookshelf with a lamp and a plant. What if your book collection felt like this? Not a spreadsheet, not a database. A room you could walk into.
Every book captured as a single record: title, author, ISBN, rating, vibes, categories, one-line summary, why it matters, shelf position, cover colour, and which other books it pairs with. The entire library is one books.json file.
A Python script reads that JSON and generates the entire site. 114 individual book pages, 7 collection pages, stats, timeline, poster view, and a full RSS feed. Every page is pre-rendered HTML. No framework, no build tools, no dependencies. Just run the script and deploy.
Three weeks later. 114 books catalogued. Categories, ratings, a proper header. Still a long scroll, but now it felt like browsing a real shelf.


















The table pile concept was there from night one. Books scattered on a warm cream surface. Draggable. Rating determined size. But no flip, no shake, no vortex. Those came later.
From first prompt to fully interactive site: less than 24 hours. 11 commits. 289 books.












289 covers on a warm canvas. Rating determines size (5-star = 130px, 1-star = 78px). Seeded random layout: same session, same arrangement. New visit, fresh scatter.
CSS 3D card flip with perspective: 600px and a spring cubic-bezier. Back face shows title, author, rating dots, and one-line summary. Auto-unflips after 4 seconds.






Press ~ to shake. Books spring to new random positions with staggered delays and a bouncy cubic-bezier(0.34, 1.56, 0.64, 1).
Vortex: Books spiral inward through 3 full rotations, shrinking to 0.3 scale.
Explode: Books fly outward from centre with spin and spring-back.






20 colour-coded category pills. Matched books spring into alignment with a terracotta glow. Unmatched fade to 12% opacity with greyscale.






Default 5-degree Y-rotation gives depth. ::after pseudo-element renders a 6px spine. Cursor position updates shadow CSS variables on every frame. Full dark mode via localStorage + system preference auto-detect.





Tap 5 books, generate a 1200x630 shareable PNG via html2canvas. Positions encoded as base64 in the URL for shareable arrangements.
@view-transition CSS rule.IntersectionObserver triggers a staggered drop animation as books enter the viewport. First 30 books drop immediately with 25ms stagger. Below-fold books wait for scroll.prefers-reduced-motion.
Every cover checked by hand. ISBNs audited. Colours verified. Thumbnails regenerated. No detail too small when you are building something you actually use.
From a screenshot of a wooden bookshelf to 289 books with flip, shake, vortex, dark mode, 3D spines, and drag-and-drop curation. One month. Zero frameworks.
No React. No Next.js. No Tailwind. No build step.
Just a Python script, a JSON file, and the browser platform.
Books. 282 read. 11 commits. 1 weekend.
From prompt to production in under 24 hours.
thevisibleshelf.com
hello@mikelitman.me