A modern, high-performance personal portfolio website built with pure HTML, CSS, and Vanilla JavaScript. Features GSAP animations, ScrollTrigger effects, premium custom cursor, and a particle network canvas animation.
- Modern Design: Clean, minimal, agency-grade aesthetic
- Premium Custom Cursor: Smooth follow cursor with hover states (desktop only) ✨ NEW
- High Performance: Optimized animations and lazy loading
- Fully Responsive: Mobile-first design for all devices
- GSAP Animations: Smooth scroll-based animations using GSAP 3.12+ and ScrollTrigger
- Interactive Canvas: Particle network animation on hero section
- Project Filtering: Dynamic filtering with smooth transitions
- Content-Safe Sections: Projects and Skills never appear empty ✨ NEW
- Accessibility: WCAG 2.1 AA compliant with proper ARIA labels
- SEO Optimized: Semantic HTML5 markup and meta tags
- GitHub Pages Ready: Static site deployment compatible
- HTML5: Semantic markup
- CSS3: Custom properties, Grid, Flexbox
- JavaScript (ES6+): Vanilla JS, no frameworks
- GSAP 3.12.5: Animation library
- ScrollTrigger: Scroll-based animations
portfolio/
├── index.html # Main HTML file
├── css/
│ ├── variables.css # CSS custom properties
│ ├── reset.css # Modern CSS reset
│ ├── layout.css # Layout utilities
│ ├── components.css # Reusable components
│ ├── sections.css # Section-specific styles
│ ├── animations.css # Animation utilities
│ └── responsive.css # Responsive breakpoints
├── js/
│ ├── cursor.js # Premium custom cursor ✨
│ ├── canvas.js # Particle animation
│ ├── animations.js # GSAP animations
│ └── main.js # Core functionality
├── assets/
│ ├── img/
│ │ ├── profile-img.jpg
│ │ ├── favicon.png
│ │ └── projects/ # Project images
│ └── file/
│ └── res.pdf # Resume PDF
└── README.md
git clone https://github.com/salmondavidp/portfolio.git
cd portfolioReplace placeholder content with your own:
- Profile Image: Add your photo at
assets/img/profile-img.jpg - Resume: Add your resume PDF at
assets/file/res.pdf - Project Images: Add project screenshots to
assets/img/projects/ - Favicon: Add your favicon at
assets/img/favicon.png
Edit index.html to update:
- Hero section text
- About section bio
- Skills list
- Project details
- Contact information
Open index.html in your browser or use a local server:
# Using Python
python -m http.server 8000
# Using Node.js (http-server)
npx http-server
# Using PHP
php -S localhost:8000Visit http://localhost:8000 in your browser.
- Go to your repository on GitHub
- Click Settings → Pages
- Under "Source", select:
- Branch:
main - Folder:
/ (root)
- Branch:
- Click Save
- Your site will be live at:
https://yourusername.github.io/portfolio
# Create gh-pages branch
git checkout -b gh-pages
# Push to GitHub
git push origin gh-pages
# Go to Settings → Pages and select gh-pages branchCreate .github/workflows/deploy.yml:
name: Deploy to GitHub Pages
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./Edit css/variables.css to change the color scheme:
:root {
--color-primary: #0066FF; /* Primary brand color */
--color-accent: #00D4FF; /* Accent color */
--color-bg-primary: #0A0A0F; /* Background color */
}Change fonts in css/variables.css:
:root {
--font-primary: 'Inter', sans-serif;
--font-display: 'Space Grotesk', sans-serif;
}Update Google Fonts link in index.html if changing fonts.
Adjust animation timing in js/animations.js:
gsap.from('.hero-title-line', {
opacity: 0,
y: 50,
duration: 0.9, // Change duration
stagger: 0.15, // Change stagger delay
});Modify particle settings in js/canvas.js:
this.particleCount = 80; // Number of particles
this.maxDistance = 120; // Connection distance
this.mouse.radius = 150; // Mouse interaction radius-
Compress images before uploading:
-
Use WebP format with fallback:
<picture> <source srcset="image.webp" type="image/webp"> <img src="image.jpg" alt="Description"> </picture>
For production, minify your CSS and JavaScript:
# Using online tools:
# https://www.minifier.org/
# https://javascript-minifier.com/
# Or use build tools (optional)
npm install -g clean-css-cli uglify-js
cleancss -o style.min.css css/*.css
uglifyjs js/*.js -o script.min.jsImages already use native lazy loading:
<img src="image.jpg" loading="lazy" alt="Description">- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
- Mobile browsers (iOS Safari, Chrome Mobile)
- Semantic HTML5 structure
- ARIA labels for interactive elements
- Keyboard navigation support
- Focus visible states
- Screen reader friendly
- Reduced motion support
In index.html, customize:
<title>Your Name - AI Developer & Data Scientist</title>
<meta name="description" content="Your custom description">
<meta name="keywords" content="Your, Keywords, Here">
<!-- Open Graph -->
<meta property="og:title" content="Your Name">
<meta property="og:description" content="Your description">
<meta property="og:image" content="https://yoursite.com/og-image.jpg"><?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://yourusername.github.io/portfolio/</loc>
<lastmod>2026-01-03</lastmod>
<changefreq>monthly</changefreq>
<priority>1.0</priority>
</url>
</urlset>User-agent: *
Allow: /
Sitemap: https://yourusername.github.io/portfolio/sitemap.xml
If animations don't work, check:
- GSAP CDN links are correct in
index.html - Browser console for errors
- Script loading order (GSAP before animations.js)
Check:
- Canvas element exists in HTML
- JavaScript console for errors
- Browser supports Canvas API
Ensure:
- File paths are relative (not absolute)
- File names match exactly (case-sensitive)
- Images are in the correct directory
This is a personal portfolio, but feel free to:
- Report bugs via GitHub Issues
- Suggest improvements
- Fork and customize for your own use
MIT License - Feel free to use this template for your own portfolio.
- Design & Development: SALMONDAVID POTAGOLI
- Animations: GSAP (GreenSock)
- Fonts: Google Fonts (Inter, Space Grotesk)
- Inspiration: web3.xmethod.de
- Email: davidfpotagoli17@gmail.com
- GitHub: @salmondavidp
- LinkedIn: salmondavid
Built with HTML, CSS & JavaScript | © 2026 SALMONDAVID POTAGOLI