A modern, responsive personal portfolio website built entirely with vanilla HTML, CSS, and JavaScript — no frameworks, no build tools, no dependencies beyond a few CDN-loaded libraries. Projects are loaded dynamically from the GitHub API, so keeping the portfolio up to date is as simple as tagging a repo with a topic on GitHub.
- Dynamic project cards — Fetches repos tagged with the
portfoliotopic from GitHub and renders them automatically; rich overrides (custom title, description, image) configurable inprojects.js - Tech-stack filter — Filter buttons generated at runtime from the actual tags on each repo, letting visitors explore projects by language or tool
- Animated skill bars — Progress bars animate into view when scrolled into the viewport
- Responsive timeline — Zig-zag timeline layout for experience and education entries, collapses to single-column on mobile
- Contact form — Powered by Formspree — no backend needed
- Mobile navigation — Hamburger menu for small screens; smooth-scroll between sections
- Zero JS frameworks — Pure ES6 with no bundler or build step required
| Layer | Technology |
|---|---|
| Markup | HTML5 |
| Styling | CSS3 (custom properties, flexbox, media queries) |
| Logic | Vanilla JavaScript (ES6+) |
| Icons | Font Awesome 5 |
| Fonts | Google Fonts — Roboto |
| Projects API | GitHub REST API v3 |
| Contact form | Formspree |
portfolio-website/
├── index.html # Single-page layout (all sections)
├── css/
│ └── style.css # All styles — variables, layout, components, responsive
├── js/
│ ├── projects.js # GitHub API fetch, project overrides, render logic
│ └── script.js # Nav, skill animation, contact form handler
└── image/
├── bg-img.jpg # Header background
├── favicon.ico
└── ... # Project preview images
Any GitHub repo tagged with the portfolio topic will appear automatically on the Projects section. Additional tags on the repo (e.g. python, react, machine-learning) become the tech-stack chips shown on the card and also populate the filter buttons.
To add richer metadata (custom title, description, or preview image) for a specific repo, add an entry to the projectOverrides object in js/projects.js:
const projectOverrides = {
'my-repo-name': {
title: 'Human-readable title',
description: 'A richer description than what GitHub shows.',
image: 'image/my-preview.png', // optional local or remote image
},
};git clone https://github.com/yourusername/Portfolio-Website.git
cd Portfolio-WebsiteIn js/projects.js, update line 1:
const GITHUB_USERNAME = 'yourusername';- Create a free account at formspree.io
- Create a new form and copy the form ID
- In js/script.js, update the endpoint:
const FORMSPREE_ENDPOINT = 'https://formspree.io/f/YOUR_FORM_ID';Replace the placeholder text with your own:
- Name, about paragraph
- LinkedIn / GitHub / email links in the header and contact section
- Experience and education entries (company names, dates, descriptions)
- Profile photo (
image/my_image.jpg)
No build step needed — just open index.html in a browser, or serve it with any static file server:
npx serve .
# or
python3 -m http.server 8080The site is entirely static — deploy to GitHub Pages, Netlify, Vercel, or any static host.
GitHub Pages (quickest):
- Push the repo to GitHub
- Go to Settings → Pages → Source → Deploy from branch →
main/root - Your site will be live at
https://yourusername.github.io/Portfolio-Website
Add screenshots of your portfolio here once you have your personal details filled in.
This project is open source and available under the MIT License.