A modern, responsive, and highly customizable portfolio website built with React, TypeScript, and TailwindCSS. This template is designed to be easily forkable and reusable for any developer looking to showcase their work professionally.
- Responsive Design: Looks great on all devices
- Dark/Light Theme: Toggle between themes
- Smooth Animations: Powered by Framer Motion
- SEO Optimized: Meta tags and semantic HTML
- Fast Loading: Optimized builds and lazy loading
- Flexible Contact Forms: Support for multiple form providers
- TypeScript: Full type safety
- Modern Stack: React 18, Vite, TailwindCSS
- Hero Section: Eye-catching introduction with call-to-action buttons
- About: Personal information with social links and contact details
- Skills: Categorized skill display with proficiency levels and animations
- Experience: Timeline-based work experience with detailed descriptions
- Projects: Featured project showcase with technology stacks
- Contact: Functional contact form with validation and status feedback
- Personal Configuration: Type-safe personal data management with automatic Git ignore
- Resume Caching: Intelligent caching for resume downloads with cache management
- Analytics Integration: Privacy-focused analytics with Google Analytics support
- Flexible Contact Forms: Support for multiple providers (Netlify, Vercel, Formspree, EmailJS, Custom)
- Type Safety: Full TypeScript implementation with strict type checking
- Code Quality: ESLint, Prettier, and comprehensive error handling
- Build Optimization: Vite build system with automatic chunking and optimization
- Node.js 18+
- npm 8+ or yarn
-
Clone the repository
git clone https://github.com/yourusername/portfolio-website.git cd portfolio-website
-
Install dependencies
npm install
-
Set up personal configuration
cp src/config/personal.example.ts src/config/personal.ts
-
Configure your information Edit
src/config/personal.ts
with your personal details (see Configuration section below) -
Start development server
npm run dev
-
Open in browser Navigate to
http://localhost:3000
This portfolio uses a hybrid approach that separates sensitive personal data from professional content:
-
Create a
.env
file in the root directory:# Copy from the template provided in personal.example.ts # Add your sensitive information
-
Add your sensitive information:
VITE_FULL_NAME="Your Full Name" VITE_EMAIL="your.email@example.com" VITE_PHONE="+1-234-567-8900" VITE_GITHUB_URL="https://github.com/yourusername" VITE_RESUME_URL="https://drive.google.com/file/d/your-resume-id/view" VITE_CONTACT_PROVIDER="netlify" # ... see .env.example for complete list
-
Important: The
.env
file is gitignored and never committed
-
Edit
src/config/personal.ts
with your professional content:- Work experience
- Projects
- Education
- Certifications
-
This file IS committed to GitHub so others can see the template structure
- 🔒 Privacy: Sensitive data (email, phone, resume) stays in .env
- 🚀 Reusability: Professional content provides a template for others
- ⚡ Simple: No complex build scripts or external APIs
- 🛡️ Secure: Contact information never exposed in public repo
This project supports multiple contact form providers. Choose the one that best fits your needs:
- Netlify Forms (Default) - Zero configuration for Netlify deployments
- Vercel - For Vercel deployments with API routes
- Formspree - Third-party service, no backend required
- EmailJS - Frontend-only solution
- Custom Backend - Your own API endpoint
- Set
VITE_CONTACT_PROVIDER="netlify"
in your.env
file - Deploy to Netlify - forms are automatically detected
To use a different provider, update your .env
file:
# For Formspree
VITE_CONTACT_PROVIDER="formspree"
VITE_CONTACT_ENDPOINT="https://formspree.io/f/your-form-id"
# For EmailJS
VITE_CONTACT_PROVIDER="emailjs"
VITE_EMAILJS_SERVICE_ID="your-service-id"
VITE_EMAILJS_TEMPLATE_ID="your-template-id"
VITE_EMAILJS_PUBLIC_KEY="your-public-key"
# For Custom Backend
VITE_CONTACT_PROVIDER="custom"
VITE_CONTACT_ENDPOINT="https://your-api.com/contact"
VITE_CONTACT_API_KEY="your-api-key"
For detailed setup instructions for all providers, see CONTACT_SETUP.md
Edit src/config/portfolio.ts
to modify the skills array:
skills: [
{ name: 'React', level: 95, category: 'frontend' },
{ name: 'Node.js', level: 90, category: 'backend' },
// Add more skills...
]
Update the projects array in the same file:
projects: [
{
id: 'project-1',
title: 'Your Project Title',
description: 'Brief description',
technologies: ['React', 'TypeScript'],
featured: true,
category: 'web',
},
// Add more projects...
]
Modify the experience section:
experience: [
{
id: 'exp-1',
company: 'Company Name',
position: 'Your Position',
duration: '2022 - Present',
location: 'City, Country',
description: ['Achievement 1', 'Achievement 2'],
technologies: ['Tech1', 'Tech2'],
current: true,
},
// Add more experiences...
]
npm run dev
- Start development servernpm run build
- Build for productionnpm run preview
- Preview production buildnpm run lint
- Run ESLintnpm run lint:fix
- Fix ESLint errorsnpm run format
- Format code with Prettiernpm run type-check
- Run TypeScript type checking
src/
├── components/ # React components
│ ├── Header.tsx # Navigation header
│ ├── Hero.tsx # Hero section
│ ├── About.tsx # About section
│ ├── Skills.tsx # Skills section
│ ├── Experience.tsx # Experience timeline
│ ├── Projects.tsx # Projects showcase
│ ├── Contact.tsx # Contact form
│ └── Footer.tsx # Footer
├── config/ # Configuration files
│ └── portfolio.ts # Main portfolio config
├── hooks/ # Custom React hooks
│ ├── useTheme.ts # Theme management
│ └── useScrollAnimation.ts # Scroll animations
├── types/ # TypeScript type definitions
│ └── index.ts # Main types
├── utils/ # Utility functions
│ ├── cache.ts # Caching utilities
│ └── analytics.ts # Analytics tracking
├── App.tsx # Main app component
├── main.tsx # App entry point
└── index.css # Global styles
The project uses TailwindCSS with custom configurations:
- Custom Colors: Primary color palette with dark mode variants
- Typography: Inter font for text, JetBrains Mono for code
- Components: Reusable component classes in
src/index.css
- Animations: Custom keyframes and transitions
- Create a new component in
src/components/
- Add the component to
src/App.tsx
- Update navigation in
src/components/Header.tsx
- Add any required configuration to
src/config/portfolio.ts
-
Connect repository
- Import project in Vercel dashboard
- Connect your GitHub repository
-
Ensure personal configuration
- Your
src/config/personal.ts
file contains your information - No environment variables needed (all config is file-based)
- Your
-
Deploy
- Vercel will automatically build and deploy
- Set up custom domain if needed
-
Build settings
Build command: npm run build Publish directory: dist
-
Environment variables
- Add all your
VITE_*
variables from.env
in Netlify dashboard - Go to Site settings → Environment variables
- Add all your
-
Deploy
- Connect repository and deploy
- Contact forms work automatically with Netlify Forms
For detailed Netlify deployment instructions, see NETLIFY_DEPLOYMENT.md
-
Build the project
npm run build
-
Upload to hosting
- Upload
dist/
folder contents to your web server - Ensure proper routing for SPA
- Upload
Modify tailwind.config.js
to change the color scheme:
theme: {
extend: {
colors: {
primary: {
// Your custom color palette
}
}
}
}
Update font imports in index.html
and configure in tailwind.config.js
- Modify animation variants in components
- Add new animations in
tailwind.config.js
- Disable animations by setting
VITE_ENABLE_ANIMATIONS=false
- Adjust section padding in
src/index.css
- Modify component layouts in individual component files
- Change container max-width in Tailwind config
- Code Splitting: Automatic vendor and animation chunks
- Image Optimization: Proper image sizing and formats
- Caching: Resume and asset caching with cleanup
- Lazy Loading: Components loaded on demand
- Bundle Analysis: Built-in chunk optimization
- Optimize images before adding to project
- Use proper image formats (WebP, AVIF)
- Monitor bundle size with build analysis
- Enable compression on your hosting platform
- Chrome 90+
- Firefox 88+
- Safari 14+
- Edge 90+
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
MIT License - feel free to use this template for your own portfolio.
If you encounter any issues or have questions:
- Check the documentation
- Search existing issues
- Create a new issue with detailed information
- Consider contributing improvements back to the project
- Blog section integration
- CMS integration options
- Multi-language support
- Advanced animations
- Performance dashboard
- Accessibility improvements
- Built with React, TypeScript, and TailwindCSS
- Icons by Lucide React
- Animations by Framer Motion
- Fonts by Google Fonts
Made with ❤️ by developers, for developers.