Inspiration

Libraries are usually a desk at the end of a corridor. I wanted one that refuses to end.

The Last Library is a mood piece about knowledge, memory, and infinity: shelves hanging in a void, books drifting in zero gravity, galaxies burning beyond the outer stacks. The site isn’t “about” a product. It’s about how it feels to fall inward fog, lanterns, and dust instead of menus.

The one-line pitch: a weightless, infinite library where knowledge drifts like stardust scroll deeper, and open the books that call to you.

What it does

You drift down an endless aisle. Scroll (or W/S) to move. Drag to look left, right, up, down, behind. Certain volumes glow; hover them, click, and the cover hinges open in 3D. A two-page spread fades in with a random folio — a fact about the library, a gold line drawing, and sometimes a petition from the stacks.

There is no last bay. Infinity is the hospitality.

How I built it

  • React Three Fiber + Three.js for the scene
  • Instanced meshes for shelves and decorative books, tiled so the aisle never runs out
  • @react-three/postprocessing for bloom, vignette, and grain
  • Custom scroll + look rig (wheel, drag, WASD, snap views)
  • Procedural spiral galaxies as glowing point fields beyond the stacks
  • Framer Motion overlays for the intro and open-book pages
  • Web Audio for a low drone, page-turn rustle, and chimes
  • Vite locally, Vercel for the public link

No custom Blender models — boxes, light, and fog do the work. The wow is composition, not mesh count.

Challenges I ran into

The loop giving itself away. An infinite corridor is just a repeating chunk. A gold “last book” made the seam obvious. I removed the landmark and shifted the interactive volumes each cycle so the aisle feels visited, not copy-pasted.

Looking around vs. clicking. Drag-to-look fought with “click this book.” I ignore tiny pointer movement as a click, use a larger hit sphere, and on phones: one finger looks, two fingers drift.

Performance. Hundreds of shelf books would kill the frame rate as unique meshes. Instancing + fog (so you never draw the whole universe) kept it smooth enough for the browser.

Shipping. The first Vercel build failed on a TypeScript error. Fixing it, then getting the repo onto GitHub with the right account, was less romantic than lanterns — and just as required.

What I learned

Atmosphere is a kind of argument. Judges don’t need a tutorial if scroll and glow are obvious. I also learned that “infinite” in a game engine is a wrap function, and that a 3D site is won or lost in the first ten seconds of light.

Built With

Share this project:

Updates

Submission history