L&D platform page standard (The Forge)

Purpose: Define how internal L&D courses present on the Brainforge Platform when a track is implemented as app routes—without prescribing a visual redesign of existing pages. The live reference is the Quickstart track, implemented under the foundation slug: overview UI, module redirect behavior, and lesson layout.

Audience: L&D authors, platform engineers, and anyone running ld-course-builder Mode D (wire course to platform).

Related: course-authoring-playbook.md (vault authoring) · NORTH-STARS.md (pedagogy) · Quickstart implementation under apps/platform/src/app/(main)/learning/foundation/

Last updated: 2026-04-17


1. Principles

  1. No deviation from the Quickstart UI pattern for new tracks unless product explicitly approves a redesign. Reuse the same component hierarchy, spacing, and layout proportions as apps/platform/src/app/(main)/learning/foundation/FoundationOverviewClient.tsx (overview) and apps/platform/src/app/(main)/learning/foundation/[slug]/[lessonSlug]/page.tsx (lesson page).
  2. Vault remains source of truth for markdown. Platform code maps slugs to files; authors edit README.md and lesson-*.md in the vault tree.
  3. Module “landing” is not a separate bespoke page today: the module route is a redirect entry point to the first lesson, and the intro lesson renders module copy from modules/{NN}-{slug}/README.md (see below).

2. Course overview page standard

The course overview is custom per track in code (Quickstart uses FoundationOverviewClient). Layout intent:

RegionContent
BreadcrumbsTrail to internal Learning home → track name (current segment is the track, not the lesson).
HeroCourse title, short description, primary CTA consistent with Quickstart.
Stat chipse.g. audience, duration, level — same chip idiom as Quickstart.
“What you’ll learn”Bulleted outcomes (can mirror course README.md).
Main columnsLeft: curriculum timeline by phase (phase badge, description, module list with duration and status). Right (sticky on large screens): progress, track details, and all modules list mirroring Quickstart’s right rail.
ResponsiveOn small viewports, columns stack; sticky behavior matches Quickstart (see QA).

When a new track is wired to the Platform, it must also be registered in the shared learning navigation surfaces:

  • apps/platform/src/components/Sidebar.tsx under Learning & Development
  • apps/platform/src/app/(main)/learning/LearningAreaSubnav.tsx if the track should appear in the top-level learning area tabs

Wireframe (course overview)

[breadcrumbs: Learning & Development > {Track name}]

{course title}
{short description / hero copy}

[ stat chip: audience ] [ stat chip: duration ] [ stat chip: type / level ]

What you’ll learn
- {outcome 1}
- {outcome 2}
…

+-----------------------------------------------------------------------+
| [left column]                          | [right column — sticky lg+] |
| PHASE 1 — {label}                      | Progress                    |
| {phase description}                    | {bar / % if applicable}     |
|   M1 — {module}  [Start here]  30 min  | Details                     |
|   M2 — {module}              30 min    | {audience, time, …}        |
| PHASE 2 — {label}                      | All modules                 |
| …                                      | {compact list / links}      |
+-----------------------------------------------------------------------+

Do not invent a new overview anatomy for internal tracks unless explicitly chartered; clone the Quickstart structure and swap data.


3. Module page standard

RuleDetail
Route shape{trackBase}/{moduleSlug} — e.g. /learning/foundation/m1-cursor-github-setup.
BehaviorHTTP redirect to the first lesson for that module (see apps/platform/src/app/(main)/learning/foundation/[slug]/page.tsx).
Canonical UXThe intro lesson page is the module “home.” There is no separate module-only template in production today.
Intro body sourcemodules/{NN}-{module-slug}/README.md. The lesson renderer loads the module README for the intro lesson so authors maintain one file (see lesson page implementation: readFoundationModuleReadme + intro branch).
FutureA dedicated module overview page is out of scope unless leadership decides otherwise; this doc should be updated if that changes.

Wireframe (module route — user never sees a standalone template)

GET {trackBase}/{moduleSlug}
  -> 302/redirect  ->  {trackBase}/{moduleSlug}/{firstLessonSlug}

The rendered first screen matches the lesson page wireframe (section 4) with intro content from the module README.


4. Lesson page standard

Stable pattern used by Quickstart (breadcrumbs, optional previous link, optional video, markdown body, sticky sidebar).

BlockBehavior
BreadcrumbsSame component/trail as overview (FoundationTrackBreadcrumbs for Quickstart).
Optional previous linkRow linking to the previous lesson (label + href from spine navigation).
Optional videoIf the lesson body contains a Zoom Clips URL, the first such link is extracted and rendered in LearningLessonVideoEmbed; that line is stripped from markdown (see extractFirstZoomClipsUrl / stripFirstZoomClipLine).
Markdown bodyRendered in the shared markdown component with vault link resolution (CertificationsMarkdown + knowledge link root).
Intro lesson titleFor the intro lesson, the module title from nav may be passed as a leading title; body comes from module README.
Sticky sidebarRight column (sticky on lg+): module progress, lesson list for the course, Next / end-of-module behavior (LearningLessonSidebar).
LayoutMain column + sidebar; flexDirection column on xs, row on lg (matches Quickstart).

Wireframe (lesson page)

[breadcrumbs]

[ optional: < Previous — {label} ]

[ optional: video embed — Zoom Clip ]

{lesson markdown content card}

+----------------------------+------------------+
| Main column                | Sidebar (sticky) |
|                            | Progress         |
|                            | Course content   |
|                            | {modules/lessons}
|                            | Next → …         |
+----------------------------+------------------+

5. Required platform metadata (typed config contract)

Each course that gets a platform implementation should have a small TypeScript contract (constants + types) colocated with that track’s nav—patterned after Quickstart, not necessarily one global file for all future tracks.

5.1 Suggested types

Authors and Mode D use this as the checklist of fields to fill. Engineers map them to the overview client and lesson spine.

/** Phase / group for the curriculum timeline (Quickstart-style). */
export type LdCoursePhaseType = "required" | "optional";
 
export interface LdPlatformModuleRef {
  /** Stable id for routes and progress, e.g. m1-cursor-github-setup */
  id: string;
  /** Display label, e.g. M1 — Cursor + GitHub Setup */
  label: string;
  /** Shown in chips / timeline, e.g. 30 min */
  duration: string;
  /** Optional: highlight first module */
  isStartHere?: boolean;
}
 
export interface LdPlatformPhase {
  id: string;
  badge: string;
  label: string;
  description: string;
  type: LdCoursePhaseType;
  modules: LdPlatformModuleRef[];
}
 
/**
 * Typed course config for a single L&D track on the platform.
 * Keep in sync with vault: programs/courses/{courseSlug}/
 */
export interface LdCoursePlatformConfig {
  /** Kebab-case folder under knowledge/.../programs/courses/ */
  courseSlug: string;
  /** Base path for this track’s routes (see section 7 for path consistency) */
  routeBase: string;
  /** Full course title for hero / metadata */
  title: string;
  /** Short name for breadcrumbs / nav */
  shortTitleForBreadcrumbs: string;
  audience: string;
  /** e.g. ~4 hours */
  durationSummary: string;
  /** e.g. Self-paced, Async-first */
  courseTypeLabel?: string;
  /** Ordered phases for the left column */
  phases: LdPlatformPhase[];
  /** Module order as slugs — must match vault module folders and nav builders */
  moduleOrder: string[];
  /** Map module id -> duration string (chips / timeline) */
  moduleDurations: Record<string, string>;
  /** Bullets for “What you’ll learn” on overview */
  whatYoullLearn: string[];
  /** Optional link to certification rubric (vault URL or app route) */
  certificationRubricHref?: string;
}

5.2 Engineering notes

  • Lesson spine (prev/next, first lesson per module) should be derived from the same ordered data as the vault—typically a generateStaticParams companion and a navigation builder (Quickstart: foundationLessonNavigation.ts).
  • Slug lists must stay consistent: moduleOrder, per-module lesson files, and redirect targets.

6. Authoring-to-platform mapping

Vault artifactPlatform use
Course README.mdOverview copy: title, description, outcomes, “what you’ll learn,” duration, audience.
Module README.mdIntro lesson body for that module (first lesson in the module).
lesson-{N}-{slug}.mdSubsequent lesson bodies; first Zoom Clips link → embedded video.
certification-rubric.mdLinked from overview or sidebar when certificationRubricHref (or equivalent) is set.

Quickstart additionally maps legacy monolithic module files in some code paths; new courses should standardize on per-lesson files + module README per the course authoring playbook.


7. QA checklist (before shipping a new track)

  • Route shape matches agreed routeBase and {module}/{lesson} segments.
  • Breadcrumbs match the track name and internal Learning entry link used elsewhere for that track.
  • Platform sidebar includes the track in apps/platform/src/components/Sidebar.tsx.
  • Learning area subnav includes the track in apps/platform/src/app/(main)/learning/LearningAreaSubnav.tsx when appropriate.
  • Mobile: columns stack; no horizontal overflow on small breakpoints.
  • Sticky sidebar: sticks on lg+, scrolls with content on xs/sm.
  • Markdown links resolve (vault GitHub links, relative paths per learningMarkdownLinks pattern).
  • Prev / next and last lesson in module / course match the spine.
  • Module route redirects to the first lesson URL.
  • Intro lesson shows module README content when present.
  • No unintended changes to Quickstart’s own components unless shared refactors are explicitly in scope.

8. Route base paths (documentation note)

The learning tracks should use the public /learning/... route family consistently.

LocationPath pattern (example)
foundationNav.tsFOUNDATION_BASE/learning/foundation
Track breadcrumbs first link/learning/courses
Track overview / lesson routes/learning/{trackId}/...

Guidance: New tracks should follow the same public route shape unless there is an explicit migration or compatibility requirement.


9. Reference implementation (Quickstart)

ConcernPrimary files
Overview UIapps/platform/src/app/(main)/learning/foundation/FoundationOverviewClient.tsx
Module redirectapps/platform/src/app/(main)/learning/foundation/[slug]/page.tsx
Lesson pageapps/platform/src/app/(main)/learning/foundation/[slug]/[lessonSlug]/page.tsx
Nav + slugs + markdown path mapsapps/platform/src/lib/foundationNav.ts
Lesson ordering / prev-nextapps/platform/src/lib/foundationLessonNavigation.ts

10. Workflow pointer

To turn authored vault content into platform routes without changing Quickstart’s existing UI, use ld-course-builder Mode D — Wire course to platform (see .cursor/skills/ld-course-builder/SKILL.md), which reads this document and scaffolds config + route wiring patterned after Quickstart.