Find your way around
A short tour of the repository, then an ordered reading list for each role on the team.
A tour of the repo
The repository is one pnpm + Turborepo monorepo. Everything that runs is under apps/,
everything the apps compose is under packages/, and the tooling that keeps it honest sits at
the root. Each row links to the page that explains it.
| Path | What it is | Read |
|---|---|---|
apps/web |
The Euro League site: a thin Next.js app of chrome, generated route shims and API routes | Web app |
apps/web/club.config.ts |
The one typed config: identity, theme, locales, sections, features and bought domains | Template config |
apps/storybook |
The single Storybook: every component's stories and the browser story tests | Applications |
apps/e2e |
Playwright component e2e, run against Storybook | Applications |
apps/docs |
This documentation site | Applications |
packages/ghost-core, ghost-content, ghost-video, ghost-basketball |
The design system: the theme foundation and the component packages | Component system |
packages/token-parser, tokens, tokens-euro-league |
The token pipeline: the parser, the generated defaults and icons, and ELB's brand layer | Token pipeline |
packages/model |
The Contentful content model as code: migrations, schema, fragments, transforms, the dictionary | Content model |
packages/content-app, video-app, basketball-app |
The route packages: each domain's pages as per-route factories | Domains & bolt-ons |
packages/template-config |
defineClubConfig() and the compose, add-feature and sync-upstream generators |
@v4/template-config |
packages/competition-engine |
The Competition Engine integration behind the basketball pages | Basketball and the Competition Engine |
packages/media, image, image-* |
The platform video SDK seam, and the pluggable image providers | Media and video architecture |
packages/wsc, eltv, ecal, analytics, cortex-sso, code-of-conduct |
The club-only integrations, one package per third party | Club integrations |
packages/contentful-contracts |
The versioned JSON field contracts the Contentful apps write and the site reads | @v4/contentful-contracts |
packages/tickets |
Tickets as code and the Jira tooling | @v4/tickets |
packages/docs-mcp, eslint-config, typescript-config |
The docs MCP server and the shared lint and TypeScript presets | Monorepo & packages |
scripts/ |
verify.mjs (the pre-push gate), the git hooks, CI helpers, the browser sweeps and load tests |
Commands |
.claude/ |
The Claude skills, agents, rules, references and plans | Skills & agents |
flightcontrol.json |
The hosting definition for the deployed environments | Deployment |
For the whole layout, package by package, see Monorepo & packages.
Frontend and components
For building or changing what the site looks like — components, themes, layout and motion. Start with Installation if the repo is not running yet.
- Component system — how a component is put together, where it is registered and how theming reaches it. Everything else assumes this.
- UI components overview — the design system as you will use it, and where to browse the catalogues.
- Theming & colour sets — the colour-set axis that sets a surface's colours, and how ELB's brand layer re-skins it.
- Token pipeline — where every value a component binds comes from, from Figma to CSS variable.
- Create a component — the steps, from scaffold to registered and tested.
- Refactor a component — reviewing against Figma, and the traps of building against ELB's forks of Ghost.
- Responsive rungs and Motion — the two design-owned rule sets every new layout and animation must follow.
- Testing — unit, story and e2e tests, and what each is for.
Content model and CMS
For changing what editors can author in Contentful and how the site reads it.
- Content model — the model as code: migrations, the schema, fragments and transforms, and why Contentful is never edited by hand.
- Content models — the content types themselves, to look up what exists before adding to it.
- Change the content model — the steps for a new field
or type, end to end, including this site's own migrations in
migrations/club/. - Domains & bolt-ons — which domain owns each type, and why that decides where a migration goes.
- Dictionary keys — interface copy: the keys in code, the labels in Contentful.
- Rich text rendering — how an article body becomes components, embedded entries included.
- @v4/model — the package's exports, subpaths and commands.
Pages, routes and basketball data
For adding pages, changing how they load data, and working on the basketball areas.
- Site map — every page of the site and its address: start here to see where a new page belongs.
- App & rendering — how the thin app mounts route packages and how data reaches a page.
- Domains & bolt-ons — route packages,
routes.jsonand the generated shims. - Add a page or route — the steps, including the data-area routes.
- Competition sections — the address rules every page follows, and how the chrome follows the section.
- Basketball and the Competition Engine — the data areas, the engine integration, live data and the Game Centre.
- @v4/basketball-app and @v4/competition-engine — the route package and the data seam, in detail.
- Caching & revalidation — tags, lifetimes and the webhook, for both Contentful and engine data.
- Local basketball data — running the engine on your machine.
Release and operations
For getting work merged, released and running in an environment.
- Branching & Git — the branch model, commit messages with their Jira key, and how work lands.
- Pull requests & gates — what CI checks on every pull request, and how it merges.
- GitHub Actions — what each workflow runs and when.
- Releasing — cutting a release and its changelog.
- Environments & secrets — which environments exist and where their secrets live.
- Deployment — Flightcontrol hosting and the model deploy pipeline.
- Environment variables — every variable, and what switches each integration on.
- Troubleshooting — the failures that recur, and their fixes.
- Take template updates — taking the template's changes in
as a
/sync-upstreampull request, and what they never touch.
QA and editors
For testing the site and authoring it, without reading code.
- Site map — every page a reader can reach and the address it lives at.
- What the site does — every feature area with its status: the first stop for "does the site do X?".
- Content & publishing — the page types and blocks an editor works with, and how a published change goes live.
- Competition sections — which address a page gets, and which Contentful field decides it.
- Sport — the basketball pages, the Game Centre, live scores and the widgets on editorial pages.
- The video section — the video pages and playback.
- Content models — every content type and field, to check what an editor can set.
- Accessibility — the accessibility bar every component ships to, and how it is checked.
- Glossary — the house terms these docs use.