A stunning, fully customizable portfolio website template with a brutalist design aesthetic. Perfect for developers, designers, and creative professionals looking to showcase their work.
- π― Modern Design: Bold, brutalist-inspired aesthetic with geometric shapes and strong typography
- π± Fully Responsive: Mobile-first design that looks great on all devices
- β‘ Performance Optimized: Fast loading with lazy loading, code splitting, and efficient animations
- βΏ Accessible: WCAG compliant with keyboard navigation support and screen reader friendly
- π¨ Customizable: Easy-to-edit data files for quick personalization
- π§ Contact Form: Integrated with Formspree for hassle-free contact form handling
- π Resume Viewer: Built-in resume modal with PDF download functionality
- π Interactive Elements: Animated logo, typewriter effects, and custom canvas backgrounds
- Frontend Framework: React 19
- Build Tool: Vite 7
- Styling: Tailwind CSS + Custom CSS
- Icons: React Icons, Lucide React
- Animations: Framer Motion
- Form Handling: Formspree
- Deployment: Vercel / Netlify / GitHub Pages
Before you begin, make sure you have installed:
Option A: Clone with Git
git clone https://github.com/yourusername/portfolio-template.git
cd portfolio-templateOption B: Download ZIP
- Click the green "Code" button on GitHub
- Select "Download ZIP"
- Extract the ZIP file to your desired location
- Open the folder in your terminal
npm installThis will install all required packages (~2-3 minutes).
npm run devYour portfolio will open at http://localhost:5173 π
Edit: src/constants/config.js
This is the most important file! Update it with your information:
export const SITE_CONFIG = {
name: "Your Full Name", // Replace with your name
title: "Your Professional Title", // e.g., "Full-Stack Developer"
location: "Your City, Country",
email: "your.email@example.com",
social: {
github: "https://github.com/yourusername",
linkedin: "https://www.linkedin.com/in/your-profile/",
portfolio: "https://yourportfolio.com/",
},
// ... more settings
};Edit: src/data/projects.js
Add your projects to showcase:
export const FEATURED_PROJECTS = [
{
id: 1,
title: "Your Amazing Project",
subtitle: "Brief tagline",
blurb: "Detailed description of what your project does...",
tech: ["React", "Node.js", "MongoDB"],
image: "/your-project-screenshot.png", // Add image to /public folder
video: null, // Optional video URL
repo: "https://github.com/yourusername/your-project",
demo: "https://your-project.vercel.app",
},
// Add more projects...
];Adding Project Images:
- Place your screenshots in the
/publicfolder - Recommended size: 1200x800px or 16:9 aspect ratio
- Use descriptive filenames (e.g.,
ecommerce-project.png) - Reference them with
/prefix:image: "/ecommerce-project.png"
Edit: src/data/skills.js
Customize your skills with icons from React Icons:
import { FaReact, FaNodeJs } from "react-icons/fa";
export const skills = [
{
icon: <FaReact className="text-sky-500" />,
name: "React",
desc: "Component-based UIs",
},
// Add your skills...
];Step 1: Add Your Resume PDF
- Place your resume PDF in the
/publicfolder - Rename it to something like
YourName-Resume.pdf(no spaces!)
Step 2: Update Configuration
Edit src/components/Resume.jsx (lines 12-17):
const RESUME_URL = "/YourName-Resume.pdf";
const DOWNLOAD_NAME = "YourName-Resume.pdf";Step 3: Update Resume Content (Optional)
The Resume component also shows a visual preview. Update the content starting at line 127 with your information.
Setup Formspree:
- Go to Formspree.io and create a free account
- Create a new form and copy your endpoint URL
- Edit
src/constants/config.js:contact: { formspreeEndpoint: "https://formspree.io/f/your-form-id", }
Profile Image:
- Replace
/public/your-portrait.svgwith your photo - Update references in
src/components/About.jsx
Logo:
- Replace the BatCat logo components if desired
- Or keep them for a unique branding!
Favicon:
- Replace
/public/batcat.svgwith your favicon
Edit: src/index.css
Customize the color scheme by updating CSS variables:
:root {
--bg: #ffffff; /* Background color */
--fg: #111111; /* Text color */
--accent: #ffd600; /* Accent color (yellow by default) */
--border: #111111; /* Border color */
}Change Accent Color Example:
--accent: #ff6b6b; /* Red */
--accent: #4ecdc4; /* Teal */
--accent: #a78bfa; /* Purple */-
Push your code to GitHub:
git init git add . git commit -m "Initial commit" git branch -M main git remote add origin https://github.com/yourusername/your-portfolio.git git push -u origin main
-
Deploy to Vercel:
- Go to vercel.com
- Click "Add New Project"
- Import your GitHub repository
- Vercel will auto-detect Vite settings
- Click "Deploy"
- Done! Your site will be live at
your-project.vercel.app
-
Custom Domain (Optional):
- Go to Project Settings β Domains
- Add your custom domain
- Update DNS records as instructed
-
Build your project:
npm run build
-
Deploy via Netlify CLI:
npm install -g netlify-cli netlify login netlify deploy --prod
Or drag the
distfolder to netlify.com/drop
-
Install gh-pages:
npm install --save-dev gh-pages
-
Update
package.json:{ "homepage": "https://yourusername.github.io/your-repo-name", "scripts": { "predeploy": "npm run build", "deploy": "gh-pages -d dist" } } -
Update
vite.config.js:export default defineConfig({ base: '/your-repo-name/', // ... rest of config })
-
Deploy:
npm run deploy
portfolio-template/
βββ public/ # Static assets
β βββ batcat.svg # Favicon
β βββ your-portrait.svg # Your profile image
β βββ YourName-Resume.pdf # Your resume
β βββ [project-images].png # Project screenshots
βββ src/
β βββ components/ # React components
β β βββ About.jsx # About section
β β βββ Projects.jsx # Projects showcase
β β βββ Skills.jsx # Skills display
β β βββ Contact.jsx # Contact form
β β βββ Navbar.jsx # Navigation
β β βββ ...
β βββ data/ # β Edit these files!
β β βββ projects.js # Your projects data
β β βββ skills.js # Your skills data
β β βββ README.md # Data customization guide
β βββ constants/ # β Edit this too!
β β βββ config.js # Site configuration
β βββ utils/
β βββ hooks/
β βββ App.jsx # Main app component
β βββ main.jsx # Entry point
β βββ index.css # Global styles
βββ .gitignore
βββ package.json
βββ vite.config.js
βββ tailwind.config.js
βββ README.md # You're here!
Before deploying, make sure you've updated:
- Personal information in
src/constants/config.js - Projects in
src/data/projects.js - Skills in
src/data/skills.js - Resume PDF in
/publicfolder - Resume component references
- Formspree endpoint for contact form
- Profile image/portrait
- Favicon (
/public/batcat.svg) - Meta tags in
index.html - GitHub repository links
- Social media links
- About section content
- Color scheme (if desired)
Solution:
rm -rf node_modules package-lock.json
npm installSolution:
# Windows
netstat -ano | findstr :5173
taskkill /PID [PID_NUMBER] /F
# Mac/Linux
lsof -ti:5173 | xargs killOr change the port in vite.config.js:
export default defineConfig({
server: {
port: 3000
}
})Solution:
- Ensure images are in the
/publicfolder - Use
/prefix:image: "/my-image.png" - Check file extensions match exactly
- Restart dev server after adding images
Solution:
- Verify your Formspree endpoint in
config.js - Check that the form is deployed (Formspree requires a live URL)
- Test the form on your deployed site, not localhost
- React Documentation: react.dev
- Vite Documentation: vitejs.dev
- Tailwind CSS: tailwindcss.com
- React Icons: react-icons.github.io
- Formspree: formspree.io/docs
Found a bug or want to improve the template? Contributions are welcome!
- Fork the repository
- Create your feature branch:
git checkout -b feature/AmazingFeature - Commit your changes:
git commit -m 'Add some AmazingFeature' - Push to the branch:
git push origin feature/AmazingFeature - Open a Pull Request
This project is open source and available under the MIT License.
Having trouble? Here are some options:
- Check the Troubleshooting section above
- Review closed issues on GitHub
- Open a new issue on GitHub
- Reach out to the community
Built with β€οΈ using modern web technologies.
Special thanks to the open-source community for the amazing tools and libraries.
Now that you have your portfolio set up:
- Customize everything with your information
- Add your projects and screenshots
- Test on mobile devices to ensure responsiveness
- Deploy to production using Vercel or Netlify
- Share your portfolio with the world!
- Keep it updated with new projects and skills
Good luck with your portfolio! π¨β¨
Made with passion by developers, for developers.
