Interactive 3D · WebGL · 2026
Lakeside
A portfolio you can walk into.
A mountain lake built in Three.js: Gerstner waves, a spruce forest in a shared wind field, a lake house with a working door and a physics-driven fire, and a day/night switch. Every section is a place you travel to.
- UI/UX
- Frontend
- QA

- Role
- Self-initiated · design + Three.js
- Year
- 2026
- Disciplines
- UI/UX · Frontend · QA

01 The problem
Portfolio sites all scroll the same way. I wanted navigation that feels like moving through a place, without losing the basics: readable text, fast loading and a frame rate that holds on a laptop.
02 Key decisions

One world, two moods
Day is a soft teal sky with cumulus and blue-teal haze; night swaps in stars, a textured moon, lantern light and fireflies. The panels change palette with the sky.

Night is lit by the scene itself
Lanterns, the cabin window and the fire are the light sources, and the lake reflects them. Nothing is painted on.

About, out on the dock
About flies you to the end of the dock. The panel is deep lake-teal glass with a copper accent, dark enough to read over the bright water and sky.

Contact lives inside the house
Clicking Contact walks you across the porch, swings the door open and steps into a room lit by a particle fire with buoyancy and cooling. The card appears by the fire.

Cards that belong to the forest
Daylight project cards use a misty-forest palette (pine to moss, cream text, one gold accent) so they read clearly without fighting the scene.
03 Built in code
1// one wave field drives the GPU surface and the boat's buoyancy2function waterHeight(x, z, t) {3 const g = waveGust() * shoreDamp(x, z)4 let y = 05 for (const [dx, dz, L, A] of WAVES) {6 const k = (Math.PI * 2) / L, c = Math.sqrt(9.8 / k) // deep-water dispersion7 y += A * g * Math.sin(k * (dx * x + dz * z - c * t))8 }9 return y10}
04 Then I tried to break it
- Wider field of view on narrow screens
- Finger-sized targets and safe areas on touch
- Resolution steps down if the frame rate dips
- Reflections, shadows and the fire only update when needed
✦ By the numbers
Measured on the live build in Chrome, on laptop, phone and tablet sizes.
→