The pauseai.uk website — a Next.js (App Router) app deployed to Netlify.
- Next.js 16 (App Router) with React 19 and TypeScript
- Self-hosted Inter (
next/font/local+@font-face) and Google-hosted Lato (next/font/google) - Deployed to Netlify via
@netlify/plugin-nextjs
app/— routes, layouts, and per-route CSS (App Router)components/— shared React componentslib/data/— typed content modules; shared config (social links, emails, GA ID, external URLs) is inlib/data/site.tspublic/— static assets (fonts/,images/,pdfs/, favicons)
npm install
npm run dev # Next dev server (Turbopack) at http://localhost:3000
npm run build # Production build
npm run lint # ESLintSee package.json for the full script list, including the lighthouse* scripts.
- Unit tests (
npm test, Vitest) coverlib/andapp/api/. They run automatically as part ofnpm run build, so a failing test blocks deploy. - Airtable access is locked to
lib/airtable.ts: an ESLint rule (no-restricted-syntaxineslint.config.mjs) bans any other file from referencingapi.airtable.com, so the signed-only filter and field whitelist there can't be bypassed by a new call site.npm run check:airtable-filterruns just that rule, isolated from the rest of ESLint, and is also part ofnpm run build— a bypass fails the build the same way a failing test does. - Visual regression (
npm run test:visual, Playwright) screenshots every page on the live site and this local build side by side and pixel-diffs them — no stored baseline to keep up to date, since site content (news, events, stories) changes too often for one to stay meaningful.npm run test:visual:reportopens the HTML report with live/local/diff images per page. Seetests/visual/pages.spec.ts.
- Events are fetched at request time from the Luma calendar API (
lib/data/events.ts), not hardcoded. - Donations use prebuilt Stripe payment links hardcoded in
components/DonateForm.tsx— there is no payment backend. - Fonts are committed as woff2 in
public/fonts/, so there is no font download/build step after cloning. public/CNAMEis a leftover from the old GitHub Pages setup. Netlify ignores it; the domain is managed in the Netlify dashboard.
Netlify, configured in netlify.toml (build npm run build, publish .next, Node 22). Pushes to the default branch deploy to production; pull requests get deploy previews automatically.