Skip to content

06 · Experiment · 2026

3D Book

Personal projectPrivate content: this case shows only the engine

An album you leaf through like paper.

A Three.js engine written for one job: a real book in 3D. The leaf is a folding ribbon attached to the spine, with thickness, front, back and a gilded edge, and content is drawn onto it as a texture: there is never a hand-off between a 3D object and an HTML page. On top sits an edit mode with alignment guides, and a save that loses nothing.

Role
3D engine, interaction and sync
Areas
3D / WebGL · Interaction · Personal project
Read the case
Moving preview of 3D Book, cut from the project's own screens
01

Context

What the book had to do

  • Open on a phone, upright or sideways
  • Turn the page like paper, not like a door
  • Photo, video and music on the same leaf
  • Be edited without a line of code
02

Challenge

A digital album is usually a gallery with arrows.

The photo swaps, and nothing there resembles an object. The idea was the opposite: a book you hold with one finger, that lives on a phone and can be edited by someone who doesn't code.

03

Decisions

  1. 01

    The leaf as a ribbon, not a rectangle

    Why
    A rectangle rotating on the spine is what gives away an amateur 3D book: the page swings like a door.
    How
    Each leaf is a ribbon attached to the spine, with thickness, front, back and a gilded edge, deformed every frame by weighted springs.
    Trade-off
    Physics written for the object rather than borrowed from a library: the engine serves this one job and no other.
    Decision
    The tip lags, the middle follows, and the leaf settles like paper.
  2. 02

    At rest, it costs nothing

    Why
    The book had to live on a phone.
    How
    It only renders when something moves, and pauses when the tab is hidden; only visible leaves have a mesh (the rest of the block is one solid), and textures load on demand, behind a cache.
    Trade-off
    If the device can't keep up, resolution drops on its own; and there is no post-processing.
    Decision
    The light belongs to the scene, not to a filter.
  3. 03

    A save that loses nothing

    Why
    Whoever edits doesn't code, and may be on a phone and a laptop at the same time.
    How
    Every save is a new version; the second save notices the first, receives the newer version and merges the two page by page.
    Trade-off
    Offline, the change waits on the device and only goes up on the next visit.
    Decision
    Closing the tab sends whatever was pending straight away, and the last 300 versions stay in the cloud.
  4. 04

    The gesture decides, not the button

    Why
    When zoomed in, the same finger that pans the view could turn the page by accident.
    How
    When zoomed, one finger pans; tapping a photo frames that photo; releasing the pinch snaps back to the nearest framing.
    Trade-off
    While zoomed in, turning by drag is suspended.
    Decision
    Small rules, and they are what make the book feel like an object rather than an app.
04

Demonstration

Note Personal project. The book's title, photos, texts and music are private and do not appear here. What this case shows is the engine.

05

Interactions

  • The cover opens from the spine in a single cinematic take.
  • The leaf pulls, drags through the air and settles: its curvature has a spring of its own.
06

Implementation

  • TypeScript on Three.js and GSAP, bundled with Vite; Vercel Functions and Vercel Blob handle saving.
  • Since 28 Sep, music by link (a file, Google Drive, Dropbox, YouTube or Spotify), with a chosen excerpt and the track name pulled from the link itself.

What was built

  • A 3D book that opens in one cinematic take
  • Page turns by drag, tap or star
  • Pinch zoom that frames the photo you touch
  • An edit mode with alignment guides
  • Cloud saving that merges edits across screens
  • Music by link, with a chosen excerpt

Technology

Development
  • TypeScript
  • Three.js
  • GSAP
  • Vite
  • Web Audio
  • Vercel Functions
  • Vercel Blob
07

Outcome

A personal project in use, and still growing: music by link arrived on 28 Sep. The content is private; only the engine appears here.

  • 11.1k

    lines of TypeScript across engine, content and editing

    measured on 4 Oct 2026

  • 17

    element types per page: text, photo, video, music, ornament

    measured on 4 Oct 2026

  • 300

    latest versions kept in the cloud: no save overwrites another

  • 7

    type families in the edit mode

  • 0

    post-processing passes: the light belongs to the scene

08

Learnings

  1. 01An amateur 3D book gives itself away with a page that swings like a door; what convinces is a tip that lags and settles.
  2. 02At rest it has to cost nothing: rendering only when something moves is what lets a 3D book live on a phone.
  3. 03Small gesture rules are what make a book feel like an object rather than an app.