B&J marketing site stack (`bj-next`, dev URL `bjweb.candidcreative.ca`) — VERIFIED LIVE STACK

Source-of-truth note: the repo's CLAUDE.md is the live source of truth. The BoucherJones_MarketingSite_TechStack.docx document in project knowledge is partially superseded (see column 3 for the supersession notes). When the case study describes the stack, use the values below.

Layer Choice Note
Framework Next.js 16 App Router, React 19, TypeScript strict [Verified — repo CLAUDE.md]. Tech-stack doc said Next.js 15 — superseded.
Styling Tailwind v4 + shadcn (New York style), tokens in globals.css @theme block [Verified — Kevin's memory]. Tech-stack doc referenced a custom design system with no Tailwind — superseded.
Database PostgreSQL 17 [Verified]
ORM / DB access Raw pg in src/lib/services/ (no Prisma on this surface) [Verified]. CRM project plan calls for Prisma — that's the CRM stack, not the marketing site. Do not conflate.
API layer Next.js Route Handlers (Express 5 migration deferred) [Verified]. Tech-stack doc named Express 5 — superseded for the marketing site.
Authentication JWT, role-based, multi-role [Verified — tech-stack doc]
File storage Garage (S3-compatible, self-hosted), WebP at 80% [Verified — tech-stack doc]
Tooling discipline ESLint 9 flat config (direct imports, not FlatCompat) + Prettier + Husky pre-commit (lint-staged + tsc) [Verified]. Stage 3 enforcement layer complete.
Infrastructure Docker Compose, --platform linux/amd64 on builds [Verified]
Public HTTPS Cloudflare Tunnel (UUID 003a7aa0-9b94-4d33-8ebf-534e944b85c8) [Verified — Kevin's memory]
Hosting Self-hosted VPS (Hetzner). Site runs in Proxmox LXC CT 104, boucher-jones, 192.168.1.78, port 3201, behind the tunnel. [Verified]
Service management systemd: boucherjones-web. Deploy: git pull && npm ci && npm run build && sudo systemctl restart boucherjones-web [Verified]
Branch convention Local main tracks origin/bj-next-foundation [Verified]

Parallel services still running (do not disturb)

  • boucher-jones-kb on port 3100
  • bj-website (legacy/predecessor) on port 3200
  • B&J intake form via Cloudflare Pages

[Verified — Kevin's memory]