A modern portfolio website built with Next.js, Tailwind CSS, and Framer Motion to showcase projects, skills, experience, and live GitHub activity.
- Responsive single-page portfolio layout with a sticky scroll-spy navigation and mobile menu
- Light / dark theme toggle with no-flash initialization and
prefers-color-schemedefault - Recruiter Mode toggle for a concise impact-first view
- Animated hero with a rotating role headline and an "open to work" availability badge
- Live GitHub stats strip (repos, stars, followers, years) with count-up animation
- Filterable projects grid (AI / ML, Data, Full-Stack) with repository and live-demo links
- Live GitHub activity section:
- recent commits
- active repositories
- Open-source contributions feed (recent pull requests)
- Smooth UI interactions and section animations with Framer Motion
- Resume download, copy-email, social icon links, and a back-to-top control
- SEO + Open Graph metadata
- Next.js (App Router)
- React
- Tailwind CSS
- Framer Motion
- GitHub API (via Next.js API route)
npm install
npm run devOpen http://localhost:3000
Optional environment variable for higher GitHub API limits:
GITHUB_TOKEN=your_token_herenpm run build
npm run startRun linting before opening a pull request:
npm run lint- CI workflow runs on every push/PR to
main - CI checks include
lintand productionbuild - Matrix validation on Node.js 20 and 22
- Dependabot creates weekly update PRs for npm and GitHub Actions
app/
api/activity/route.js # Server-side GitHub activity endpoint
api/contributions/route.js # Recent pull requests endpoint
api/stats/route.js # GitHub profile stats (repos, stars, followers)
globals.css # Global styles, theme tokens, Tailwind import
layout.jsx # Root layout + SEO metadata + theme init script
page.jsx # Main portfolio page
public/
resume.md # Downloadable resume content
The live activity section uses app/api/activity/route.js and includes a fallback:
- Primary: GitHub public push events
- Fallback: recent authored commits from active repositories
This helps keep activity visible even when the public events feed has no recent push events.