Mike Litman
The Visible Shelf
A TALK BY MIKE LITMAN

The Visible Shelf

How 289 books became an interactive coffee table.

thevisibleshelf.com Built in one night Python + Vanilla JS Zero frameworks
Where It Started
The Prompt

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.

24 February 2026
The Spark
FlipHTML5 virtual bookshelf concept

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.

Step One
One JSON File to Rule Them All

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.

114
Books on night one
7
Vibes
20
Categories
1
JSON File
v1
The Static Generator

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.

7,022 lines of Python 114 book pages 15+ page types RSS + Sitemap PWA + Service Worker
15 March 2026
The Virtual Bookcase
V1: The Visible Shelf as a virtual bookcase, March 2026

Three weeks later. 114 books catalogued. Categories, ratings, a proper header. Still a long scroll, but now it felt like browsing a real shelf.

Version 1
Browse + Table Pile
V1: The Browse Grid
V1: The Table Pile (homepage)

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.

The Next Morning
The Polish Sprint
Sat 15 Mar, 11:55pm
Initial commit. 114 books, table pile homepage, Python generator, covers, thumbnails, social cards. Site is live.
Sun 16 Mar, morning
Fix 13 wrong ISBNs, regenerate stale thumbnails. Fix publisher and author errors.
Sun 16 Mar, afternoon
+175 books added. Library jumps from 114 to 289. Higher quality cover scans. 6 covers replaced by hand.
Sun 16 Mar, evening
V2: Interactions arrive. Flip cards, shake, vortex, explode, category filter, pick-5 share, tidy mode.
Sun 16 Mar, late
Quiz added. 5-question recommendation engine. "What should I read?" lands on the site.

From first prompt to fully interactive site: less than 24 hours. 11 commits. 289 books.

Version 2
The Table Pile, Evolved

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.

Interaction 01
Tap to Flip
Curation
Michael Bhaskar
The power of selection in a world of excess

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.

Interaction 02
Shake the Table

Press ~ to shake. Books spring to new random positions with staggered delays and a bouncy cubic-bezier(0.34, 1.56, 0.64, 1).

Interaction 03
Vortex & Explode

Vortex: Books spiral inward through 3 full rotations, shrinking to 0.3 scale.
Explode: Books fly outward from centre with spin and spring-back.

Interaction 04
Filter by Category
Culture Strategy Design Technology Fashion

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

Visual Design
3D Books & Dark Mode
Light
Dark

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.

Social Feature
Pick 5 & Share
1
2
3
4
5

Tap 5 books, generate a 1200x630 shareable PNG via html2canvas. Positions encoded as base64 in the URL for shareable arrangements.

The Browse Experience
Four Ways to See
Collage
Grid
Spine
Curation
The Culture Map
Shoe Dog
Range
Masonry
Invisible Details
The Bits You Feel
~
Hero collage drift. 7-column grid of blurred covers behind the browse page header. Slow 60-second vertical drift animation. You barely notice it, but the page feels alive.
View Transitions API. Navigate between pages and the browser cross-fades with a 0.3s animation. No router, no framework. Just the native @view-transition CSS rule.
Scroll reveals. 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.
Reduced motion respected. Every animation disables for accessibility. 3D effects, collage drift, hover springs: all honour prefers-reduced-motion.
+
The Supporting Cast
?
Quiz
5-question recommendation engine. Answer taste questions, get matched to books.
#
Stats
Animated progress bars, rating distributions. All generated from the same JSON.
8 Reading Lists
Curated sequences: Strategy Stack, Taste Education, Weekend Reads, Gift-Worthy.
T
Timeline
Books grouped by month. Visual reading history that auto-updates.
Pairs With
Every book links to related reads. Cross-reference graph in the data model.
Project Connections
Books linked to Trove, Modern Retro, Taste OS. Reading feeds making.
Philosophy
Deliberate Decisions
1
Rating drives visual weight. A 5-star book is 130px wide on the table. A 1-star is 78px. Editorial judgement is embedded in the layout.
2
Seeded random. Same session, same layout. New visit, new arrangement. Familiar yet fresh.
3
No framework. Vanilla JS, CSS custom properties, zero dependencies beyond html2canvas. One JSON file, one Python script. That's the stack.
4
The homepage is hand-built. The generator makes everything else, but the table pile is maintained separately. It earned its own code.
19 March 2026
289 Covers, One Sheet
All 289 book covers laid out for QA

Every cover checked by hand. ISBNs audited. Colours verified. Thumbnails regenerated. No detail too small when you are building something you actually use.

Today
Present Day
The Table Pile
The Visible Shelf homepage today
Browse Collection
The Visible Shelf browse page today

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.

Under the Hood
Built With
Python (Generator) Vanilla JS CSS Custom Properties Instrument Serif Inter Space Mono html2canvas Service Worker / PWA Plausible Analytics Netlify WebP Images View Transitions API Schema.org JSON-LD RSS Feed

No React. No Next.js. No Tailwind. No build step.
Just a Python script, a JSON file, and the browser platform.

289

Books. 282 read. 11 commits. 1 weekend.
From prompt to production in under 24 hours.

7,022
Lines of Python
5
View Modes
8
Reading Lists
0
Frameworks