Brand Schema
Brand YAML files configure white-label learning sites. Each brand gets its own domain, theme, landing page, pricing, and SEO — learners never see Graspful.
Top-level structure
brand: # required — identity and domain
id: string
name: string
domain: string
tagline: string
orgSlug: string
theme: # optional — color preset and radius
preset: string
radius: string
landing: # required — landing page sections
hero: ...
features: ...
howItWorks: ...
faq: ...
bottomCta: ...
seo: # optional — meta tags and keywords
title: string
description: string
keywords: [string]
pricing: # optional — Stripe pricing config
monthly: number
yearly: number
currency: string
trialDays: number
contentScope: # optional — which courses this brand serves
courseIds: [string]brand
Core identity for the white-label site.
| Field | Type | Description |
|---|---|---|
| id* | string | Kebab-case identifier for the brand |
| name* | string | Display name (shown in nav, footer, and SEO) |
| domain* | string | Custom domain (e.g., "aws-prep.graspful.com" or "prep.yourdomain.com") |
| tagline* | string | Short tagline shown in the footer |
| logoUrl | string | Path to logo image (e.g., /images/logo.svg) |
| faviconUrl | string | Path to favicon |
| ogImageUrl | string | Open Graph image for social sharing |
| orgSlug* | string | Organization slug that owns this brand |
theme
Use a preset for quick theming, or specify individual HSL colors for light and dark modes.
| Field | Type | Description |
|---|---|---|
| preset | enum | Color preset (see list below) |
| radius | string | Border radius (default: "0.5rem") |
| light | object | Custom HSL colors for light mode (overrides preset) |
| dark | object | Custom HSL colors for dark mode (overrides preset) |
Available presets
Custom HSL colors
When not using a preset, specify individual colors in light and/or dark objects. Values use HSL format: "220 90% 50%".
Available color keys: background, foreground, card, cardForeground, popover, popoverForeground, primary, primaryForeground, secondary, secondaryForeground, muted, mutedForeground, accent, accentForeground, destructive, destructiveForeground, border, input, ring.
landing
Configuration for the auto-generated landing page.
landing.hero
| Field | Type | Description |
|---|---|---|
| headline* | string | Main headline text |
| subheadline* | string | Supporting text below the headline |
| ctaText* | string | Call-to-action button text (e.g., "Start Learning") |
landing.features
| Field | Type | Description |
|---|---|---|
| heading* | string | Section heading |
| subheading | string | Optional subheading |
| items* | array | Array of { title, description, icon, wide? } — at least 1 item |
landing.howItWorks
| Field | Type | Description |
|---|---|---|
| heading* | string | Section heading |
| items* | array | Array of { title, description } — at least 1 item |
landing.faq
| Field | Type | Description |
|---|---|---|
| (array) | array | Array of { question, answer } pairs. Defaults to empty. |
landing.bottomCta
| Field | Type | Description |
|---|---|---|
| headline* | string | Bottom CTA headline |
| subheadline | string | Optional supporting text |
seo
| Field | Type | Description |
|---|---|---|
| title* | string | Page title for meta tag and browser tab |
| description* | string | Meta description for search engines |
| keywords | string[] | Meta keywords array |
pricing
Stripe pricing configuration. Set monthly to 0 for free courses.
| Field | Type | Description |
|---|---|---|
| monthly* | number | Monthly price in base currency units (0 = free) |
| yearly | number | Optional yearly price (for annual discount) |
| currency | string | Currency code (default: "usd") |
| trialDays | number | Free trial period in days (default: 0) |
contentScope
Controls which courses appear under this brand.
| Field | Type | Description |
|---|---|---|
| courseIds | string[] | Array of course IDs to include. Empty = all courses in the org. |
Example brand YAML
brand:
id: aws-prep
name: AWS Prep Academy
domain: aws-prep.graspful.com
tagline: "Pass the AWS exam on your first try."
logoUrl: /images/logo-aws-prep.svg
faviconUrl: /favicon.ico
ogImageUrl: /images/og-aws-prep.png
orgSlug: my-org
theme:
preset: indigo
radius: "0.5rem"
landing:
hero:
headline: "Master AWS. Pass the Exam."
subheadline: "Adaptive learning that focuses on what you don't know yet."
ctaText: "Start Studying"
features:
heading: "Why AWS Prep Academy?"
subheading: "Built for the SAA-C03 exam."
items:
- title: "Adaptive Learning"
description: "The engine skips what you already know."
icon: Brain
- title: "Spaced Repetition"
description: "Review at optimal intervals for lasting memory."
icon: Clock
- title: "Audio Lessons"
description: "Study on your commute with AI-generated audio."
icon: Headphones
howItWorks:
heading: "How It Works"
items:
- title: "Take a diagnostic"
description: "We assess your current AWS knowledge in 15 minutes."
- title: "Study adaptively"
description: "Focus on gaps. Skip what you know."
- title: "Pass the exam"
description: "Prove mastery through progressive challenges."
faq:
- question: "How long does it take to prepare?"
answer: "Most learners are exam-ready in 4-6 weeks."
- question: "Is the content up to date?"
answer: "Yes — aligned with the current SAA-C03 exam guide."
bottomCta:
headline: "Ready to pass the AWS exam?"
subheadline: "Start your adaptive study plan today."
seo:
title: "AWS Prep Academy — Adaptive SAA-C03 Exam Prep"
description: "Pass the AWS Solutions Architect exam with adaptive learning and spaced repetition."
keywords:
- aws certification
- saa-c03 exam prep
- aws solutions architect
pricing:
monthly: 29
yearly: 249
currency: usd
trialDays: 7
contentScope:
courseIds:
- aws-saa-c03