Interactive Media Experience

The Journey
Of A Tea Leaf.

Translating tactile, analogue agricultural traditions into a zero-latency digital cinematic experience. We mapped high-definition video frame scrubbing to browser viewport depth, resolving hardware rendering choke-points.

RoleDesign Engineer
TechnologiesReact, Next.js, CSS variables
OptimizationBlob pre-buffer (RAM seeking)
Mountain Tea Valley Preview
Scene 01

The valley mist

Where the mountain air folds into the buds

The Core Engineering Philosophy

Traditional digital visual narratives rely on standard, streaming video loops or heavy WebGL canvases. While detailed, WebGL creates severe rendering cycles and battery-drain, while static video elements lack frame-by-frame user scrubbing controls.

We took a design engineering approach: stream clips dynamically on mount as raw binary array buffers, cache them instantly into system memory (RAM) via Blob URL allocations, and write a custom RequestAnimationFrame interpolation thread mapping scroll depth to precise timestamp seeks.

To ensure the visual atmosphere remained alive even while loading or standing still, we integrated a subtle 24-second ambient pan loop (`@keyframes breeze`) on the active stage.

Stills are seamlessly cross-faded using hardware-accelerated opacities, and we customized the browser's global Content Security Policy to dynamically whitelist `blob:` allocations in `media-src` to guarantee native browser playback support.

Case Breakdown

Resolving Architectural Chokepoints

Viewport Lag

Global smooth-scrolling rules fight with custom JavaScript frame rendering loops. When scrolling, the browser delays window updates, creating a stuttering scrub rate.

Solution: Temp. auto-scroll overwrite

CSP Content Blocks

Next.js global security headers whitelisted static images but blocked blob URL media references, preventing custom binary buffers from rendering on stage.

Solution: Whitelisted CSP blob allocation

Black Video Flashes

Prior to video load completion, empty first-of-type video elements with active opacities overlayed the static placeholder posters, creating dark blocks.

Solution: Opacity toggles on load state