Personal portfolio site built with Astro 7 and deployed on Cloudflare Workers.
- Framework: Astro 7 (hybrid rendering, Rust compiler)
- Styling: Vanilla CSS with
@layerand nesting, system fonts, no client-side JavaScript - Hosting: Cloudflare Workers
- Auth: Cloudflare Access (Google OAuth) for private content
- Security: Per-page CSP with script hashes generated by Astro, plus static headers in
public/_headers
Requires Node 24 and npm 11 (see .node-version).
npm install
npm run dev| Command | Description |
|---|---|
npm run dev |
Start dev server |
npm run build |
Production build |
npm run check |
TypeScript type checking |
npm run lint |
ESLint + Prettier check |
npm run lint:fix |
Auto-fix lint issues |
npm run test:unit |
Run Vitest unit tests |
npm run test:watch |
Run Vitest in watch mode |
npm run test:e2e |
Run Playwright E2E tests (needs a build first) |
src/
components/ UI components (Astro)
content/ Markdown content collections
layouts/ Base page layout
lib/ Constants, auth, GitHub API, syntax highlighting
middleware.ts Auth guard for /private/* routes
pages/ Routes (public + private SSR)
styles/ Global CSS and design tokens
public/ Static assets, security headers
See CONTRIBUTING.md for commit conventions and workflow.
Pushes to main trigger automatic builds on Cloudflare Workers. CI runs lint, type check, unit tests, build, and E2E tests via GitHub Actions.