Personal portfolio built with Next.js App Router, TypeScript, Tailwind CSS, Framer Motion, and Sanity CMS.
- Next.js 14 (App Router)
- React 18 + TypeScript
- Tailwind CSS
- Framer Motion
- Sanity (headless CMS)
- Formspree (contact form handling)
- Responsive sections: Hero, About, Skills, GitHub Stats, Projects, Experience, Contact
- Theme toggle (light/dark mode)
- Animated project details modal with keyboard and focus handling
- Embedded Sanity Studio route at
/studio - SEO metadata + sitemap route
- Custom
not-foundpage
src/
app/
components/
layout/
sections/
ui/
data/
hooks/
lib/
Use .env.example as the template and create .env.local for local development.
Required variables:
NEXT_PUBLIC_SANITY_PROJECT_IDNEXT_PUBLIC_SANITY_DATASETNEXT_PUBLIC_SANITY_API_VERSIONNEXT_PUBLIC_FORMSPREE_ID
Install dependencies:
npm installRun development server:
npm run devOpen http://localhost:3000.
- Start app with
npm run dev. - Open
http://localhost:3000/studio. - Sign in and update documents (Project, Skill, Profile, Experience).
npm run dev- start local dev servernpm run build- production buildnpm run start- serve production buildnpm run lint- run ESLint
- Replace resume placeholder with real
resume.pdfin/public - Set all environment variables in Vercel dashboard
- Replace LinkedIn URL with real profile URL if changed
- Update
src/app/sitemap.tswith real domain after deployment - Log into Sanity Studio at
/studioand add real content - Test contact form submission end to end
- Test on mobile device before sharing with recruiters