subcult-agentandClaude Opus 5.5 57bfdac355 ci: cancel superseded workflow runs [skip ci]
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]>
2026-11-08 01:59:42 -06:00
2026-10-27 12:35:00 -05:00

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 status and databaseEnabled
  • 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:

  1. docker compose up -d postgres
  2. cd api && go run ./cmd/migrate && go run ./cmd/seed
  3. cd web && npm ci
  4. cd web && npm run lint && npm run test && npm run build
  5. 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.

S
Description
Full-stack portfolio application built to showcase product thinking, clean engineering, and production-ready delivery.
https://patrickfanella.co Readme GPL-3.0
41 MiB
0 Stars 1 Watchers 0 Forks
Languages
HTML 46.5%
TypeScript 27.5%
Go 13.6%
JavaScript 5%
Python 3.4%
Other 4%