Files
school_compare/nextjs-app
TudorandClaude Opus 5.5 ca47d08186 feat(school): state the header's facts in one line, and flag what applies
The row of grey chips under the name mixed the council, a GIAS governance
term, the age range and provision, with no labels. Parents could not tell
what "Wandsworth" or "Nursery" meant, and selective, faith and fees were
missing or buried in the details.

The header now prints one fact line (phase pill · ages · type · pupils),
then flags only for what applies, in a fixed order: who can apply or what
it costs (Fee-paying, Selective, Girls'/Boys' school, the religious
character as recorded), then what the school offers (Nursery class, Sixth
form). Flags carry no hue: they are facts, not verdicts. The council joins
the address unless the address already names it. The details keep
headteacher, website, phone, academy trust (hidden when it has the
school's own name) and capacity; county, constituency and religious
character leave the header. The proposed-to-close strip is unchanged.

lib/schoolFacts holds the type label and the flags so the search rows can
print the same words.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 22:59:45 +01:00
..

SchoolCompare frontend and CMS

Next.js App Router with React, TypeScript, CSS Modules, Chart.js, Leaflet and Payload CMS. It serves school search, comparisons, rankings, school/place detail pages and editorial content across England.

Start with the repository overview, architecture and development checks.

Source map

Path Purpose
app/(frontend)/ Public root layout, server pages and FastAPI proxy
app/(payload)/ Payload root layout, /admin and /cms-api
app/robots.ts, app/opengraph-image.tsx, root icons Site-wide metadata endpoints
components/ Client views and reusable display components
components/school/ School detail sections
lib/api.ts, lib/types.ts Fetch wrappers and manual school API types
lib/schoolSections.ts, lib/compareLogic.ts Presentation decisions and data preparation
context/, hooks/ Comparison state, suggestion state and responsive behaviour
collections/, blocks/, migrations/ CMS schema and production migrations
__tests__/ Jest and React Testing Library tests

Do not introduce a shared app/layout.tsx: public pages and Payload have separate root layouts. Keep root metadata files outside the route groups.

Data and state

Server pages fetch initial data directly from FASTAPI_URL. Browser fetches use /api by default, forwarded by app/(frontend)/api/[...path]/route.ts. FASTAPI_URL must include /api. See .env.example for CMS and API settings.

State uses React hooks/context, URL search parameters and localStorage for the comparison basket. SWR is not installed. Maps use dynamic Leaflet wrappers. Revalidation intervals are configured in fetch wrappers and pages; they vary by resource. Backend reloads do not automatically invalidate every Next.js cache.

Commands

npm ci
npm run typecheck
npm test -- --runInBand
npm run build

test:watch and test:coverage are also available. There is no lint script. A running application needs the backend/data environment described in the development guide.

After CMS field or editor changes, run npm run generate:importmap. Keep payload-types.ts generated from the CMS schema rather than editing it by hand. The build must work without a database connection; avoid module-scope CMS queries and DB-backed generateStaticParams functions.

See publishing for CMS operations and deployment for staging and production promotion.