# ResumeSite — Connor Babbington portfolio

Bilingual (English / Norwegian Bokmål) portfolio website. Static-first Astro site with a
small self-hosted .NET contact relay, built to the specifications in [`docs/`](docs/).

- **Design system & UX** (Phase 1): [`docs/design/`](docs/design/README.md)
- **Architecture & technical spec** (Phase 2): [`docs/spec/`](docs/spec/README.md)
- **Build status**: [`PROJECT_STATUS.md`](PROJECT_STATUS.md) · **Work list**: [`TODO.md`](TODO.md)

## Stack

Astro 5 (static output) · TypeScript (strict) · Tailwind CSS 4 over CSS custom-property
tokens · CSS-first motion (no animation library) · built-in i18n + typed dictionaries +
content collections · zero client-state libraries · .NET 9 minimal-API contact relay ·
pnpm / Vitest / Playwright · Docker + nginx, self-hosted.

## Quick start (local, without Docker)

```bash
cd site
pnpm install
pnpm dev            # http://localhost:4321
```

## Quick start (Docker)

```bash
# Development (HMR)
docker compose -f deploy/docker-compose.dev.yml up

# Production build preview
docker compose -f deploy/docker-compose.yml up --build
```

See [`docs/spec/DOCKER_SPEC.md`](docs/spec/DOCKER_SPEC.md) and
[`docs/spec/DEPLOYMENT_SPEC.md`](docs/spec/DEPLOYMENT_SPEC.md) for the full picture.

## Repository layout

```
site/     Astro project (pages, components, content, i18n, styles, scripts)
relay/    .NET 9 minimal-API contact relay
deploy/   compose files, nginx config, env templates
tests/    Playwright end-to-end tests
docs/     design (Phase 1) + spec (Phase 2)
.gitea/   CI/CD workflows
```

## Commands

| Command | What it does |
|---|---|
| `pnpm dev` | Astro dev server with HMR |
| `pnpm build` | Static production build → `site/dist/` |
| `pnpm preview` | Serve the production build locally |
| `pnpm check` | `astro check` + `tsc --noEmit` |
| `pnpm lint` | ESLint + Prettier check |
| `pnpm test` | Vitest unit tests |
| `pnpm test:e2e` | Playwright end-to-end tests |
