A modern, responsive portfolio website built with Next.js, TypeScript, and Tailwind CSS. This project showcases my skills, projects, and experience as a frontend developer.
- Framework: Next.js 14 (App Router)
- Language: TypeScript
- Styling: Tailwind CSS
- Icons: Lucide React
- Deployment: Vercel
- Analytics: Vercel Analytics & Speed Insights
mayur_portfolio/
βββ src/
β βββ app/
β β βββ layout.tsx # Global layout wrapper
β β βββ globals.css # Global styles & Tailwind imports
β β βββ page.tsx # Home page
β β βββ about/
β β β βββ page.tsx # About page
β β βββ projects/
β β β βββ page.tsx # Projects showcase page
β β βββ contact/
β β β βββ page.tsx # Contact page
β β βββ provider/
β β βββ NoSSRProvider.tsx
β βββ components/
β β βββ Header.tsx # Navigation header
β β βββ Footer.tsx # Footer with social links
β β βββ Menubar.tsx # Navigation menu component
β β βββ SocialsMenu.tsx # Social media links
β β βββ ScrollingUpButton.tsx # Scroll navigation buttons
β β βββ MyProjects.tsx # Projects grid component
β β βββ Experience.tsx # Experience section
β β βββ MyStory.tsx # Personal story section
β β βββ Skils.tsx # Skills showcase
β β βββ ProjectBanner.tsx # Project banner component
β β βββ Myplace.tsx # Location/mission component
β βββ data/
β β βββ projectData.ts # Project data array
β βββ lib/
β βββ utils.ts # Utility functions
βββ image-sources/ # Full-size originals (never served)
β βββ assets/projects/ # Project screenshots
β βββ og/ # Social card artwork
β βββ profile.jpg # Profile image
βββ public/ # Everything here except icon/ + PDF is generated
β βββ optimized/ # One WebP per image, served as-is
β βββ og/ # 1200x630 social cards
β βββ icon/ # SVG icons
β βββ MayurResume.pdf # Downloadable resume
β βββ profile.jpg # Compressed profile image
βββ scripts/
β βββ optimize-images.mjs # Builds public/ images from image-sources/
β βββ verify-images.mjs # Post-build guard against /_next/image
βββ package.json
βββ tailwind.config.ts
βββ tsconfig.json
βββ README.md
- Header: Sticky navigation with responsive mobile menu
- Footer: Social links, navigation, and contact CTA
- Scroll Buttons: Floating scroll-to-top and scroll-down buttons
- Analytics: Vercel Analytics and Speed Insights integration
- Header (
Header.tsx):- Logo with brand styling
- Responsive navigation menu
- Mobile hamburger menu with smooth transitions
- Contact button with icon
- Menubar (
Menubar.tsx): Reusable navigation component used in header and footer - SocialsMenu (
SocialsMenu.tsx): Social media icons (Instagram, LinkedIn, GitHub)
- Hero Section: Animated background, profile image, and introduction
- Key Features:
- Gradient text effects
- Floating decorative elements
- Call-to-action buttons
- Responsive image with hover effects
- Sections: Experience, Project Banner, Skills, My Story
- Mission Statement: Personal values and goals
- About Cards: Four key characteristics (Passionate, Goal-Oriented, User-Focused, Quality Driven)
- Sections: Myplace, MyStory, Experience
- Header Section: Project statistics and introduction
- Projects Grid: Showcase of featured projects
- Professional Note: Explanation of portfolio limitations due to client confidentiality
- Features:
- Project cards with hover effects
- Live demo and source code links
- Technology tags
- Project status indicators
- Contact Information: Email, phone, location, availability
- Interactive Elements: Clickable contact methods
- Call-to-Action: Project initiation and resume download
- Features: Responsive layout with contact highlights
- Scroll Up Button: Appears after scrolling, smooth scroll to top
- Scroll Down Button: Initial prompt to explore content
- Features: Animated scroll indicators, smooth transitions
- Project Cards: Grid layout with hover effects
- Features:
- Image hover zoom effects
- Overlay with action buttons
- Technology stack tags
- Live demo and GitHub links
- Project status indicators
- Decorative hover elements
- Mobile-first approach
- Breakpoint-specific layouts (sm, md, lg, xl)
- Flexible grid systems
- Touch-friendly interactions
- Next.js Image optimization
- Lazy loading for images
- Efficient component rendering
- Vercel edge caching
- Semantic HTML structure
- Proper heading hierarchy
- Alt text for images
- Keyboard navigation support
- Focus management
- Dynamic metadata for each page
- OpenGraph and Twitter card support
- Structured data for search engines
- Optimized meta descriptions and keywords
- Node.js 18+
- npm, yarn, or pnpm
-
Clone the repository
git clone https://github.com/yourusername/mayur_portfolio.git cd mayur_portfolio -
Install dependencies
npm install # or yarn install # or pnpm install
-
Run the development server
npm run dev # or yarn dev # or pnpm dev
-
Open your browser Navigate to http://localhost:3000
Edit src/data/projectData.ts:
{
title: "Project Name",
description: "Project description",
image: "/assets/projects/project-image.jpg",
technologies: ["React", "TypeScript", "Tailwind"],
liveUrl: "https://project-demo.com",
githubUrl: "https://github.com/username/project",
status: "Live"
}Originals live in image-sources/; everything under public/optimized/ (plus
public/og/*.jpg and public/profile.jpg) is generated. After adding or
replacing an original, rebuild the derived assets and commit them:
npm run imagesThat script writes one WebP per image (only for originals the code actually
references), the four 1200x630 social cards, and src/lib/image-manifest.json,
which the custom next/image loader (src/lib/imageLoader.ts) reads. Images are
therefore plain CDN files and never consume Vercel's metered image
transformations. npm run build runs scripts/verify-images.mjs, which fails if
a page reaches for /_next/image or references an image that is not on disk.
Do not add images.formats to next.config.mjs. Changing the format list
invalidates every optimized image Vercel has cached, which is what exhausted the
transformation quota and blanked the images in production.
- Profile Image: Replace
image-sources/profile.jpg, then runnpm run images - Resume: Replace
public/MayurResume.pdf - Contact Info: Update in
src/app/contact/page.tsx - Social Links: Edit
src/components/SocialsMenu.tsx
- Colors: Update Tailwind config in
tailwind.config.ts - Components: Edit individual component files in
src/components/ - Global Styles: Modify
src/app/globals.css
- Create new directory in
src/app/ - Add
page.tsxwith metadata export - Update navigation in
src/components/Menubar.tsx
- Primary: Purple (#8B5CF6, #7C3AED)
- Secondary: Gray (#4B5563, #6B7280)
- Background: White (#FFFFFF), Light Gray (#F9FAFB)
- Text: Dark Gray (#1F2937), Medium Gray (#4B5563)
- Headings: Bold, large scale (text-4xl to text-8xl)
- Body: Regular weight, readable line height
- Font Family: System fonts (Inter, system-ui)
- Container: Responsive padding (px-4 md:px-8 lg:px-28)
- Sections: Consistent vertical spacing (py-16, py-20, py-28)
- Components: Flexible gap systems
- Mobile: < 768px
- Tablet: 768px - 1024px
- Desktop: > 1024px
- Large Desktop: > 1280px
npm run build- Connect your GitHub repository to Vercel
- Configure build settings
- Deploy automatically on push to main branch
Create .env.local for local development:
NEXT_PUBLIC_SITE_URL=http://localhost:3000- Lighthouse Score: 95+ (Performance, Accessibility, Best Practices, SEO)
- Core Web Vitals: Optimized for all metrics
- Bundle Size: Optimized with Next.js built-in optimizations
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
This project is open source and available under the MIT License.
- Email: mayurnakum07@gmail.com
- LinkedIn: Mayur Nakum
- GitHub: mayurnakum07
- Instagram: @mayurnakum_07
Made with π by Mayur Nakum