Personal Portfolio Website
This skill provides context and instructions for working on Cameron Vandermeersch's personal portfolio site.
When to use
Use this skill when making changes to the portfolio website — adding sections, modifying components, updating content, or fixing bugs.
Tech Stack
- Framework: React 19 with Vite 6
- UI: React-Bootstrap 2, Animate.css, react-on-screen
- Routing: react-router-dom 6 + react-router-hash-link (single page with hash navigation)
- Forms: EmailJS (
@emailjs/browser) for contact form - SEO: react-helmet-async
- Styling: Vanilla CSS (single
App.cssfile, ~1400 lines) - Fonts: Custom "Centra" font (CentraNo2-Bold, Medium, Book)
- Deploy: Vercel (CI via GitHub Actions)
- Analytics: Google Tag Manager (GTM-54JD5G65)
- Env vars:
VITE_*prefix (accessed viaimport.meta.env.VITE_*)
Installed AI Agent Skills
This repository leverages skills.sh extensions located in .agents/skills/. Any AI agent working in this repo has automatic access to these strict guidelines and rulesets.
When contributing to this project, adhere strictly to these principles:
- Core React & Vite:
vercel-react-best-practices,vercel-composition-patterns - UI & Design:
web-design-guidelines - Performance & Quality:
web-quality-audit,audit-website,core-web-vitals,accessibility,performance,seo - Agent Discovery:
find-skills
Project Structure
src/
├── App.jsx # Main app with HelmetProvider + all sections
├── index.jsx # React 19 createRoot entry point
├── components/
│ ├── NavBar.jsx # Fixed navbar with scroll detection, social links, CV download
│ ├── Banner.jsx # Hero section with typing animation effect
│ ├── Skills.jsx # Multi-carousel skill icons (45 tech logos)
│ ├── Projects.jsx # Tabbed project showcase (3 tabs)
│ ├── ProjectCard.jsx # Individual project card component
│ ├── Contact.jsx # Contact form with EmailJS integration
│ └── Footer.jsx # Footer with social links + copyright
├── assets/
│ ├── fonts/ # CentraNo2 font files (.ttf)
│ ├── images/ # Banner, contact, and social icon assets
│ │ └── skills/ # 45 technology logo PNGs
│ └── Cameron_Vandermeersch_Resume.pdf
└── styles/
├── App.css # All component styles (monolithic)
└── index.css # Base resets and root sizing
Instructions
- Environment setup: Copy
.env.exampleto.envand fill in EmailJS credentials - Development:
npm run devruns on http://localhost:3000 with HMR - Styling: All CSS is in
src/styles/App.css— search for section comment headers (e.g.,/*** Banner Css ***/) - Components: Each section is a standalone component in
src/components/ - Images: Skill icons go in
src/assets/images/skills/, project images insrc/assets/images/ - Build:
npm run buildoutputs todist/,npm run previewto preview locally - SEO: Meta tags managed via
react-helmet-asyncinApp.jsx; sitemap atpublic/sitemap.xml
Known Limitations
- Monolithic
App.cssshould eventually be split into component-level CSS modules react-on-screenis unmaintained — consider IntersectionObserver API