A modern, responsive personal portfolio website built with React, TypeScript, and Vite. Deployed automatically to Cloudflare Pages via GitHub Actions.
- React SPA - Single Page Application built with React 19
- TypeScript - Type-safe code for better development experience
- Vite - Lightning fast development and optimized production builds
- Bootstrap 5 - Responsive design with modern UI components
- EmailJS Integration - Contact form with email notifications
- Dark/Light Theme - Toggle between themes with localStorage persistence
- Cloudflare Pages - Automatic deployment via GitHub Actions
- ESLint - Code quality and consistency checks
- Frontend: React 19, TypeScript, Vite
- Styling: Bootstrap 5, Custom CSS
- Email: EmailJS
- Deployment: Cloudflare Pages
- CI/CD: GitHub Actions
- Clone the repository:
git clone https://github.com/shotah/personal_site.git
cd personal_site- Install dependencies:
npm install- Create a
.envfile based on.env.example:
cp .env.example .env- Configure your EmailJS credentials in
.env:- Sign up at EmailJS
- Create a service and template
- Add your credentials to
.env
Start the development server:
npm run devThe site will be available at http://localhost:5173
Build for production:
npm run buildPreview the production build:
npm run previewRun ESLint:
npm run lintFix linting errors:
npm run fixThis project automatically deploys to Cloudflare Pages when you push to the main branch.
Add the following secrets to your GitHub repository:
-
EmailJS Credentials:
VITE_EMAILJS_SERVICE_IDVITE_EMAILJS_TEMPLATE_IDVITE_EMAILJS_PUBLIC_KEY
-
Cloudflare Credentials:
CLOUDFLARE_API_TOKENCLOUDFLARE_ACCOUNT_ID
You can also deploy manually using the Cloudflare Pages dashboard by uploading the dist folder.
This project is licensed under the MIT License - see the LICENSE file for details.
Christopher Blodgett
- LinkedIn: christopherblodgett
- GitHub: @shotah
- Website: chris.bldhosting.com
- Bootstrap for the UI components
- EmailJS for the contact form functionality
- Cloudflare Pages for hosting
- React Icons for the icon library