Personal portfolio website for bates-solutions.com, built with React and deployed to AWS.
| Frontend | Backend | Infrastructure |
|---|---|---|
| React 19 | AWS Lambda | S3 + CloudFront |
| TypeScript | SES (Email) | API Gateway |
| Tailwind CSS 4 | Node.js 22 | Serverless Framework |
| Vite 7 | GitHub Actions |
- Interactive terminal component with custom commands
- Contact form with serverless email handling
- Responsive design with accessibility support
- SEO optimized with Open Graph and structured data
- Node.js 20+
- AWS account (for Lambda deployment)
- AWS CLI configured
- Serverless Framework (
npm install -g serverless)
-
Clone the repository
git clone https://github.com/mbates/portfolio.git cd portfolio -
Install dependencies
npm install
-
Set up environment variables
cp .env.example .env
Edit
.envwith your API Gateway URL (or leave empty for local dev without contact form). -
Start the development server
npm start
If you want to use this as a template for your own portfolio:
-
Fork the repository on GitHub
-
Update personal information:
index.html- Update title, meta tags, and structured datasrc/pages/- Update content with your own projects and biopublic/- Replace favicon and images
-
Set up the contact form Lambda:
- Update
serverless/lambda.yml:RECIPIENT_EMAIL- Your email addressSENDER_EMAIL- Your verified SES emailCORS_ORIGIN- Your domain
- Verify your domain/email in AWS SES
- Deploy:
npm run deploy:lambda
- Update
-
Configure CI/CD (GitHub Actions):
Add these secrets/variables in your repo settings:
Type Name Description Secret AWS_SECRET_ACCESS_KEYAWS secret key Secret VITE_API_URLYour API Gateway endpoint Variable AWS_ACCESS_KEYAWS access key ID Variable AWS_ACCOUNT_IDYour AWS account ID Variable AWS_REGIONe.g., us-east-1Variable AWS_BUCKETS3 bucket URL (s3://...) Variable distribution_idCloudFront distribution ID -
Push to
mainto trigger deployment
# Run tests in watch mode
npm test
# Run tests once
npm run test:run
# Run tests with coverage
npm run test:coverageAutomatically deployed via GitHub Actions on push to main.
npm run deploy:lambdaThis project uses GitHub Flow:
- Create a feature branch from
main - Make changes and commit
- Open a pull request to
main - Merge after review and CI passes
portfolio/
├── src/
│ ├── components/ # React components
│ ├── pages/ # Page components
│ ├── styles/ # Global styles
│ └── test/ # Test setup
├── serverless/
│ ├── email.mjs # Lambda email handler
│ └── lambda.yml # Serverless config
└── public/ # Static assets
MIT