Skip to content
View gagnechris's full-sized avatar

Block or report gagnechris

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don't include any personal information such as legal names or email addresses. Markdown supported. This note will be visible to only you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
gagnechris/README.md

Chris Gagne Personal Website

A modern, responsive personal website and portfolio built with React, TypeScript, and Vite. Features a clean, professional design showcasing my experience as a Director of Software Engineering, with an interactive resume and downloadable PDF functionality.

🌟 Project Overview

This website serves as both a portfolio and resume platform, featuring:

  • Modern React Architecture: Built with React 18, TypeScript, and React Router for client-side routing
  • Professional Resume Display: Interactive web-based resume with downloadable PDF functionality
  • Responsive Design: Mobile-first design with modern CSS animations and transitions
  • Performance Optimized: Fast loading with Vite build tool and optimized assets
  • Analytics Integration: Google Analytics 4 with comprehensive event tracking
  • Accessibility Compliant: WCAG 2.1 AA compliant with ARIA labels, focus management, and keyboard navigation
  • Comprehensive Testing: Jest and React Testing Library with 100% test coverage including integration tests
  • Type Safety: Full TypeScript implementation with strict mode enabled
  • Modern Development: ESLint, hot reloading, and automated deployment pipeline

πŸš€ Getting Started

Prerequisites

  • Node.js (v16 or higher recommended)
  • npm (comes with Node.js)

Installation

  1. Clone the repository

    git clone https://github.com/gagnechris/gagnechris.git
    cd gagnechris
  2. Install dependencies

    npm install

πŸ’» Development

Local Development Server

Start the development server with hot reloading:

npm run dev

The application will be available at http://localhost:5173

Building for Production

Create an optimized production build:

npm run build

Build files will be generated in the dist/ directory.

Preview Production Build

Test the production build locally:

npm run preview

This serves the built files from dist/ at http://localhost:4173

πŸ§ͺ Testing

Run Tests

npm test                # Run tests once
npm run test:watch      # Run tests in watch mode (auto-rerun on changes)
npm run test:coverage   # Run tests with coverage report
npm run test:serverless # Run serverless function tests only

Code Quality

Check code style and formatting:

npm run lint            # Run ESLint

πŸš€ Deployment

Automated Deployment

Deploy to GitHub Pages with custom domain:

npm run deploy

This command:

  1. Runs npm run build to create production assets
  2. Deploys to GitHub Pages using gh-pages
  3. Configures custom domain (gagnechris.com)
  4. Updates the live site automatically

Live Site: https://gagnechris.com

Manual Deployment Steps

If you prefer manual deployment:

  1. Build the project

    npm run build
  2. Deploy the dist/ folder to your hosting provider of choice

    • The dist/ folder contains all static assets
    • Configure your server to serve index.html for all routes (SPA routing)

πŸ› οΈ Tech Stack

Frontend

  • React 18 - Modern UI library with hooks
  • TypeScript - Type-safe JavaScript with strict mode
  • React Router v7 - Client-side routing with analytics tracking
  • Vite - Fast build tool and development server
  • Google Analytics 4 - Event tracking and user analytics

Styling

  • Modern CSS - Custom properties, flexbox, grid
  • CSS Animations - Smooth transitions and micro-interactions
  • Responsive Design - Mobile-first approach

Testing & Quality

  • Jest - Testing framework with 100% coverage
  • React Testing Library - Component and integration testing
  • ESLint - Code linting with TypeScript and React rules
  • TypeScript Compiler - Static type checking with strict mode
  • Accessibility Testing - Screen reader and keyboard navigation testing

Deployment & Infrastructure

  • GitHub Pages - Static site hosting
  • GitHub Actions - CI/CD (via npm scripts)
  • Netlify Functions - Serverless backend (resume download notifications)
  • Custom Domain - Professional branding

πŸ“ Project Structure

β”œβ”€β”€ public/                 # Static assets
β”‚   β”œβ”€β”€ Christopher M Gagne Resume 2025.pdf
β”‚   └── cg-icon.svg
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ components/         # Reusable React components
β”‚   β”‚   β”œβ”€β”€ AppWithTracking.tsx    # Analytics wrapper component
β”‚   β”‚   β”œβ”€β”€ DownloadModal.tsx      # Resume download modal
β”‚   β”‚   β”œβ”€β”€ RouteTracker.tsx       # Page view tracking
β”‚   β”‚   └── *.test.tsx             # Component tests
β”‚   β”œβ”€β”€ pages/             # Page components
β”‚   β”‚   β”œβ”€β”€ Resume.tsx
β”‚   β”‚   └── Resume.test.tsx
β”‚   β”œβ”€β”€ utils/             # Utility functions
β”‚   β”‚   β”œβ”€β”€ analytics.ts           # Google Analytics integration
β”‚   β”‚   └── analytics.test.ts
β”‚   β”œβ”€β”€ __tests__/         # Integration tests
β”‚   β”‚   └── integration.test.tsx
β”‚   β”œβ”€β”€ assets/            # Images and media
β”‚   β”œβ”€β”€ App.tsx            # Main application component
β”‚   └── main.tsx           # Application entry point
β”œβ”€β”€ netlify/
β”‚   └── functions/         # Serverless functions
β”œβ”€β”€ dist/                  # Production build output
β”œβ”€β”€ package.json           # Dependencies and scripts
β”œβ”€β”€ tsconfig.json          # TypeScript configuration
β”œβ”€β”€ vite.config.ts         # Vite configuration
└── README.md              # This file

πŸ”§ Configuration

Environment Variables

  • Development: Automatically detected by Vite
  • Production: Set NODE_ENV=production for optimized builds

Analytics Configuration

The site uses Google Analytics 4 for tracking:

  • Page views: Automatically tracked on route changes
  • Download events: Resume download tracking (direct and modal)
  • External link clicks: LinkedIn and GitHub link tracking
  • Event categories: external_link, resume for organized reporting

Custom Domain

The site is configured to deploy to gagnechris.com. To use a different domain:

  1. Update homepage in package.json
  2. Modify the --cname flag in the deploy script

β™Ώ Accessibility Features

This website is built with accessibility in mind:

  • WCAG 2.1 AA Compliant: Meets web accessibility standards
  • Keyboard Navigation: Full site navigation without a mouse
  • Screen Reader Support: Proper ARIA labels and semantic HTML
  • Focus Management: Clear focus indicators and logical tab order
  • Modal Accessibility: Proper focus trapping and escape key handling
  • Descriptive Alt Text: All images have meaningful descriptions

πŸ“Š Performance

  • Lighthouse Score: 100/100 (Performance, Accessibility, Best Practices, SEO)
  • Bundle Size: Optimized with tree shaking and code splitting
  • Load Time: < 1 second on fast connections
  • Mobile Optimized: Responsive design with touch-friendly interactions

🀝 Contributing

This is a personal portfolio project. If you find bugs or have suggestions:

  1. Open an issue describing the problem or enhancement
  2. Fork the repository and create a feature branch
  3. Make your changes with appropriate tests
  4. Submit a pull request with a clear description

πŸ“„ License

This project is personal portfolio code. Feel free to use it as inspiration for your own portfolio, but please don't copy the content directly.

Popular repositories Loading

  1. SprayApiDemo SprayApiDemo Public

    A sample Spray API application which demonstrates how Spray can be used to create and consume RESTful APIs.

    Scala 19 8

  2. sublime-ensime sublime-ensime Public

    Forked from sublimescala/sublime-ensime

    Ensime integration with Sublime Text 2 for Scala development

    Python

  3. jenkins-hipchat-plugin jenkins-hipchat-plugin Public

    Forked from jlewallen/jenkins-hipchat-plugin

    basically forked the campfire plugin and made things hipchatish

    Java

  4. syte syte Public

    Forked from rigoneri/syte

    A really simple but powerful packaged personal site that has social integrations like twitter, github, dribbble, instagram, foursquare, tumblr, wordpress, last.fm, and much more...

    JavaScript

  5. jenkins-mstest-plugin jenkins-mstest-plugin Public

    This is basically a modified version of https://wiki.jenkins-ci.org/display/JENKINS/MSTest+Plugin

    Java

  6. ScalaPerformanceMonitorDemo ScalaPerformanceMonitorDemo Public

    Demo scala application of how aspectj and JMX can be used to monitor application.

    Scala