A modern, performant portfolio website built with Next.js, TypeScript, and Tailwind CSS. Features a comprehensive personal showcase with projects, work experience, skills, testimonials, and integrated blog functionality.
Live Demo: iamk.xyz
- ⚡ Built with Next.js 16 and React 19
- 🎨 Styled with Tailwind CSS 4 (PostCSS)
- 📝 Dual blog system: MDX posts + Hashnode integration
- 🌙 Dark mode support with next-themes
- 📱 Fully responsive design
- 🚀 Optimized for performance and SEO
- 📊 Analytics integration (Google Analytics, Vercel Analytics)
- ♿ Accessibility compliant
- 🎭 Advanced UI components with animations
- 🔧 TypeScript for type safety
- Profile Section - Hero area with introduction and current status
- Projects Section - Showcase of work with detailed case studies
- Work Experience - Professional timeline with achievements
- Skills Section - Technical skills and expertise
- Testimonials - Client and colleague feedback
- Education - Academic background
- Articles/Blog - Technical writing and content
- MDX Blog Posts - Local markdown content with full control
- Hashnode Integration - Fetch and display Hashnode articles via GraphQL API
- ✅ Write on Hashnode, display on your portfolio
- ✅ Full control over blog UI/UX
- ✅ Direct GraphQL API integration
- ✅ Custom styling with your design system
- Custom animations with Motion library
- Interactive project cards with video previews
- Floating CTA components
- Enhanced testimonials display
- Responsive navigation with theme switching
- Framework: Next.js 16 (with Turbopack support)
- Language: TypeScript
- Styling: Tailwind CSS 4 (PostCSS)
- Content: MDX + Hashnode GraphQL API
- Animations: Motion (Framer Motion successor)
- Icons: Lucide React
- Themes: next-themes
- Analytics: Vercel Analytics + Google Analytics
- Deployment: Vercel
- Node.js 18+ installed
- npm, yarn, or pnpm package manager
- Clone the repository:
git clone https://github.com/KOUSTAV2409/myportfolio.git
cd myportfolio- Install dependencies:
npm install
# or
yarn install
# or
pnpm install- Create environment file:
cp .env.example .env- Configure your environment variables in
.env:
NEXT_PUBLIC_SITE_URL=http://localhost:3000
NEXT_PUBLIC_GA_ID=your-google-analytics-id
NEXT_PUBLIC_CONTACT_EMAIL=your-email@example.com- Run the development server:
npm run dev- Open http://localhost:3000 in your browser.
All personal data is centralized in src/app/data.ts. Edit this file to customize:
export const EMAIL = 'your-email@example.com'
export const CURRENT_STATUS = {
text: 'Your current availability status',
date: 'Month Year',
link: 'mailto:your-email@example.com'
}Update the PROJECTS array with your projects:
export const PROJECTS: Project[] = [
{
name: 'Project Name',
description: 'Brief description',
link: 'https://project-url.com',
video: '/videos/project-demo.mp4', // Place videos in public/videos/
image: '/images/projects/project.png', // Place images in public/images/projects/
id: 'unique-project-id',
year: '2025',
role: 'Your Role',
tech: 'Tech Stack Used',
challenge: 'Problem you solved',
approach: ['Step 1', 'Step 2', 'Step 3'],
solution: 'How you solved it',
impact: ['Impact 1', 'Impact 2'],
metrics: 'Key metrics or results',
clientType: 'Client/Project Type',
timeline: 'Duration',
github: 'https://github.com/username/repo' // Optional
}
]Update the WORK_EXPERIENCE array:
export const WORK_EXPERIENCE: WorkExperience[] = [
{
company: 'Company Name',
title: 'Your Title',
start: 'Month Year',
end: 'Present', // or 'Month Year'
location: 'Location',
employmentType: 'Full-time/Part-time/Contract/Internship',
link: 'https://company-website.com',
id: 'unique-work-id',
description: 'Brief role description',
achievements: [
'Achievement 1',
'Achievement 2',
'Achievement 3'
]
}
]Update the SKILLS array:
export const SKILLS = [
'JavaScript',
'React',
'Your Skill 1',
'Your Skill 2',
// Add your skills
]Update the EDUCATION object:
export const EDUCATION = {
institution: 'Your University',
degree: 'Your Degree',
duration: 'Start-End Year',
cgpa: 'Your GPA/CGPA'
}Update the SOCIAL_LINKS array:
export const SOCIAL_LINKS: SocialLink[] = [
{
label: 'GitHub',
link: 'https://github.com/yourusername',
},
{
label: 'LinkedIn',
link: 'https://linkedin.com/in/yourprofile',
},
// Add more social links
]Update the TESTIMONIALS array:
export const TESTIMONIALS: Testimonial[] = [
{
name: 'Client Name',
role: 'Their Role',
company: 'Their Company',
content: 'Testimonial text',
avatar: '/images/avatar.jpg' // Optional
}
]- Create a new MDX file in
src/app/blog/[slug]/directory:
mkdir -p src/app/blog/your-post-slug- Create
page.mdxin that folder:
export const metadata = {
title: 'Your Post Title',
description: 'Post description for SEO',
date: '2025-01-15',
author: 'Your Name',
tags: ['tag1', 'tag2']
}
# Your Post Title
Your content here...- Add the post to
BLOG_POSTSarray insrc/app/data.ts:
export const BLOG_POSTS: BlogPost[] = [
{
title: 'Your Post Title',
description: 'Brief description',
link: '/blog/your-post-slug',
uid: 'unique-blog-id',
}
]Configure Hashnode integration in src/lib/hashnode.ts:
const USERNAME = 'your-hashnode-username'
const RSS_URL = 'https://your-blog.hashnode.dev/rss.xml'The integration supports both GraphQL API and RSS fallback for maximum reliability.
- Profile/Avatar: Place in
public/images/ - Project Images: Place in
public/images/projects/ - Legacy Project Images:
public/projects_img/(for backward compatibility) - Project Videos: Place in
public/videos/(not included in repo) - Blog Images: Place in
public/blog/ - Company Logos: Place in
public/logos/ - Favicons: Replace files in
public/directory
Update image references in your components and data files accordingly.
Note: Video files are not included in the repository due to size constraints. Add your own demo videos to the public/videos/ directory.
Edit CSS variables in src/app/globals.css:
:root {
--primary: your-color;
--secondary: your-color;
}Update fonts in src/app/layout.tsx and src/app/fonts.css:
import './fonts.css'Update site metadata in src/app/layout.tsx:
export const metadata: Metadata = {
title: 'Your Name - Portfolio',
description: 'Your description',
keywords: ['your', 'keywords'],
authors: [{ name: 'Your Name' }],
// ... other metadata
}Configure analytics in .env:
NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX
NEXT_PUBLIC_VERCEL_ANALYTICS_ID=your-vercel-idAnalytics are automatically integrated via Google Analytics and Vercel Analytics.
myportfolio/
├── public/ # Static assets
│ ├── images/ # Images
│ │ └── projects/ # Project screenshots
│ ├── projects_img/ # Legacy project images
│ ├── videos/ # Project demo videos (not included)
│ └── logos/ # Company/brand logos
├── src/
│ ├── app/ # Next.js app directory
│ │ ├── blog/ # Blog posts (MDX)
│ │ │ ├── [slug]/ # Dynamic blog routes
│ │ │ └── page.tsx # Blog listing page
│ │ ├── about/ # About page
│ │ ├── news/ # News/updates page
│ │ ├── projects/ # Projects page
│ │ ├── portfolio/ # Portfolio page
│ │ ├── data.ts # Main data file (EDIT THIS!)
│ │ ├── layout.tsx # Root layout
│ │ ├── page.tsx # Home page
│ │ └── globals.css # Global styles
│ ├── components/ # React components
│ │ ├── ui/ # Reusable UI components
│ │ ├── kibo-ui/ # Custom UI library components
│ │ └── portfolio/ # Portfolio-specific components
│ ├── lib/ # Utility functions
│ │ ├── hashnode.ts # Hashnode integration
│ │ ├── analytics.ts # Analytics utilities
│ │ └── utils.ts # General utilities
│ └── hooks/ # Custom React hooks
├── .env # Environment variables (not in git)
├── .env.example # Example environment variables
├── next.config.mjs # Next.js configuration
├── postcss.config.mjs # PostCSS configuration
├── components.json # shadcn/ui configuration
└── package.json # Dependencies
npm run dev # Start development server with Turbopack
npm run build # Build for production
npm run start # Start production server
npm run lint # Run ESLint
npm run lint:fix # Fix ESLint errors
npm run type-check # Check TypeScript types
npm run format # Format code with Prettier
npm run format:check # Check code formatting
npm run clean # Clean build cache
npm run analyze # Analyze bundle sizeCreate a .env file in the root directory:
# Site Configuration
NEXT_PUBLIC_SITE_URL=https://yourdomain.com
# Analytics
NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX
NEXT_PUBLIC_VERCEL_ANALYTICS_ID=your-vercel-id
# Contact
NEXT_PUBLIC_CONTACT_EMAIL=your-email@example.com
# Optional: Additional Analytics
NEXT_PUBLIC_HOTJAR_ID=your-hotjar-id
NEXT_PUBLIC_MIXPANEL_TOKEN=your-mixpanel-token- Push your code to GitHub
- Import your repository on Vercel
- Configure environment variables
- Deploy!
This is a standard Next.js app and can be deployed to:
- Netlify
- AWS Amplify
- Railway
- Render
- Any platform supporting Node.js
- Optimize images using Next.js Image component
- Keep videos compressed (use MP4 with H.264 codec)
- Minimize JavaScript bundle size
- Use dynamic imports for heavy components
- Enable caching headers
npm run clean
rm -rf node_modules package-lock.json
npm install
npm run buildnpm run type-check- Clear browser cache
- Check Tailwind CSS configuration
- Verify CSS import order
Feel free to fork this project and customize it for your own use. If you find bugs or have suggestions, please open an issue.
This project's code is open source and available under the MIT License.
You are free to:
- ✅ Use the code for personal or commercial projects
- ✅ Modify and customize the code
- ✅ Distribute and share the code
All personal content is protected and NOT covered by the MIT License:
This includes:
- ❌ Personal information, biography, contact details
- ❌ Personal photographs, videos, and images
- ❌ Project descriptions and case studies (as examples of my work)
- ❌ Work experience details
- ❌ Blog posts and written content
- ❌ Testimonials
You MUST replace all personal content with your own before using this template.
See LICENSE for full details.
Built with
If you found this helpful, consider:
- ⭐ Starring the repository
- 🐛 Reporting bugs
- 💡 Suggesting new features
- 📢 Sharing with others
Need help? Open an issue or reach out via email