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
- audio
- fiber
- framer
- motion
- react
- three
- three.js
- typescript
- vercel
- vite
- web
- webgl
Log in or sign up for Devpost to join the conversation.