Personal portfolio and terminal-style website built with Vite, React, and TypeScript.
- Animated, multi-page portfolio (Home, About, Work, Contact)
- Work detail pages powered by slug-based project data
- Terminal feature with a server-side AI agent proxy using Gemini first and Mistral as fallback
- Structured long-form content under the content directory
- Unit and E2E test coverage
- Cloudflare Workers deployment support
- Vite
- React + TypeScript
- React Router
- Tailwind CSS
- Framer Motion
- Vitest + Testing Library
- Playwright
- Cloudflare Workers (Wrangler)
- Install dependencies:
npm install- Run the dev server:
npm run devThe site runs on port 8080 by default.
npm run dev- local dev servernpm run build- production buildnpm run preview- preview production buildnpm run lint- ESLint checksnpm test- unit tests (Vitest)npm run test:watch- unit tests in watch modenpx playwright test- E2E testsnpm run deploy- deploy to Cloudflare Workers
src/pages- route-level pagessrc/components- reusable app componentssrc/components/ui- generated UI primitivessrc/lib- shared constants, helpers, and project metadatasrc/hooks- custom hookscontent- markdown/mdx content for terminal and agent contexte2e- Playwright tests
- Unit tests are colocated in
srcwith.test.ts/.spec.tsnaming. - E2E tests live in
e2e.
Cloudflare Worker configuration lives in wrangler.toml.
npm run deployFor production secrets, configure GEMINI_API_KEY and optionally MISTRAL_API_KEY with Wrangler secrets.
If you enable the booking gate, also configure these secrets for Google sign-in:
GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETBOOKING_SESSION_SECRET
Optionally set SITE_URL when you want the OAuth callback to resolve against a fixed public origin.