No color, on purpose
Built for a photographer, director, and editor, this portfolio makes one deliberate design decision and follows it everywhere: no color in the UI at all — only the work itself is in color. Hierarchy comes from typography and hairline rules instead of cards, rounded corners, or gradients.
The interaction layer is where most of the build time went: a custom two-ring cursor that mixes with whatever's underneath it, a WebGL shader on every image (liquid drag, a ripple, scroll-linked color shift, film grain, vignette — falling back to a plain image on mobile or without WebGL support), Lenis-smoothed scrolling tied to GSAP ScrollTrigger, and a panel-wipe transition between pages.
The interaction layer, piece by piece
WebGL images
A custom shader per image: cursor-driven liquid distortion, scroll-linked color shift, film grain, and vignette.
Cursor
A two-ring cursor with independent trailing speeds, using mix-blend-difference to stay legible over any image.
Motion
Lenis smooth scroll driving GSAP ScrollTrigger for reveals, parallax, and a horizontal pinned work strip.
Accessibility
Fully respects prefers-reduced-motion, disabling the WebGL and motion layer when it's set.
A rebuild, not a first draft
Built with React, Vite, TypeScript, and Tailwind — a full rebuild from an earlier Next.js version of the same site.


