A modern, responsive portfolio website built with Next.js, TypeScript, and Tailwind CSS.
- 🎨 Modern and clean UI design
- 📱 Fully responsive layout
- 🌙 Dark mode support
- ⚡ Fast performance with Next.js
- 🎯 Smooth scrolling navigation
- 🎬 Smooth animations with Framer Motion
- 📅 Interactive calendar component
- 💬 Testimonials/Compliments section with MongoDB
- 📧 Contact form
- 🔄 Reusable components with props
- 🖼️ Optional hero image support
- 🚀 Ready for Vercel deployment
- Framework: Next.js 16
- Language: TypeScript
- Styling: Tailwind CSS
- Animations: Framer Motion
- Database: MongoDB (Mongoose)
- UI Components: Custom components with Shadcn-style utilities
- Deployment: Vercel
- Node.js 18+ or Bun
- npm, yarn, pnpm, or bun
- Clone the repository:
git clone <your-repo-url>
cd my-portfolio- Install dependencies:
npm install
# or
bun install-
Set up MongoDB:
- Create a free MongoDB Atlas account at mongodb.com/cloud/atlas
- Create a new cluster (free tier available)
- Get your connection string
- Create a
.env.localfile in the root directory:
MONGODB_URI=your_mongodb_connection_string_here
-
Run the development server:
npm run dev
# or
bun dev- Open http://localhost:3000 in your browser.
my-portfolio/
├── app/
│ ├── api/
│ │ └── testimonials/
│ │ └── route.ts # API route for testimonials
│ ├── layout.tsx # Root layout with metadata
│ ├── page.tsx # Main page component
│ └── globals.css # Global styles
├── components/
│ ├── ui/
│ │ ├── AnimatedSection.tsx # Reusable animation wrapper
│ │ ├── Button.tsx # Reusable button component
│ │ └── Calendar.tsx # Calendar component
│ ├── Header.tsx # Navigation header
│ ├── Hero.tsx # Hero section (with optional image)
│ ├── About.tsx # About section
│ ├── Skills.tsx # Skills section
│ ├── Projects.tsx # Projects showcase
│ ├── Testimonials.tsx # Testimonials section
│ ├── CalendarSection.tsx # Calendar section
│ ├── Contact.tsx # Contact form
│ └── Footer.tsx # Footer component
├── lib/
│ ├── mongodb.ts # MongoDB connection utility
│ └── utils.ts # Utility functions
├── models/
│ └── Testimonial.ts # MongoDB testimonial model
├── public/ # Static assets
└── package.json # Dependencies
-
Hero Section (
components/Hero.tsx):- Update name, title, and description via props
- Add optional profile image:
<Hero image="/path/to/image.jpg" /> - Customize button text and links
-
About Section (
components/About.tsx):- Edit the about text via
paragraphsprop - Update experience years via props
- Edit the about text via
-
Skills (
components/Skills.tsx):- Modify skill categories via
skillCategoriesprop
- Modify skill categories via
-
Projects (
components/Projects.tsx):- Update project details via
projectsprop - Add your GitHub and live demo links
- Update project details via
-
Testimonials (
components/Testimonials.tsx):- Testimonials are automatically loaded from MongoDB
- Add testimonials via API:
POST /api/testimonials - Or manually add to MongoDB database
-
Contact (
components/Contact.tsx):- Update email address
- Add your social media links
-
Metadata (
app/layout.tsx):- Update SEO metadata
- Change title and description
All components are designed to be reusable with props:
// Hero with custom content and optional image
<Hero
name="Your Name"
title="Your Title"
description="Your description"
image="/path/to/image.jpg" // Optional
/>
// About with custom content
<About
title="About Me"
paragraphs={["Paragraph 1", "Paragraph 2"]}
experienceYears="5+"
/>
// Skills with custom categories
<Skills
skillCategories={[
{ title: "Frontend", skills: ["React", "Next.js"] }
]}
/>
// Projects with custom data
<Projects
projects={[
{ title: "Project 1", description: "...", technologies: [...] }
]}
/>- Push your code to GitHub, GitLab, or Bitbucket
- Go to Vercel
- Click "Add New Project"
- Import your repository
- Vercel will auto-detect Next.js settings
- Click "Deploy"
- Install Vercel CLI:
npm i -g vercel- Deploy:
vercel- Follow the prompts to complete deployment
Required:
MONGODB_URI- Your MongoDB connection string (for testimonials)RESEND_API_KEY- Resend API key (for contact form emails)
Optional (for Contact Section):
CONTACT_EMAILorNEXT_PUBLIC_CONTACT_EMAIL- Your email address displayed in contact sectionNEXT_PUBLIC_GITHUB_URL- Your GitHub profile URL (e.g., https://github.com/username)NEXT_PUBLIC_LINKEDIN_URL- Your LinkedIn profile URL (e.g., https://linkedin.com/in/username)
Note: Variables prefixed with NEXT_PUBLIC_ are exposed to the browser and can be used in client components.
Add them in:
- Local: Create
.env.localfile:MONGODB_URI=your_mongodb_connection_string_here RESEND_API_KEY=your_resend_api_key_here CONTACT_EMAIL=your.email@example.com NEXT_PUBLIC_CONTACT_EMAIL=your.email@example.com NEXT_PUBLIC_GITHUB_URL=https://github.com/yourusername NEXT_PUBLIC_LINKEDIN_URL=https://linkedin.com/in/yourusername
- Vercel: Add in Project Settings → Environment Variables
Getting MongoDB URI:
- Sign up for free at MongoDB Atlas
- Create a cluster (free tier M0 available)
- Create a database user
- Whitelist your IP (or use 0.0.0.0/0 for development)
- Get connection string from "Connect" → "Connect your application"
Getting Resend API Key (Free - 3,000 emails/month):
- Sign up for free at Resend
- Go to API Keys section
- Create a new API key
- Copy the API key and add it to
.env.localasRESEND_API_KEY - Add your email address as
CONTACT_EMAIL(where you want to receive contact form submissions)
npm run build
npm startThis project is open source and available under the MIT License.
Ameer Hamza Subhani - [Your Email]
Project Link: https://github.com/yourusername/my-portfolio