All projects
Case Study

KrishPatelPortfolio

The site you are on right now: a hand-built, interactive developer portfolio with a living sky, a WebGL cursor, synthesized sound, a real map and a smooth light and dark theme.

Role
Designer and developer
Type
Personal product, built from scratch
Focus
Front-end craft · Interaction design
Stack
React 19 · Vite 8 · GSAP · Framer Motion · WebGL · MapLibre
5Main pages plus case studies
8Synthesized sounds
2Themes with animated switch
7Runtime dependencies
Krish Patel portfolio home page with a sky, clouds and rainbow

Overview

A portfolio should show how someone builds, not just say it. This site is my own product: every page, animation, sound and interaction is built by hand with React, with no UI kit and no CSS framework. It holds my story, projects, experience, skills and contact details, and the way it looks, moves and sounds is itself a demonstration of the work I do. It is the main project on this page because you are using it right now.

The challenge

Most developer portfolios look alike. I wanted one that is memorable and personal, yet still fast, accessible and easy to navigate. That meant combining heavy ideas such as WebGL fluid, canvas art, 3D cards, real maps and audio without hurting performance, losing keyboard access or breaking on mobile.

How it works

  1. 1

    Arrive

    A layered SVG sky with drifting clouds, a generative rainbow and a clickable mascot welcomes the visitor.

  2. 2

    Navigate

    A gooey navigation pill, a Ctrl or Cmd + K search and a mobile menu reach every page quickly.

  3. 3

    Explore

    The About page is a grid of interactive cards: a map, a drum pad, a flag, a chai counter and more.

  4. 4

    Learn

    Projects open into in-depth case studies; skills flip like cards to reveal how I use each tool.

  5. 5

    Trust

    Experience, education and certifications sit on a timeline with real logos.

  6. 6

    Connect

    The contact page offers email, links, a downloadable resume and a pre-filled message form.

Signature features

Splash cursor

A WebGL2 fluid simulation with bloom and low, medium and high quality tiers follows the pointer.

Generative rainbow

A canvas of dashes on concentric arcs, steered by the mouse, with a configurator panel.

Gooey navigation

A liquid-style pill with themed palettes for dark and light mode.

Masked headings

Page titles use a GSAP-driven spotlight mask over textured fills.

Tilted cards

Skill cards tilt in 3D with glare and shadow, then flip to reveal a note on the back.

Real map

A MapLibre map on CARTO tiles draws a line from Ahmedabad to the visitor's location.

Synthesized sound

Pops, chimes, whooshes and four drum sounds generated live with the Web Audio API.

Themed everything

A light and dark theme that animates smoothly across every color at once.

What I built

  • A hash-based router written from scratch in a small map of pages, with the right nav item highlighted even on case-study pages
  • A design-token system in CSS custom properties, so colors, spacing and type stay consistent across 23 stylesheets
  • A bento-style About page of interactive cards, including a playable drum pad on the Q, W, E and R keys, a rippling India flag, a visitor map and a chai counter
  • Layered SVG cloudscape, mascot with confetti on click, and a generative canvas rainbow ported from an interaction I admire
  • Projects page with showcase cards, plus in-depth case studies with stats, flow diagrams, architecture cards and problem-and-solution blocks
  • Skills page with category tabs and 3D flip cards, plus a command-style search modal for jumping anywhere
  • Experience page with a timeline, education logos and certification cards, and a contact page with a resume download

Performance and accessibility

  • Sounds are generated with oscillators, so there are no audio files to download, and sound can be switched off and the choice is remembered.
  • The audio context is created only after a user action, which follows browser autoplay rules.
  • The WebGL cursor is built with low, medium and high quality tiers, so the cost of the simulation can be tuned.
  • Motion-heavy components check for the reduced-motion preference, and 130+ aria and role attributes support screen readers.
  • The map library loads as its own chunk and the visitor lookup uses an abort controller, so a slow network never blocks the page.
  • Theme and sound choices persist in local storage, and the first theme follows the visitor's system preference.
  • The layout adapts from large screens down to phones, with a dedicated mobile menu.

Problems I solved

Switching theme without a flash

Problem. Swapping CSS variables normally snaps colors instantly and breaks gradients.

Solution. Every color token is registered with @property so the browser can tween them, animating gradients, fills and borders together.

Audio without audio files

Problem. Sound effects add weight and licensing questions.

Solution. The Web Audio API synthesizes each sound from oscillators and gain envelopes, with a global on and off switch.

A real map with no API key

Problem. Map services often need paid keys and tokens.

Solution. MapLibre GL with free CARTO basemaps, a theme-aware style and a simple distance calculation, with a "you are right here" case for nearby visitors.

Heavy visuals on weak devices

Problem. Fluid simulation and canvas art can drop frames.

Solution. Quality tiers for the simulation, passive scroll listeners and cleanup of every listener on unmount keep it smooth.

Routing without a library

Problem. A tiny site does not need a full router.

Solution. A hash map resolves pages, falls back to About, scrolls to the top and keeps the nav highlight correct.

A contact form with no backend

Problem. Running a server only for one form is overkill.

Solution. The form builds a pre-filled mailto message, and the resume is a direct PDF download.

Architecture

Framework

React 19 with Vite 8 and the React plugin, using functional components and hooks.

Styling

Hand-written CSS with design tokens, no framework, and a dedicated theme-transition layer.

Animation

GSAP, Framer Motion, CSS keyframes and canvas for different jobs.

Graphics

WebGL2 shaders, 2D canvas, inline SVG and canvas-confetti.

Audio

A small SoundController class over the Web Audio API, wrapped in a React context.

Maps

MapLibre GL with CARTO tiles and an IP-based visitor lookup.

State

Theme and sound contexts with local storage persistence.

Tooling

Oxlint for linting, Vite for fast builds, and Git for version control.

RoutePage
/Story, interactive cards, map and drum pad
/projectsShowcase cards and in-depth case studies
/experienceTimeline, education and certifications
/skillsFlip cards grouped by category
/contactEmail, links, resume and message form

Outcome

The portfolio is a complete, working product that I designed, built and maintain alone. It shows the full range of my front-end work: architecture, design systems, animation, graphics, audio, accessibility and performance, all in one codebase of 14,000+ lines. Most importantly it is the proof behind everything else on this site.

What I learned

  • Delight and performance can coexist when every effect has a budget
  • Design tokens make a big visual change a small code change
  • Accessibility and reduced motion are part of the design, not a patch
  • Studying great interactions, then rebuilding them, is the fastest way to learn

Several interactions, such as the sound design, the rainbow configurator and the smooth theme switch, are rebuilds inspired by joshwcomeau.com, written in my own code as a way to learn the techniques.

What is next

  • Add a live demo link and analytics
  • Move case-study content into data files and add a blog
  • Add automated accessibility and performance checks