ci: cancel superseded workflow runs Group each push and pull-request workflow run by workflow and ref. A new push to a pull request cancels that PR's older run. On branches, a newer queued run replaces an older queued one, and a running job finishes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Patrick Fanella portfolio
The source for patrickfanella.co, my portfolio. The Projects page groups 25 applications, archives, research projects, creative projects, and tools, with fresh screenshots, brand marks, diagrams, and links between related work. The main navigation also opens a searchable noindex archive with project thumbnails and logos.
The application is a React frontend, a Go API, a PostgreSQL content layer, generated static route documents and an Nginx production image. Every project carries a delivery status, and copy must not describe pre-alpha or in-development work as production-ready. Project copy lives in db/seed/portfolio.json. The web build publishes it as a static catalog so content and interface updates ship together. Contact submissions use the Go API and PostgreSQL, with a server-side email notification to [email protected]. Successful main verification deploys both web and API images to the existing NUC.
Reliability and privacy contract
- sitemap routes have generated static documents and a failing route-contract check
- production-shaped Playwright tests run through the Nginx image, not Vite fallback routing
- axe and keyboard-dialog checks cover the primary journey
- mobile Lighthouse budgets enforce performance, accessibility, best practices, SEO, and CLS thresholds
- health responses expose only
statusanddatabaseEnabled - successful contact responses do not echo stored submissions
- contact records are pruned after 90 days at startup and daily
- Plausible is the only supported analytics integration
Tech stack
- Frontend: Vite, React, TypeScript, Tailwind CSS, React Router, React Hook Form, Zod, Framer Motion
- Backend: Go, Chi, PostgreSQL, pgx
- Tooling: Docker, Docker Compose, ESLint, Vitest, Playwright, axe, Lighthouse CI
Local setup
The included Makefile automates the full bootstrap:
make bootstrap # postgres + install + migrate + seed
make api # run Go API (separate terminal)
make web # run Vite frontend (separate terminal)
make verify # lint + test + build
make verify-release # core verification + production E2E + Lighthouse budgets
Or step by step:
docker compose up -d postgrescd api && go run ./cmd/migrate && go run ./cmd/seedcd web && npm cicd web && npm run lint && npm run test && npm run build- Optional full-stack run:
docker compose --profile stack up --build
Run make help to see all available targets.
Project docs
-
docs/portfolio-selection.md- project selection, source evidence and content release requirements -
docs/portfolio-media.md- approved Studio assets, capture provenance and diagram generation -
docs/deployment.md- deployment topology and environment contract -
docs/runbook.md- day-to-day operations and release workflow -
docs/launch-checklist.md- reusable launch verification steps
License
Original contributions in this repository are licensed under the GNU General
Public License, version 3 or (at your option) any later version
(GPL-3.0-or-later). See LICENSE.
Third-party code, documentation, fonts, data, and other assets retain their own licenses, copyright notices, and attribution. This license does not replace those terms or grant rights to upstream material that its authors have not granted.