Website Implementation Plan (Phase G)
A comprehensive, review-ready plan to transform the Portfolio Architecture Portal from a markdown knowledge base into a modern, navigable website — while keeping the markdown as the single source of truth. This document is planning only: no existing files were modified, moved, renamed, or deleted; no code was generated; no content was rewritten. This is the only new file added in Phase G, and it is deliberately not wired into navigation (that is a post-approval step) to honour the “no modifications” constraint.
Guiding principle: the website is a presentation layer over the existing markdown. The markdown in
portal/,docs/,ai/,templates/, and the ADRs remains authoritative; the site renders it, never replaces it. This is the portal’s own Principle 2 (definition vs. derivation) applied to itself — content is the definition, the built site is the derivation.
0. Technology validation (Astro stack — confirmed, with one recommendation)
The proposed stack — Astro + Markdown/MDX + Mermaid + Cloudflare Pages + static search + SSG + optional React — is an excellent fit for a markdown-first documentation site. It is affirmed. One material recommendation is added.
| Requirement | Why the stack fits |
|---|---|
| Markdown is source of truth | Astro 5 Content Layer loads markdown from arbitrary paths via a glob() loader — files stay exactly where they are (no moves). |
| Static, fast, cheap | Astro SSG → static HTML; near-zero JS by default (“islands”). Ideal on Cloudflare Pages’ free static hosting + global CDN. |
| Search over markdown | Pagefind indexes the built HTML at build time — fully static, no server, no external service (aligns with “knowledge referenced, never owned”). |
| 60 Mermaid diagrams, dark/light | Mermaid integrates at build-time (SVG) or client-side (theme-aware). Handled below. |
| Optional interactivity | React (or Preact/vanilla) islands only where genuinely beneficial (search UI, relationship graph). |
Recommendation — evaluate Astro Starlight as the base, not bespoke Astro. Starlight is Astro’s official documentation framework. It provides, out of the box, exactly what this portal needs and would otherwise be hand-built: responsive sidebar navigation, Pagefind search, dark/light mode, accessible components, “edit this page” links, table-of-contents, prev/next, and SEO metadata. It is still Astro — MDX, custom components, and content collections all work.
| Option | Pros | Cons | Verdict |
|---|---|---|---|
| A: Astro + Starlight (recommended) | Nav, search, theming, a11y, TOC free; weeks of effort saved; still fully customisable | Opinionated layout; must map portal structure to Starlight’s sidebar; some restyling to hit the target design | Recommended — start here |
| B: Bespoke Astro | Total control over layout/design | Rebuild nav, search wiring, theming, a11y from scratch; slower; more maintenance | Fallback if the design demands a layout Starlight can’t express |
| C: Other frameworks (Next.js, Docusaurus, VitePress) | Each capable | Next.js = heavier/SSR-oriented, overkill for static; Docusaurus/VitePress are React/Vue-locked and less flexible than Astro’s islands; none beat Astro for “mostly static + occasional interactivity” | Not recommended |
The rest of this plan is written to work under either A or B; where they differ, both paths are noted.
1. Current State Assessment
Current structure (evidence-based)
- 75 markdown files.
portal/= 52,docs/= 4,templates/= 8,ai/= 3,design/= 2,showcase/= 2,skills/= 2, root =README.md+CLAUDE.md(+llms.txt). portal/sub-sections:repos/,ventures/,capabilities/,architecture/,operating-model/,governance/,decisions/,current-state/,registry/, plusindex.md,portfolio-overview.md.- All 56
portal/+docs/pages carry consistent YAML frontmatter (title,type,status,last_reviewed,owner, plus type-specific keys:slug,layer,providers,consumers,adr_number, …). - 60 Mermaid diagrams across 40 files (mostly
graph TD/LR; onequadrantChartinarchitecture-risks.md). llms.txtmachine index; internal links are relative markdown paths; 0 broken internal links (verified each phase).- Conventions: Diátaxis
type,<!-- HUMAN -->/<!-- GENERATED -->region markers, kebab-case slugs, zero-padded ADR numbering, templates intemplates/.
Strengths
- Exceptional content quality and consistency — uniform frontmatter, templates, cross-linking, Diátaxis typing.
- Rich structured metadata already present (layers, maturity, providers/consumers, ADR status) — directly usable to generate cards, badges, and filters without new content.
- Diagrams are inline Mermaid (text) — versionable, diffable, and renderable to SVG.
- A machine index (
llms.txt) and an explicit Information Architecture already define the nav model and routes — the site can derive navigation from these. - Governance already exists (Documentation Governance) defining source-of-truth per artefact — the site build must respect it.
Weaknesses (for web presentation)
- No
description/summary frontmatter field for SEO meta and card subtitles (first paragraph can be used, but an optional field is cleaner). - No explicit sidebar ordering — order is currently implied by the IA doc, not machine-declared.
- Relative links are markdown-file paths (
../repos/x.md) — these must resolve to routes (/repos/x) at build; a link-rewrite step or Astro’s markdown link handling is required. - Section index pages are
README.md— fine, but routing must mapportal/x/README.md → /x/. design/brand-tokens.mdis a placeholder (TBDvalues) — the design system must be defined (Section 6).- One newer Mermaid type (
quadrantChart) needs a renderer that supports it.
Technical debt (site-relevant, not content defects)
- Manual portal upkeep (already flagged as Risk R8) — the site build should add automated validation (links, frontmatter, Mermaid) to reduce it.
- Two glossaries (
docs/glossary.mdscoped to portal-maintenance;portal/operating-model/glossary.mdauthoritative) — the site should present the authoritative one prominently and label the other.
Opportunities
- Turn structured frontmatter into interactive registries (filter/sort capabilities, repos, ADRs).
- Render the layered architecture, dependency map, and reuse map as first-class visual navigation.
- Search across the whole knowledge base (Pagefind) — a major usability gain over browsing GitHub.
- A polished site materially advances the deferred public showcase goal (Phase A/C) — scale & sophistication become visible.
Risks (summarised; full register in Section 10)
- Link/route mismatch during rendering; Mermaid rendering at scale (60 diagrams) and theme-sync; frontmatter gaps for meta; keeping the build in sync with additive content conventions; scope creep into bespoke design.
2. Proposed Architecture
Repository placement (additive, non-disruptive)
The site lives in a new top-level site/ directory; all existing content stays in place. The Astro
content layer reads markdown from ../portal, ../docs, ../skills, etc. via glob loaders.
portfolio-portal/ (unchanged root)
├── portal/ docs/ ai/ templates/ skills/ showcase/ ← UNCHANGED source of truth
├── llms.txt README.md CLAUDE.md ← UNCHANGED
└── site/ ← NEW, additive (the website project)
├── astro.config.mjs
├── package.json
├── content.config.ts (glob loaders pointing at ../portal/**, ../docs/**)
├── public/ (favicon, static assets, og images)
└── src/
├── content/ (collection *definitions* only; data loaded from ../portal)
├── components/ (cards, badges, diagram, graph — Section 7)
├── layouts/ (Base, DocPage, RegistryPage)
├── pages/ (route files or Starlight config)
├── lib/ (nav builder, link rewriter, frontmatter helpers)
└── styles/ (design tokens, theme — Section 6)
Why
site/as a sibling, not a rewrite: it is purely additive (Migration Strategy, Section 4), keeps the knowledge base pristine, and lets the site be deleted/rebuilt without touching content. It mirrors the ecosystem’s own “definition vs derivation” split.
Content structure & routing model
| Source (unchanged) | Route | Page kind |
|---|---|---|
portal/index.md |
/ (or /portal) |
Portal home |
portal/portfolio-overview.md |
/overview |
Overview |
portal/repos/<slug>.md |
/repos/<slug> |
Repository page |
portal/repos/README.md |
/repos |
Repos index (interactive) |
portal/capabilities/cap-<slug>.md |
/capabilities/<slug> |
Capability page |
portal/capabilities/README.md |
/capabilities |
Capability Registry (interactive) |
portal/ventures/<slug>.md |
/ventures/<slug> |
Venture/system page |
portal/architecture/*.md |
/architecture/* |
Architecture pages |
portal/operating-model/*.md |
/operating-model/* |
Operating Model |
portal/governance/*.md |
/governance/* |
Governance |
portal/decisions/NNNN-*.md |
/decisions/NNNN-* |
ADR |
docs/*.md |
/about/* |
Portal meta-docs |
Routing derives from the existing folder structure and the Information Architecture route map — no new IA is invented; the site adopts the documented one.
Astro project layout
- Content collections (Astro 5 Content Layer): one collection per portal section, each a
glob()loader over the existing directory, with a Zod schema that mirrors current frontmatter (all fields optional excepttitle) so nothing needs rewriting. - Dynamic routes:
src/pages/[...slug].astro(or Starlight’s auto-routing) maps collection entries to routes. - Layouts:
BaseLayout(head/meta/theme) →DocLayout(sidebar + TOC + content) → specialisedRegistryLayout(interactive index pages).
Component hierarchy
graph TD
Base[BaseLayout<br/>head · theme · skip-link] --> Doc[DocLayout<br/>sidebar · TOC · breadcrumbs · prev/next]
Base --> Registry[RegistryLayout<br/>filterable grids]
Doc --> MD[MarkdownContent]
MD --> Mermaid[ArchitectureDiagram]
MD --> Callout
Registry --> CapCard[CapabilityCard]
Registry --> RepoCard[RepositoryCard]
Registry --> VenCard[VentureCard]
Registry --> ADR[ADRSummary]
CapCard --> Badge[StatusBadge / TechBadge]
RepoCard --> Badge
Navigation model
- Top nav (header): Overview · Capabilities · Repos · Ventures · Architecture · Operating Model · Governance · Decisions — exactly the documented header nav.
- Left sidebar: section tree derived from folders + an optional
sidebarorder/group frontmatter key (additive; falls back to alphabetical + README-first). - Right TOC: generated from page headings (Starlight/
rehypeautolink). - Breadcrumbs: mirror the route hierarchy (matches the IA breadcrumb rule).
- In-page cross-links: existing markdown links, rewritten
*.md → route.
Search architecture
Pagefind (static, build-time): after Astro builds HTML, Pagefind indexes it and ships a tiny client bundle.
Zero infrastructure, works on Cloudflare Pages, respects the “no external service” preference. Search UI is a
small island (modal, / to focus). Frontmatter (type, layer, maturity) can be emitted as Pagefind
filters for faceted search (e.g. “capabilities that are operational”).
Mermaid rendering strategy
- Primary: client-side, theme-aware rendering via a Mermaid integration (e.g.
astro-mermaidor a small rehype step that leaves```mermaidblocks for a client script). Rationale: 60 diagrams with a hard dark/light requirement — client-side re-renders on theme switch trivially, and supports newer types (quadrantChart). - Optimization (optional, later): build-time SVG (
rehype-mermaid+ headless Chromium) for zero-JS, faster first paint, and SSR-safe output — adopt if diagram-heavy pages need it. Note this adds a Playwright build dependency and must be verified againstquadrantChart. - Decision: ship client-side first (fast to build, theme-correct), measure, then selectively pre-render.
- Every diagram gets an accessible caption/
aria-label(Section 9) and a horizontal-scroll container so wide graphs never break the layout.
Metadata strategy
- Per-page:
title+description(from frontmatter if present, else first paragraph) →<title>, meta description, Open Graph/Twitter cards, canonical URL. - Structured:
type,status,last_reviewed,owner,layer,maturitysurfaced as visible page metadata (a “page info” strip) and as Pagefind filters. - Site-level: sitemap.xml (
@astrojs/sitemap), robots.txt, a generatedllms.txtparity check (the site can validate its routes against the existingllms.txt). - OG images: optional generated social cards per page (title + type + layer) — a Phase-4 nicety.
Deployment architecture
graph LR
DEV[git push to main] --> CF[Cloudflare Pages CI]
CF --> BUILD[astro build + pagefind index]
BUILD --> STATIC[Static assets]
STATIC --> CDN[Cloudflare global CDN]
PR[Pull request] -.preview deploy.-> PREVIEW[per-PR preview URL]
CDN --> USER((Visitors))
- Cloudflare Pages, Git-connected: build on push to
main; preview deployments per PR (a natural review gate that fits the portal’s governance). - Static output only (no Workers needed for v1). Custom domain optional. Build command
npm run build(runsastro buildthenpagefind), output dirsite/dist.
3. Content Strategy
Files stay where they are. The Astro content layer loads them in place via glob loaders — no content moves, renames, or rewrites. This is the single most important content decision and it is fully supported by Astro 5.
Frontmatter
- No rewrite required. The collection schema mirrors existing fields; everything except
titleis optional. - Recommended additive (optional) fields, applied lazily/only where useful, never in bulk:
description— one-line summary for meta + card subtitle (else derived from first paragraph).sidebar—{ order, group, label }for deterministic nav (else folder + README-first + alphabetical).hidden: true— exclude a page (e.g. templates) from the public site if desired.
- Adding these is purely additive and can be done page-by-page over time; the site works without them.
Related pages
Generated from existing signals, not new content:
- Same-section siblings (folder).
- Frontmatter relationships (
providers,consumers,layer,system) → “related repos/capabilities”. - Outbound markdown links already present in each page.
- ADRs referenced by a page ↔ pages referenced by an ADR (bidirectional, from link graph).
Navigation generation
Derived from (a) folder structure, (b) the Information Architecture route/nav
tables, and © optional sidebar frontmatter. No hand-maintained nav file that can drift.
Search indexing
Pagefind indexes the built HTML (post-build). Frontmatter type/layer/maturity emitted as filters.
templates/ and any hidden pages excluded from the index.
Diagram rendering
```mermaid fenced blocks are detected and rendered (client-side, theme-aware) — the existing blocks are used
as-is. No diagram content is rewritten. Wide diagrams scroll within their container.
Link rewriting (the one build-time transform)
A small rehype/remark step rewrites internal *.md links to routes (../repos/x.md#sec → /repos/x#sec) at
build time. Source markdown is untouched on disk; the transform happens in the render pipeline only.
4. Migration Strategy
Every proposed change is additive; the knowledge base is not restructured. Ordered by necessity.
| # | Change | What | Why | Benefits | Risks | Alternatives considered |
|---|---|---|---|---|---|---|
| M1 | Add site/ project |
New sibling dir with Astro app | Presentation layer without touching content | Clean separation; deletable/rebuildable | Repo now has app deps (node_modules, lockfile) |
Separate repo (rejected: splits source of truth from presentation, harder sync) |
| M2 | Glob content loaders | content.config.ts reads ../portal/**, ../docs/** |
Files stay put | Zero content moves; no broken git history | Loader path fragility if folders move | Move content into src/content/ (rejected: disruptive, violates “prefer additive”) |
| M3 | Build-time link rewrite | remark/rehype .md→route |
Links must resolve as web routes | Existing links “just work” on the site | Edge cases (anchors, README index) need tests | Rewrite links in source (rejected: modifies content) |
| M4 | Optional additive frontmatter | description, sidebar, hidden where useful |
Better meta/nav | Cleaner cards & SEO | Inconsistent if half-applied | Derive everything from body (kept as fallback) |
| M5 | Define design tokens | Fill design/brand-tokens.md + site/src/styles |
Placeholder today | Real visual identity | Design bikeshedding | Use a theme’s defaults (fallback for v1) |
| M6 | Add build validation | link/frontmatter/Mermaid checks in CI | Reduce manual-upkeep debt (R8) | Broken links caught pre-deploy | CI time | Manual checks (status quo) |
| M7 | .gitignore additions |
ignore site/node_modules, site/dist, .astro |
Keep repo clean | Standard hygiene | None | — |
Disruption assessment: M1–M3, M6–M7 touch only the new site/ dir and (M7) the existing .gitignore (a
one-line additive edit at implementation time, not now). M4–M5 are optional and incremental. No content
file is moved, renamed, or rewritten.
5. User Experience
Homepage (/)
A confident landing that answers “what is this ecosystem?” in 10 seconds, then routes deeper. Sections:
hero (the vision one-liner), the layered architecture diagram (interactive), quick-links to the two primary
registries (Capabilities, Repos), current phase/status, and “start here” cards (Overview, Operating Model,
Governance). Sourced from portfolio-overview.md + index.md — no new copy invented.
Navigation
Persistent header (primary sections) + collapsible left sidebar (section tree) + right TOC + breadcrumbs +
search (/). Mobile: header collapses to a menu; sidebar becomes a drawer.
Page types & their experience
| Page | Experience |
|---|---|
| Architecture pages | Long-form + prominent, theme-aware Mermaid; a “diagram index” for the multi-view pages (intelligence-platform, system-of-systems) |
| Capability pages | Header with StatusBadge + owning/consuming repo chips; the 4-view diagrams (Website Assessment) as tabbed or sequential sections |
| Capability Registry | Interactive filterable grid of CapabilityCards (filter by maturity/layer/owner) |
| Repository pages | RepositoryCard header (lifecycle, maturity, languages, tech badges) + digest body |
| Repos Registry | Filterable RepositoryCard grid + a table view toggle |
| Venture pages | VentureCard header + member-repo links + system-map diagram |
| Governance pages | Decision trees rendered as Mermaid; the Decision Matrix as a styled table with anchor links |
| Glossary | Searchable term list (jump-to-letter); each term shows owner/related/first-class; links to concept pages |
| Operating Model | Lifecycle diagrams front-and-centre; activity-type legend (human/AI/automated/future) as a reusable Legend component |
| ADRs | ADRSummary header (status badge, supersedes/superseded-by links) + body; a decisions timeline |
How users move through the site
graph LR
HOME[Home] --> OV[Overview]
HOME --> SEARCH[Search]
OV --> CAP[Capability Registry] --> CAPX[Capability page] --> REPO[Repo page]
OV --> ARCH[Architecture] --> DIAG[Dependency map] --> REPO
REPO --> ADR[Related ADRs]
ANY[Any page] --> GLOSS[Glossary term]
ANY --> SEARCH
Three entry patterns: browse (nav/sidebar), search (Pagefind, faceted), and follow relationships (cards, related links, diagram nodes → pages).
6. Design System
Fill the existing design/brand-tokens.md placeholder and encode tokens in site/src/styles. The visual
language is technical, editorial, and calm — content-first, high signal-to-noise.
Reference characteristics (adopted, not copied)
- Stripe — restrained colour, confident typographic hierarchy, generous whitespace, crisp tables.
- Vercel — high-contrast minimalism, excellent dark mode, tight card grids.
- Cloudflare Docs — dense-but-navigable docs IA, strong sidebar/TOC, code/diagram legibility.
- Microsoft Learn — structured metadata strips, progressive disclosure, accessible components. We adopt: typographic hierarchy, whitespace discipline, dark-mode-first contrast, metadata strips, and diagram legibility — not any specific implementation or brand look.
Typography
- A clean humanist sans for UI/headings (e.g. Inter/IBM Plex Sans class) and a legible body face; a mono for code/IDs/slugs. Self-hosted (no external font fetch, aligns with static/privacy goals).
- Modular scale (~1.2), long-form measure ≤ 72ch, clear H1–H4 rhythm.
Colour strategy
- Neutral-dominant palette with one brand accent + semantic status colours mapped to the portal’s own vocabulary: ✅ operational (green), 🔶 partial/early (amber), ⏳ planned (grey-blue), ❌/risk (red), proposed (violet). These already exist as emoji markers in content — the design formalises them.
- WCAG-checked (see Section 9); accent used sparingly for links/CTAs/active-nav.
Spacing, cards, navigation, responsiveness
- 4/8px spacing scale; generous section spacing; sticky header + sidebar.
- Cards are the core unit (capability/repo/venture/ADR) — consistent padding, badge row, title, one-line summary, footer links.
- Responsive breakpoints: sidebar drawer < 1024px; single-column < 768px; tables/diagrams scroll horizontally in their own container (never break the page).
Diagrams
- Mermaid theme variables bound to design tokens, with two variants (light/dark) that switch with the site theme; captions + accessible descriptions; max-width with horizontal scroll.
Dark/light mode
- Dark-mode-first, both fully supported; respect
prefers-color-scheme; a toggle persists choice; Mermaid re-renders on switch. (Starlight provides this; bespoke Astro must implement it.)
Accessibility (design-level)
- AA contrast for body & UI; visible focus rings; skip-to-content; semantic landmarks; reduced-motion honoured. Full validation in Section 9.
7. Components
| Component | Responsibility | Data source |
|---|---|---|
| CapabilityCard | Summarise a capability: name, one-liner, maturity badge, owning/consuming chips, link | capability frontmatter |
| RepositoryCard | Summarise a repo: name, lifecycle + maturity badges, layer, tech badges, link | repo frontmatter |
| VentureCard | Summarise a venture/system: name, lifecycle, member-repo count, layer | venture frontmatter |
| ArchitectureDiagram | Render a Mermaid block: theme-aware, caption, a11y desc, scroll container, “copy source” | ```mermaid blocks |
| StatusBadge | Map status/maturity/lifecycle → coloured pill (operational/partial/planned/…) | frontmatter fields |
| TechnologyBadge | Small labelled chip for a technology (Astro, Supabase, Cloudflare…) | frontmatter/Technologies |
| PrincipleCard | Numbered principle: title, source citation, “ecosystem application” | principles page |
| ADRSummary | ADR header: number, title, status badge, date, supersedes/superseded-by | ADR frontmatter |
| Timeline | Ordered events (ADR history; portal phases A–G; roadmap) | changelog/decisions |
| RelationshipGraph | Interactive dependency/capability graph (nodes → pages) — optional React island over the Mermaid data | dependency map / frontmatter relationships |
| Legend | Explain the ✅/🔶/⏳/❌ and human/AI/automated markers | static |
| PageInfo | Metadata strip: type, status, last_reviewed, owner, layer | frontmatter |
| Breadcrumbs / TOC / SidebarNav / SearchModal | Standard doc chrome | derived / Pagefind |
| Callout | Note/warning/recommendation blocks (map the portal’s > blockquotes + emoji) |
markdown |
Components are presentation-only and derive from existing frontmatter/content — none require new
content. Most are static; only RelationshipGraph and SearchModal are interactive islands (React/Preact or
vanilla), used because they are genuinely better interactive.
8. Implementation Roadmap
Incremental; the site is deployable and useful from Phase 1 onward.
| Phase | Objective | Deliverables | Est. effort | Dependencies | Risks |
|---|---|---|---|---|---|
| G1 — Skeleton & content pipeline | Astro (Starlight) app renders all markdown in place | site/ project; glob loaders; schemas mirroring frontmatter; link-rewrite; routes for every page; deploy to Cloudflare Pages (preview) |
~2–3 days | Approval; Node toolchain | Link-rewrite edge cases; loader paths |
| G2 — Navigation & search | Full nav + working search | Header/sidebar/TOC/breadcrumbs from IA + folders; Pagefind search with filters | ~1–2 days | G1 | Sidebar ordering without sidebar frontmatter |
| G3 — Mermaid & diagrams | All 60 diagrams render, theme-aware | ArchitectureDiagram component; dark/light Mermaid; scroll containers; quadrantChart verified |
~1–2 days | G1 | quadrantChart support; perf on diagram-heavy pages |
| G4 — Design system & components | Target visual design + cards/badges | Tokens (fill brand-tokens.md); typography/colour/spacing; CapabilityCard/RepositoryCard/VentureCard/StatusBadge/TechBadge/ADRSummary/PageInfo |
~3–5 days | G1–G3 | Design scope creep |
| G5 — Interactive registries | Filterable Capability/Repo registries | Registry pages with filter/sort; table/grid toggle; Timeline | ~2–3 days | G4 | Island complexity |
| G6 — Metadata, SEO, validation, polish | Production quality | sitemap/robots/OG; a11y pass; Lighthouse; CI validation (links/frontmatter/Mermaid); optional OG images; optional RelationshipGraph | ~2–4 days | G1–G5 | A11y/perf fixes |
Sequencing rule: the site stays functional after each phase (G1 already renders everything; later phases enhance). Effort is indicative for a single implementer; each phase ends with a review gate per the portal’s own Architecture Review Lifecycle.
9. Validation Strategy
| Dimension | How success is verified |
|---|---|
| Link validation | Build fails on broken internal links; external-link check in CI; parity check of routes vs llms.txt. Reuse the existing link-check discipline (0 broken links today). |
| Mermaid rendering | Automated check that every ```mermaid block renders without error (including quadrantChart); visual spot-check in light & dark. |
| Search | Pagefind index built; smoke tests for known queries (e.g. “Website Assessment”, “ADR 0005”); filters return correct sets. |
| Metadata | Every page has <title> + description + canonical + OG; sitemap complete; PageInfo shows frontmatter. |
| Responsiveness | Manual + automated viewport checks (320/768/1024/1440); no horizontal page scroll; diagrams/tables scroll in-container. |
| Accessibility | axe/Pa11y in CI; AA contrast; keyboard nav; focus visible; skip-link; landmarks; reduced-motion; diagram alt text. |
| Performance | Lighthouse ≥ 95 perf/SEO/best-practices on key pages; minimal JS; self-hosted fonts; image sizing. |
| Deployment | Cloudflare Pages preview per PR; production build reproducible; rollback = redeploy previous. |
| Maintainability | Adding a markdown page requires zero site code (auto-discovered); CI catches drift; docs for the build in site/README. |
10. Risks and Recommendations
| Type | Risk | Mitigation |
|---|---|---|
| Architectural | Site logic drifts from content conventions (frontmatter/regions), breaking auto-generation | Schema mirrors frontmatter with all-optional fields; CI validates frontmatter; document the contract in site/README |
| Architectural | Coupling the site to exact folder paths (loaders) breaks if content moves | Centralise paths in content.config.ts; a moved folder is a deliberate, reviewed change |
| Implementation | Markdown .md links don’t resolve as routes |
Build-time link-rewrite with a tested edge-case suite (anchors, README indices, cross-section) |
| Implementation | 60 Mermaid diagrams: perf / theme / quadrantChart |
Client-side theme-aware render first; measure; selectively pre-render; verify quadrantChart in G3 |
| Implementation | Starlight’s layout constrains the target design | Prototype the homepage + a capability page in G1/G4; fall back to bespoke Astro only if a real constraint is hit |
| Content | Missing description weakens SEO/cards |
Derive from first paragraph as fallback; add description opportunistically (never bulk-rewrite) |
| Content | Two glossaries confuse users | Present the authoritative one prominently; label docs/glossary.md as portal-maintenance scope (already noted in-content) |
| Maintainability | Node deps / build add surface to a markdown repo | Isolate in site/; pin versions; .gitignore build artefacts; keep the site deletable without content impact |
| Governance | The site could become a second source of truth | Enforce markdown = source of truth; the site never stores content; this is a Documentation Governance invariant |
Top recommendations
- Adopt Astro Starlight as the base (fastest path to nav/search/theming/a11y); keep bespoke Astro as the fallback.
- Keep all content in place; load via Astro 5 glob loaders — the plan’s cornerstone.
- Client-side, theme-aware Mermaid first; optimise later.
- Isolate everything in
site/; the only pre-implementation edit ever needed is one additive.gitignoreline (deferred to implementation). - Add CI validation (links/frontmatter/Mermaid/a11y) to convert manual upkeep (R8) into automated guardrails.
- Formalise the design tokens into the placeholder
design/brand-tokens.mdas the first design act.
Alignment with existing portal work (built upon, not duplicated)
This plan consumes — and does not replace — the Repository Registry, Capability Registry, Portfolio Overview, Architecture Principles, Operating Model, Governance, the ADRs, Architecture Review, Capability Reuse Map, System Dependency Maps, the Information Architecture, and all 60 Mermaid diagrams. The website renders this knowledge; the markdown remains authoritative.
Post-approval next steps (NOT done in Phase G)
On approval: record an ADR (e.g. “Adopt Astro/Starlight website as the portal presentation layer”), add the
site/ project (Roadmap G1), and wire a “Website” entry into navigation and the changelog. None of these were
performed in this planning phase.
Phase G deliverable — planning only. One new file added (docs/website-implementation-plan.md); no existing
file modified, moved, renamed, or deleted; no code generated; no content rewritten.