Design · Engineering · Graphics/3DSpring 2025
Capsule
A collaborative web app for digital time capsules: lock photos and messages until a chosen date, then open them inside an immersive 3D gallery.
Overview
Memories, locked in 3D, revealed in time
Capsule is a collaborative web app where users create digital time capsules, containers for photos, messages, and media, locked until a chosen date. When the date arrives, the capsule opens and its contents are revealed through an immersive 3D gallery.
The concept was inspired by Japanese gachapon machines: turning a dial, receiving a capsule, opening it to discover what's inside. That anticipation-and-reveal shaped both the interaction design and the 3D visual language.
Design
Designing around the moment of reveal
The UI and flows were designed in Figma first, built around a specific emotional arc (creation, anticipation, reveal), each phase with its own visual and interaction language.
- Creation: a clean, form-driven flow for uploading media and writing messages; lightweight, so the weight goes into the content.
- Waiting: a 3D gallery where locked capsules float and rotate, tactile but inaccessible, their look hinting at the contents inside.
- Reveal: on unlock, an animation plays: the capsule opens and its contents spill into the gallery, like a gift being unwrapped.
Development
Full-stack, with 3D at the center
The front end is React + React Three Fiber (a React renderer for Three.js), so the 3D gallery is composable with app state: capsules fetched from the database appear in the scene, and clicks on 3D objects trigger app logic. The back end is a Node.js API over MongoDB, with media in AWS S3 via pre-signed URLs to keep large binaries out of the database.
Hard parts
- Date-gated content: capsule contents are encrypted at rest and only served after the unlock date, verified server-side on every request.
- Collaborative access: multiple contributors per capsule before it locks, which meant careful permission and notification design.
- 3D performance: GLTF compression + level-of-detail logic keep the gallery smooth as it fills with models.
Reflection
When design and code reinforce each other
Because I owned both the Figma and the React Three Fiber build, design decisions and technical constraints could push on each other in real time: the reveal animation was designed knowing exactly what the runtime could afford, and vice versa. That tight loop is where the project felt most like my own.
Outcome