{"id":836,"slug":"client-bjf-marketing-site-stack","title":"B&J marketing site stack (`bj-next`, dev URL `bjweb.candidcreative.ca`) — VERIFIED LIVE STACK","kind":"reference","scope":"client-case-studies","status":"current","audiences":["kevin","candid-team","client-prospect"],"topics":["tech-stack","nextjs","client-boucher-jones","case-study-source","client-tech-stack"],"reference_body":"**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.\n\n| Layer | Choice | Note |\n|---|---|---|\n| Framework | **Next.js 16 App Router**, **React 19**, TypeScript strict | **[Verified — repo CLAUDE.md]**. Tech-stack doc said Next.js 15 — superseded. |\n| 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. |\n| Database | **PostgreSQL 17** | **[Verified]** |\n| 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. |\n| API layer | **Next.js Route Handlers** (Express 5 migration deferred) | **[Verified]**. Tech-stack doc named Express 5 — superseded for the marketing site. |\n| Authentication | JWT, role-based, multi-role | **[Verified — tech-stack doc]** |\n| File storage | **Garage** (S3-compatible, self-hosted), WebP at 80% | **[Verified — tech-stack doc]** |\n| Tooling discipline | ESLint 9 flat config (direct imports, not FlatCompat) + Prettier + Husky pre-commit (lint-staged + tsc) | **[Verified]**. Stage 3 enforcement layer complete. |\n| Infrastructure | Docker Compose, `--platform linux/amd64` on builds | **[Verified]** |\n| Public HTTPS | **Cloudflare Tunnel** (UUID `003a7aa0-9b94-4d33-8ebf-534e944b85c8`) | **[Verified — Kevin's memory]** |\n| Hosting | **Self-hosted VPS** (Hetzner). Site runs in Proxmox LXC CT 104, `boucher-jones`, `192.168.1.78`, port 3201, behind the tunnel. | **[Verified]** |\n| Service management | systemd: `boucherjones-web`. Deploy: `git pull && npm ci && npm run build && sudo systemctl restart boucherjones-web` | **[Verified]** |\n| Branch convention | Local `main` tracks `origin/bj-next-foundation` | **[Verified]** |\n\n## Parallel services still running (do not disturb)\n\n- `boucher-jones-kb` on port 3100\n- `bj-website` (legacy/predecessor) on port 3200\n- B&J intake form via Cloudflare Pages\n\n**[Verified — Kevin's memory]**","rationale_body":null,"metadata":null,"links":{"outgoing":[{"slug":"client-bjf-crm-stack-planned","title":"B&J CRM platform — PLANNED stack (not yet built)","kind":"reference","scope":"client-case-studies","link_type":"relates-to"},{"slug":"client-bjf-manifold-data-platform","title":"Manifold data platform — Candid Creative product powering embedded widgets on the B&J site","kind":"reference","scope":"client-case-studies","link_type":"relates-to"},{"slug":"rule-bjf-stack-claude-md-source-of-truth","title":"Rule (B&J): when describing the marketing site tech stack, the live repo CLAUDE.md is the source of truth — not the project-knowledge tech-stack doc","kind":"rule","scope":"client-case-studies","link_type":"relates-to"}],"incoming":[{"slug":"client-bjf-case-study-source-v1","title":"Boucher & Jones Fuels — case-study source material, v1 (parent index)","kind":"reference","scope":"client-case-studies","link_type":"relates-to"},{"slug":"client-bjf-critical-context-flags","title":"B&J case study — critical overclaim guards (READ BEFORE WRITING)","kind":"reference","scope":"client-case-studies","link_type":"relates-to"},{"slug":"rule-bjf-stack-claude-md-source-of-truth","title":"Rule (B&J): when describing the marketing site tech stack, the live repo CLAUDE.md is the source of truth — not the project-knowledge tech-stack doc","kind":"rule","scope":"client-case-studies","link_type":"depends-on"},{"slug":"client-bjf-repo-codebase-facts-v2","title":"B&J — repo and codebase facts (v2, verified 2026-05-24)","kind":"reference","scope":"client-case-studies","link_type":"relates-to"},{"slug":"client-bjf-database-state-v2","title":"B&J — database state (v2, verified 2026-05-24) — marketing site is materially read-only","kind":"reference","scope":"client-case-studies","link_type":"relates-to"},{"slug":"client-bjf-service-uptime-and-tunnel-v2","title":"B&J — service uptime, memory footprint, and tunnel reachability (v2, verified 2026-05-24)","kind":"reference","scope":"client-case-studies","link_type":"relates-to"},{"slug":"client-bjf-craft-signals-structural-v2","title":"B&J — five structural craft signals worth surfacing in case-study narrative (v2)","kind":"reference","scope":"client-case-studies","link_type":"relates-to"}]},"created_at":"2026-05-24T00:26:55.427Z","updated_at":"2026-05-24T00:26:55.427Z"}