A static site catalogue for NHS healthcare data code. The site indexes GitHub repositories (public and private) using structured YAML metadata. The goal is to make NHS reusable code discoverable, shareable, and easier to adapt across organisations.
This is a prototype. Prioritise working software over polish.
This brief is a starting point, not a contract. The design decisions below represent one reasonable approach based on the inspiration sites studied. If you see a better way to achieve the goals — a cleaner architecture, a more capable stack, a more compelling UI — use it. Don't let prior thinking constrain a better outcome.
Hard constraints (non-negotiable):
- Python-based development toolchain
- Deploys free to GitHub Pages via GitHub Actions
- Open source
- NHS branding (colour palette and font in the NHS Branding section)
- Data stored as YAML files in
library/— this is the contract for submissions
Everything else is a suggestion. The tech stack, page structure, build approach, JS
libraries, and UI layout are all open to revision if you have a stronger choice. Document
any significant departures from this brief in a DECISIONS.md file at the repo root so the
human can understand what changed and why.
Inspiration sites to study — take what works, leave what doesn't:
- UI/card layout: https://gigcymru.github.io/Solutions-Exchange/ (source)
- Entry format / tier display: https://atlas.hsma.co.uk/ (source)
- NHS branding / MkDocs setup: https://nhsengland.github.io/datascience/ (source)
These are the starting choices, not mandates. Override with justification in DECISIONS.md.
| Layer | Suggestion | Reason |
|---|---|---|
| Static site | MkDocs + Material theme | Python-native; NHS Data Science already uses it |
| Catalog rendering | Client-side JS + Bootstrap 5 | No server needed; follows SolEx pattern |
| Data storage | YAML per entry in library/ |
Human-readable, PR-reviewable, validatable |
| Build pipeline | MkDocs hook or scripts/build.py |
YAML → catalog.json at build time |
| Deployment | GitHub Actions → GitHub Pages | Free, automated |
| Submissions | GitHub Issue templates | No auth required; structured; reviewable |
Use the NHS identity palette throughout. Key colours:
| Name | Hex |
|---|---|
| NHS Blue | #005EB8 |
| NHS Dark Blue | #003087 |
| NHS Bright Blue | #0072CE |
| NHS Light Blue | #41B6E6 |
| NHS Aqua Blue | #00A9CE |
| NHS Green | #009639 |
| NHS Light Green | #78BE20 |
| NHS Orange | #ED8B00 |
| NHS Warm Yellow | #FFB81C |
| NHS Purple | #330072 |
| NHS Pink | #AE2573 |
| NHS Dark Grey | #425563 |
| NHS Mid Grey | #768692 |
| NHS Pale Grey | #E8EDEE |
Font: use the NHS standard — Frutiger if available, fallback to Arial then sans-serif.
Tier badge colours (consistent with HSMA Atlas):
- Baseline —
#768692(mid grey) - Bronze —
#CD7F32 - Silver —
#9EA8B3 - Gold —
#D4AC0D
/ Home — hero, featured entries, success stories, stats
/catalog/ Browse all entries — filterable, searchable card grid
/submit/ How to submit — links to GitHub Issue template + guidance
/about/ Project background, the SUL principle, reusability framework
/framework/ Full reusability framework (Baseline → Gold) reference page
/categories/ Full category taxonomy reference page
- Hero — name, tagline, CTA button to /catalog/
- Stats bar — total entries, languages, organisations
- Featured entries — 3–4 cards marked
featured: true - Success stories — entries with
success_story: true, shown with outcome text - Recently added — last 6 entries by
date_added - Tier breakdown — visual summary of how many entries at each tier
Each entry lives at library/<slug>/metadata.yaml. See docs/reference/data_model.md
for the full field reference and validation rules.
Seed entries for testing: library/nhs-number-validator/, library/waiting-list-des/,
library/ae-daily-extract/. These cover Gold, Silver, and Baseline tiers respectively.
A Python script (or MkDocs hook) reads every library/*/metadata.yaml, validates it, and
writes docs/js/catalog.json. The catalog page loads this JSON client-side and renders cards.
library/*/metadata.yaml → scripts/build_catalog.py → docs/js/catalog.json
The build script should also:
- Reject invalid entries and print clear errors (so CI catches bad submissions)
- Compute
date_addeddefaults if missing - Sort entries by
date_addeddescending
A separate scripts/validate.py (or the same script with a --check flag) validates all
YAML files against the schema. Run this in CI on every PR that touches library/.
Trigger: push to main.
Steps:
uv sync- Run the build/validation script
uv run mkdocs build- Deploy
site/togh-pagesbranch usingpeaceiris/actions-gh-pages
Trigger: PRs that change files under library/.
Steps:
uv sync- Run
scripts/validate.py— fail the check if any entry is invalid
See the seed template at .github/ISSUE_TEMPLATE/submit_entry.yml.
Model this closely on Solutions Exchange. Key requirements:
- Card grid — 3 columns on desktop, 1 on mobile (Bootstrap 5 grid)
- Each card shows: title, organisation, description (truncated), language badges, platform badges, reusability tier badge, category tag
- Filters (sidebar or top bar):
- Reusability tier (checkboxes: Baseline / Bronze / Silver / Gold)
- Category (dropdown or checkboxes)
- Language (multi-select)
- Platform (multi-select)
- Visibility (public / private / all)
- Search — client-side text search over title + description + tags (use Fuse.js or plain substring matching — keep it simple)
- Sort — newest first by default; option to sort by title or tier
- Clicking a card opens the entry detail (a separate MkDocs page or a modal)
Each entry gets a generated MkDocs page at docs/catalog/<slug>/index.md (generated by
the build script from the YAML). It should show:
- Title, organisation, description
- Reusability tier badge + rationale text (if provided)
- SUL principle compliance table (Structural / Utility / Logic — tick/cross)
- Category + project type
- Language + platform badges
- Links: repo, documentation, package registry (if applicable)
- Contact info
- Atlas cross-listing notice (if
atlas_listed: true) - Date added / last updated
HSMA Atlas (atlas.hsma.co.uk) uses Quarto .qmd files for
entries. The atlas_listed and atlas_url fields in our metadata allow us to:
- Show a badge on the entry card/detail: "Also listed on HSMA Atlas"
- In future: provide a script that generates a
.qmdfile from our YAML that can be submitted as a PR to the Atlas repo
For the prototype, just implement the badge display. The export script can come later.
Follow the project's global standards (see global CLAUDE.md):
uvfor environment managementrufffor lint + format- Full type hints on all functions
pydanticfor YAML schema validationpathlib.Pathover string pathslogurufor logging- British English in all user-facing text and documentation
Once the site is built, anyone can preview it with:
uv sync
uv run python scripts/build_catalog.py # generate catalog.json + entry pages
uv run mkdocs serve # starts at http://localhost:8000The demo path to walk through:
- Home page — hero, stats bar, featured entries, success stories
- Catalog (
/catalog/) — filter by tier, category, language; test search - Entry detail — click any card; check tier badge, SUL table, links
- Submit (
/submit/) — review the submission guidance and Issue template link - Framework (
/framework/) — check Baseline → Gold reference renders correctly
For a quick smoke test with no browser, confirm uv run mkdocs build exits 0.
One-time setup (done by the human, not by CI):
- Create a new GitHub repository (public, empty)
- Push this repo:
git remote add origin <url> && git push -u origin main - In the repo Settings → Pages → Source: set to Deploy from a branch, branch
gh-pages, root/ - The first push to
maintriggers the Actions workflow and deploys automatically
After that, every push to main redeploys. The live URL will be
https://<org>.github.io/<repo-name>/.
The GitHub Actions deploy workflow lives at .github/workflows/deploy.yml. It should:
uv sync- Run the build/validation scripts
uv run mkdocs build- Push
site/to thegh-pagesbranch (usepeaceiris/actions-gh-pages@v3or the neweractions/deploy-pages— your choice)
At the end of your build, create a NEXT_STEPS.md file in the repo root. This file is
for less advanced models or human contributors to continue development after you are done.
NEXT_STEPS.md must contain:
### [Priority: High/Medium/Low] Feature name
**What:** One sentence describing what it does.
**Why:** One sentence on the value it adds.
**Where to start:** The specific file(s) to open first.
**Scope:** Rough size — Small (< 2hrs), Medium (half day), Large (full day+).
**Constraints / gotchas:** Any non-obvious things to know before starting.- Quick wins (Small scope) — 4–6 low-effort improvements that add visible value
- Core features (Medium scope) — 4–6 features that extend the prototype meaningfully
- Advanced features (Large scope) — 3–4 bigger ideas for when the prototype is stable
- Atlas collaboration — specific tasks for deepening the HSMA Atlas integration
- Operational — maintenance, monitoring, and community-building tasks
Be honest about what you did not build or cut corners on. Flag it in a
Known gaps section at the top of NEXT_STEPS.md so the next contributor knows
what to fix before adding new features.
The phases below are a suggested sequence. Reorder or merge them if your chosen architecture makes a different order more natural. The only firm rule: get something that builds and deploys before building features on top of it.
Complete each phase before starting the next.
pyproject.tomlwith all dependencies- Site framework configured (MkDocs or your chosen alternative) with NHS colours
- A placeholder home page that renders
.github/workflows/deploy.yml— builds and deploys to Pages.github/workflows/validate.yml— validates entries on PRs tolibrary/- Gate:
uv run mkdocs build(or equivalent) exits 0 before proceeding
- Pydantic models for entry metadata covering the full schema in
docs/reference/data_model.md - Validation script that checks all
library/*/metadata.yamlfiles - Gate: all 3 seed entries pass validation before proceeding
- Script/hook: YAML →
catalog.json(and any generated entry pages) - Wired into the deploy workflow
- Gate: catalog.json is present and contains the 3 seed entries after build
- Card grid with filter and search
- NHS-styled tier badges, language badges, platform tags
- Responsive layout (mobile + desktop)
- Gate: filtering and search work correctly against the seed entries
- Hero with NHS branding and CTA
- Stats bar, featured entries, success stories, recently added, tier breakdown
/submit/— submission guidance/about/— SUL principle, project background/framework/and/categories/— rendered from the reference docs
- 8–12 synthetic seed entries covering all 6 categories and all 4 tiers
- Mobile layout check
- Atlas cross-listing badge on detail pages
README.mdwith setup instructions
DECISIONS.mddocumenting any departures from this briefNEXT_STEPS.mdfollowing the format in the Continuing Development section above