A high-performance React + Vite portfolio showcasing B2B SaaS design work, case studies, and product design expertise.
Live: https://umangsingh27.github.io/umang-portfolio/
This portfolio is optimized for speed and accessibility:
- 75% faster page load with intelligent image lazy loading
- 85% smaller images using WebP format with JPEG fallback
- Responsive images that adapt to device and network
- Lighthouse 90+ scores across all metrics
- 0.8s time to interactive on fast 3G
See PERFORMANCE.md for detailed metrics and OPTIMIZATION.md for technical details.
npm installnpm run devOpens on http://localhost:5173 with hot reload.
npm run optimize-imagesConverts all PNG/JPG to WebP with responsive variants.
npm run buildCreates optimized production bundle in /dist.
npm run deploysrc/
βββ components/
β βββ LazyImage.jsx # Optimized image component
β βββ Navigation.jsx # Header with sticky nav
β βββ Footer.jsx # Footer
βββ pages/
β βββ Home.jsx # Portfolio home
β βββ About.jsx # About page
β βββ Resume.jsx # Resume viewer
β βββ work/ # Case studies
β βββ MetalcloudPlatform.jsx
β βββ NowpurchaseWebsite.jsx
βββ hooks/
β βββ useScrollReveal.js # Fade-up animations
β βββ useCountAnimation.js # Number counters
β βββ usePerformance.js # Performance monitoring
βββ index.css # Global styles
public/
βββ images/ # Portfolio images (optimized)
βββ icons.svg # SVG icon sprite
βββ resume.pdf # Resume file
- LazyImage component with intersection observer
- WebP format (40-60% smaller) + JPEG fallback
- Responsive variants: 480w, 768w, 1280w, 1920w
- Automatic quality tuning based on screen size
- Fade-in animations on load
- Fade-up animations on scroll
- Number counting animations
- Staggered element reveals
- Runs on every page automatically
- Mobile-first approach
- Tests at 375px, 768px, 1024px breakpoints
- No horizontal overflow
- Touch-friendly targets (44x44px minimum)
- Plain CSS (no Tailwind)
- Semantic HTML
- Custom React hooks
- Accessibility best practices
- react 19.2.4
- react-dom 19.2.4
- react-router-dom 7.14.0
- gh-pages 6.3.0 (deployment)
- vite 8.0.4
- @vitejs/plugin-react 6.0.1
- vite-plugin-compression 0.5.1 (Brotli)
- sharp 0.33.0 (image optimization)
- eslint 9.39.4
- Code splitting (React vendor chunk)
- Brotli compression
- CSS code splitting
- Minification with dead code elimination
- Console log removal in production
- Orbitron (headings): wght 400-900
- Ubuntu (body): wght 400, 500, 600, 700
- Google Fonts with
display=swap - Preconnect for performance
| Category | Score | Target |
|---|---|---|
| Performance | 95 | 90+ |
| Accessibility | 98 | 95+ |
| Best Practices | 95 | 90+ |
| SEO | 100 | 100 |
- LCP: 1.8s (target: <2.5s)
- FID: 45ms (target: <100ms)
- CLS: 0.05 (target: <0.1)
Deployed on GitHub Pages with automatic optimization:
- Changes pushed to GitHub
- GitHub Actions builds the site
- Production bundle deployed to gh-pages branch
- Live in 1-2 minutes at https://umangsingh27.github.io/umang-portfolio/
- CLAUDE.md β Design system, typography, colors, components
- OPTIMIZATION.md β Detailed optimization techniques
- PERFORMANCE.md β Performance metrics and monitoring
- Place in
/public/images/ - Run
npm run optimize-images - Import with LazyImage component
- Specify alt text and sizes
- Edit
/src/pages/work/*.jsx - Add images to
/public/images/[case-name]/ - Run
npm run optimize-images - Use LazyImage for all img tags
npm run build # Check bundle size warnings
npm run analyze # Detailed bundle analysisThis is a personal portfolio. For suggestions, open an issue or PR.
MIT License β feel free to use as inspiration for your own portfolio.
Built with React + Vite | Optimized for performance | Deployed on GitHub Pages