This is my 2025 portfolio — built to feel like a polished product page, not a PDF with a navigation bar.
Lots of motion, lots of glass, and a few “wait… that’s interactive?” moments. That's right.
Try switching between light & dark mode here, and see the difference.
The vibe · What’s inside · Run it locally · EmailJS setup · Project map
A soft, cloudy parallax background. Liquid-glass UI. Snappy motion that’s more “buttery” than “bouncy for no reason.” Everything is designed to reward hovering, scrolling, and clicking around.
The background layers live in App.tsx and swap cleanly between light/dark using public/clouds.png and public/clouds_night.png.
- Core glass styles in
index.css(.glass,.chromatic-glass,.liquid-card). - Reusable “section enters like it has a pulse” wrapper:
SectionWrapperincomponents/ui/SectionWrapper.tsx.
- Site-wide motion language powered by Framer Motion (you’ll see it everywhere).
- Smooth scrolling via Lenis RAF loop in
App.tsx.
- The bottom dock has that magnetic “macOS energy” when you move your cursor across it.
- First-time visitors get a spotlight walkthrough stored in
localStorage, implemented incomponents/Navbar.tsx.
- A 5×5 “toggle neighbors” puzzle with win confetti and an optional auto-solve.
- The whole thing lives in
components/Hero.tsx.
- Global
.cur/.anicursor set wired inindex.css. - Cursor public live in
public/cursors/.
- EmailJS integration + success/error UX in
components/Contact.tsx.
- A “macOS window” style resume viewer with zoom controls in
components/Resume.tsx.
npm install
npm run devVite runs on port 3000 (configured in vite.config.ts).
Create .env.local in the repo root:
VITE_EMAILJS_SERVICE_ID=...
VITE_EMAILJS_TEMPLATE_ID=...
VITE_EMAILJS_PUBLIC_KEY=...The form uses these values in components/Contact.tsx.
App shell / orchestration
Sections
- Dock + spotlight guide:
components/Navbar.tsx - Hero + mini-game:
components/Hero.tsx - Projects bento grid:
components/Projects.tsx - Experience timeline:
components/Experience.tsx - Resume window:
components/Resume.tsx - Email form:
components/Contact.tsx - Footer + back-to-top:
components/Footer.tsx
UI primitives
- Tilt + glow card:
GlowingCardincomponents/ui/GlowingCard.tsx - CTA button:
LiquidButtonincomponents/ui/LiquidButton.tsx - Hover scramble text:
TextScrambleincomponents/ui/TextScramble.tsx - Parallax typography band:
VelocityScrollincomponents/ui/VelocityScroll.tsx
Types live in types.ts (ex: Project, ExperienceItem).
This is my personal portfolio. If you borrow ideas (please do), swap out the branding, copy, and public — and leave a little attribution somewhere.