Welcome to my professional portfolio! Visit jckail.com to see it in action.
This portfolio is a modern, full-stack web application showcasing my professional experience through an interactive and engaging interface — React + TypeScript on the frontend, FastAPI on the backend, and an AI assistant powered by Anthropic's Claude Haiku 4.5.
- 📝 Dynamic professional timeline with detailed experiences
- 🛠️ Comprehensive skills showcase with proficiency levels
- 📊 Project portfolio with live demos and descriptions
- 📄 Downloadable PDF resume
- 🤖 AI chat assistant (Claude Haiku 4.5, streamed over WebSocket) with conversation memory, page-aware context, and site-navigation tools (open sections/modals, download resume)
- 🔗 Deep-linkable sections, modals, projects, and chat (
?ai_chat=open,?project=,?skill=,?company=) - ⌨️ Keyboard shortcuts:
?opens chat;gthena/e/p/s/rjumps sections;Ctrl/Cmd+Kcommand palette - 🎨 Interactive doodle canvas (footer easter egg) + party mode (Konami /
?party=1) - 🍪 Cookie consent with GA consent-mode defaults
- 📱 Responsive design for all devices
- ♿ Fully keyboard-operable: focus-trapped dialogs, Escape-to-close
- 🌓 Light/dark mode — and a hidden party mode 🎉
- React 18 + TypeScript with Vite 8 for fast dev and optimized builds
- React Router for navigation
- Zustand for state management
- MUI + CSS custom properties for UI and theming
- Vitest 4 for unit tests; Playwright for containerized E2E smoke tests
- FastAPI on Python 3.12 with Pydantic v2
- Anthropic Claude Haiku 4.5 for the streaming AI chat assistant
- Supabase for auth, telemetry, and log persistence
- SendGrid for contact email
- Docker multi-stage builds (Node 22 → Python 3.12 slim) with
hash-pinned Python deps (
requirements.lock.txt) - Google Cloud Run behind Artifact Registry
- Terraform for infrastructure as code, including keyless GitHub → GCP
auth via Workload Identity Federation (see
infra/) - GitHub Actions: CI (lint, coverage-gated tests, Trivy image scan,
Docker + Terraform checks) plus verify-before-promote deploys to Cloud Run
on
main(see DEPLOYMENT.md) - Dependabot for monthly grouped dependency updates
portfolio/
├── frontend/ # React application (see frontend/README.md)
│ └── src/
│ ├── app/ # Feature components & providers
│ ├── shared/ # Stores, hooks, typed API client, shared components
│ └── styles/ # Global CSS
│
├── backend/ # FastAPI server (see backend/README.md)
│ ├── app/
│ │ ├── api/ # API routes (REST + chat WebSocket)
│ │ ├── config.py # Centralized typed settings (all env access)
│ │ ├── models/ # Pydantic models + data loaders
│ │ ├── data/ # Portfolio content (JSON)
│ │ └── utils/ # Logging, Supabase client
│ ├── assets/ # System prompt, resume
│ └── tests/ # Pytest suite (runs offline, no credentials needed)
│
├── e2e/ # Playwright smoke tests against the built image
├── docs/adr/ # Architecture decision records
├── infra/ # Terraform for GCP (Cloud Run, secrets, registry, WIF)
├── helpers/ # Deploy script, Dockerfiles, local dev tooling
└── .github/workflows/ # CI + automatic Cloud Run deploys
- Node.js 22+ and npm (matches the production frontend build image)
- Python 3.12+
- A
.envfile at the repo root (see backend/README.md for the full variable list)
git clone https://github.com/jckail/portfolio.git
cd portfolio
pip install -r requirements-dev.txt # prod deps + pytest, ruff
(cd frontend && npm install)
./helpers/local_test.shThen open:
- Frontend (hot reload): http://localhost:5173
- Backend API + built frontend: http://localhost:8080
- API documentation: http://localhost:8080/docs
Merges to main deploy automatically to Cloud Run via GitHub Actions once
the one-time setup in DEPLOYMENT.md is complete. Manual
fallback:
./helpers/deploy.sh # build, push, deploy to Cloud Run, health-checkSee helpers/README.md for the deploy script and infra/README.md for Terraform-managed infrastructure.
flowchart LR
Visitor -->|HTTPS| CloudRun[Cloud Run]
CloudRun --> FastAPI
FastAPI -->|static| React[React SPA]
FastAPI -->|REST| Content[Portfolio JSON]
FastAPI -->|WebSocket + tools| Claude[Claude Haiku 4.5]
FastAPI --> Supabase[(Supabase)]
FastAPI --> SendGrid[SendGrid]
GH[GitHub Actions] -->|WIF| AR[Artifact Registry]
AR --> CloudRun
TF[Terraform] --> CloudRun
Visitor traffic hits Cloud Run, which serves the Vite-built SPA and the FastAPI API (including the streaming chat WebSocket). Claude can request validated UI actions that the SPA executes. Secrets live in Secret Manager; deploys are keyless via Workload Identity Federation and only promote a revision to 100% traffic after a health check against the new revision.
- Frontend documentation
- Backend documentation
- Deployment checklist (secrets & CI/CD setup)
- Deployment tooling
- Infrastructure (Terraform)
- Improvement roadmap
- API reference:
/docson a running backend
- Follow the existing architecture patterns
- Run the checks locally:
- Frontend:
npm run lint && npm run type-check && npm test - Backend:
python -m ruff check backend && python -m pytest backend/tests
- Frontend:
- Write tests for new features
- Update documentation
- Submit pull requests for review
