A premium, fully-responsive portfolio built with Next.js 15, React 19, TypeScript, Tailwind CSS, and Framer Motion.
| Feature | Status |
|---|---|
| Multi-page routing (Home, About, Projects, Resume, Contact) | ✅ |
| Dark / Light mode with persistence | ✅ |
| Smooth animations (Framer Motion) | ✅ |
| Typewriter hero with animated stats | ✅ |
| Projects with category filter + search | ✅ |
| Contact form with Resend API | ✅ |
| Animated skill progress bars | ✅ |
| JSON-LD structured data (Person + WebSite) | ✅ |
| Dynamic sitemap.xml + robots.txt | ✅ |
| Open Graph + Twitter Cards | ✅ |
| Accessibility (WCAG, ARIA, keyboard nav) | ✅ |
| Mobile-first responsive design | ✅ |
| GitHub Actions CI/CD pipeline | ✅ |
| All data from JSON files (no hardcoded content) | ✅ |
portfolio/
├── app/
│ ├── about/page.tsx # About page
│ ├── contact/page.tsx # Contact page
│ ├── projects/page.tsx # Projects page
│ ├── resume/page.tsx # Resume page
│ ├── api/contact/route.ts # Contact form API (Resend)
│ ├── globals.css # Global styles
│ ├── layout.tsx # Root layout + metadata
│ ├── page.tsx # Home page
│ ├── sitemap.ts # Dynamic sitemap
│ └── robots.ts # Robots.txt
├── components/
│ ├── layout/
│ │ ├── Navbar.tsx # Sticky glass nav with active states
│ │ ├── Footer.tsx # Rich footer
│ │ └── ThemeProviderWrapper.tsx
│ ├── pages/
│ │ ├── AboutPageContent.tsx
│ │ ├── ProjectsPageContent.tsx
│ │ ├── ResumePageContent.tsx
│ │ └── ContactPageContent.tsx
│ ├── sections/ # Home page sections
│ │ ├── Hero.tsx # Typewriter + animated stats
│ │ ├── About.tsx # Skills overview
│ │ ├── Projects.tsx # Featured projects
│ │ ├── Resume.tsx # Timeline
│ │ └── Contact.tsx # Contact form
│ └── ui/
│ ├── AnimatedCounter.tsx
│ ├── Badge.tsx
│ ├── SectionHeader.tsx
│ ├── SkillBadge.tsx
│ ├── ThemeToggle.tsx
│ ├── Timeline.tsx
│ └── Toast.tsx
├── data/
│ ├── education.json
│ ├── experience.json
│ ├── projects.json
│ └── skills.json
├── hooks/
│ └── useAnimatedCounter.ts
├── lib/
│ └── utils.ts
├── public/
│ └── resume/ # Place zahid-iqbal-resume.pdf here
├── types/
│ └── index.ts
├── .env.example
├── .github/workflows/ci.yml
├── next.config.ts
├── tailwind.config.ts
└── tsconfig.json
- Node.js 18+ (20 recommended)
- npm 9+
git clone https://github.com/zahidhml/zahid-portfolio.git
cd zahid-portfolio
npm installcp .env.example .env.localEdit .env.local:
# Required for contact form (get from resend.com)
RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxx
# Your deployed URL
NEXT_PUBLIC_SITE_URL=https://zahidiqbal.dev
# Email to receive contact form messages
NEXT_PUBLIC_CONTACT_EMAIL=zahidbinsahib@gmail.com
# Optional: Google Search Console verification
GOOGLE_SITE_VERIFICATION=your_token_herePlace your resume PDF at:
public/resume/zahid-iqbal-resume.pdf
npm run devOpen http://localhost:3000 to see your portfolio.
npm install -g vercel
vercel- Push to GitHub
- Go to vercel.com → New Project → Import your repo
- Add environment variables in Vercel dashboard:
RESEND_API_KEYNEXT_PUBLIC_SITE_URL(your Vercel URL or custom domain)NEXT_PUBLIC_CONTACT_EMAIL
- Deploy!
Vercel automatically deploys every push to main.
- Sign up at resend.com (free tier: 3,000 emails/month)
- Create an API key: Settings → API Keys → Add API Key
- Add the key to your
.env.localasRESEND_API_KEY - (Optional) Verify your domain to send from your own email address
Dev mode: If
RESEND_API_KEYis not set, the form will still show success in development and log submissions to the console.
All content is driven by JSON files — no need to edit component code:
| File | Contains |
|---|---|
data/projects.json |
Project cards, links, tech, descriptions |
data/skills.json |
Skills by category with proficiency levels |
data/experience.json |
Work experience entries |
data/education.json |
Education entries |
Edit tailwind.config.ts:
colors: {
primary: {
DEFAULT: '#0F6E56', // deep teal
light: '#1D9E75', // lighter teal
},
accent: '#BA7517', // golden amber
}Also update CSS variables in app/globals.css.
The GitHub Actions workflow at .github/workflows/ci.yml runs on every push:
- ESLint — code quality
- TypeScript — type safety
- Next.js Build — production build validation
Add these secrets to your GitHub repo for the workflow:
RESEND_API_KEYCONTACT_EMAIL
| Route | Description |
|---|---|
/ |
Home — Hero, About preview, Projects preview, Resume, Contact |
/about |
Full biography, career timeline, skills grid, languages |
/projects |
All projects with search + category filter |
/resume |
Resume with timeline, skill bars, certifications |
/contact |
Contact form with FAQ |
- JSON-LD — Person + WebSite schemas for rich search results
- Dynamic sitemap —
/sitemap.xmlauto-generated - robots.txt —
/robots.txtauto-generated - Open Graph — per-page OG tags for social sharing
- Twitter Cards — summary_large_image cards
- Canonical URLs — prevents duplicate content
- Dynamic metadata — per-page title + description
- Semantic HTML (main, nav, header, footer, article, section)
- Skip to content link for keyboard users
- ARIA labels on all interactive elements
- Focus-visible styles throughout
- Keyboard navigation fully supported
- Reduced motion media query support
- Screen reader friendly (role, aria-label, aria-invalid)
MIT © 2024 Muhammad Zahid Iqbal
Built with ❤️ from Chitral, Pakistan