A modern, minimal portfolio website showcasing iOS and AI projects, built with React, TypeScript, and Tailwind CSS.
- React 19 - UI framework
- TypeScript - Type safety
- Vite - Build tool and dev server
- Tailwind CSS v4 - Styling
- React Router v6 - Client-side routing with hash-based navigation
- Video.js - Video player for project demos
- Responsive, mobile-first design
- Clean, minimal aesthetic
- Video showcases for iOS and AI projects
- Hash-based routing for SPA compatibility with AWS Lambda
- Optimized production builds with code splitting
- Smooth scroll navigation
- Node.js 18+ and npm
npm installnpm run devThe site will be available at http://localhost:5173
npm run buildThe optimized build will be in the dist/ folder.
npm run previewPortfolio25/
├── src/
│ ├── components/ # Reusable React components
│ │ ├── Header.tsx # Navigation header
│ │ ├── Hero.tsx # Hero section
│ │ ├── ProjectCard.tsx # Project display card
│ │ └── VideoPlayer.tsx # Video.js wrapper
│ ├── pages/
│ │ └── Home.tsx # Main home page
│ ├── App.tsx # Router setup
│ ├── main.tsx # Entry point
│ └── index.css # Global styles
├── public/ # Static assets
└── dist/ # Production build output
The simplest deployment option with automatic CI/CD from GitHub. Stays free for portfolios (1000 build mins/month, 15GB served/month).
-
Push your code to GitHub
-
Go to AWS Amplify Console
-
Click "New app" > "Host web app"
-
Connect your GitHub repository and select the branch (e.g.,
main) -
Amplify will auto-detect the build settings from amplify.yml
-
Review and click "Save and deploy"
-
Connect custom domain (after first deployment):
- Go to App Settings > Domain Management
- Click "Add domain"
- Enter
elliotboschwitz.com - If domain is in Route 53, Amplify will auto-configure DNS
- If not, follow the DNS configuration instructions
- SSL certificate is automatically provisioned
Every push to your main branch will automatically trigger a new deployment.
If you prefer CLI deployment:
# Install Amplify CLI
npm install -g @aws-amplify/cli
# Configure AWS credentials
amplify configure
# Initialize and publish
amplify init
amplify add hosting
amplify publishFor more control over the infrastructure:
- Build the project:
npm run build- Create an S3 bucket:
aws s3 mb s3://elliotboschwitz-portfolio- Configure bucket for static website hosting:
aws s3 website s3://elliotboschwitz-portfolio \
--index-document index.html \
--error-document index.html- Upload build files:
aws s3 sync dist/ s3://elliotboschwitz-portfolio --delete-
Create CloudFront distribution:
- Origin: Your S3 bucket
- Default root object:
index.html - Error pages: Configure 404 to serve
index.htmlfor SPA routing
-
Configure custom domain:
- Add CNAME record in Route 53 or your DNS provider
- Add SSL certificate via ACM
Videos are hosted on AWS S3 + CloudFront for optimal performance:
- Create a separate S3 bucket for videos:
aws s3 mb s3://elliotboschwitz-videos- Upload your project videos:
aws s3 cp my-project-video.mp4 s3://elliotboschwitz-videos/projects/-
Create a CloudFront distribution for the video bucket
-
Update video URLs in your project cards to use the CloudFront URL:
<ProjectCard
title="My iOS App"
description="Description..."
videoUrl="https://d1234abcd.cloudfront.net/projects/my-project-video.mp4"
links={[...]}
/>Edit src/pages/Home.tsx and add your projects:
<ProjectCard
title="Your Project Name"
description="Brief description"
videoUrl="https://your-cdn.com/video.mp4"
links={[
{ label: "GitHub", url: "https://github.com/..." },
{ label: "App Store", url: "https://apps.apple.com/..." }
]}
/>The site uses Tailwind CSS v4. Customize colors, fonts, and other design tokens in tailwind.config.js.
Update the contact section in src/pages/Home.tsx with your actual links:
- GitHub profile
- LinkedIn profile
- Email address
MIT