🏠 Guided — Homepage Design¶
Last updated: 8 May 2026 (v2 — embedded real PracticeQuiz + tone reframe) File:
src/pages/index.astroURL: aguidetocloud.com/guided/ Latest commits:0e128e7(v2),0ca214c(v1 reframe)
Purpose¶
The homepage is the conversion funnel entry point. It must:
- Communicate "$9 per cert, not $79" immediately (price-as-philosophy hook)
- Show credibility via tone honesty (no fluff, no upsells, founder voice)
- Let users taste the real product (embedded PracticeQuiz with 20 free AZ-900 questions)
- Let users find their cert quickly (search + dropdown filters)
- Convert browsers without aggressive CTAs (informational pricing > pushy upsells)
Section Layout (top → bottom — 9 sections)¶
1. Hero (single-column, centered)¶
Pivoted from V1's 2-column layout (text + interactive previews on right) to single-column centered because section 2 (embedded quiz) replaces what the right column did, and single-column delivers more "statement" weight.
| Element | Content | Voice |
|---|---|---|
| Badge | study guides free forever — no account needed |
Lowercase, success-coloured pill |
| h1 | practice exams that don't gatekeep. |
Lowercase, philosophy-first |
| Pricing line | $9, not $79. free study guides forever. no signup, no account. |
Indigo accent on "$9, not $79" — names the gatekeeping price explicitly |
| Description | {N} certs across Microsoft, AWS, Cisco, CompTIA, GCP — every answer explained, why it's right and why the others aren't. |
Vendor names capitalised (proper nouns), lowercase narrative |
| Primary CTA | browse {N} certs → → #catalog |
|
| Secondary CTA | try AZ-900 free → #sample-exam-section |
Cert code uppercase |
| Trust stats | {N} certifications · {N}+ questions · {N} vendors |
All dynamic |
| Free guides badge row | {N} free study guides + chips of cert codes |
Auto-populated from studyGuideCerts.length |
2. Try the real exam, free (NEW v1 → reworked v2)¶
Big change between v1 and v2: v1 had a custom <SampleExam> component with 5 hardcoded questions and a buggy CSS focus mode (used var(--base) which doesn't exist in this design system — should have been var(--color-base)). v2 deleted SampleExam entirely and embedded the real <PracticeQuiz> component, configured for AZ-900 with the existing 20-question free tier.
Why this is better:
- Same component cert pages already use — battle-tested.
- Free tier (FREE_QUESTION_LIMIT = 20 from src/lib/access.ts) handles the cap natively.
- All 5 question types (mcq, tf, multi-select, match, ordering) work natively.
- Real focus mode (CSS overlay, already-working).
- Real explanations, real progress tracking, real exam mode.
- client:visible directive — quiz hydrates only when scrolled into view, hero stays fast.
Visual framing for "oomph":
<div class="surface-card p-3 sm:p-5 ring-1 ring-accent/15 shadow-lg" id="home-practice-wrap">
<PracticeQuiz client:visible
dataUrl={`${base}data/questions/az-900.json`}
certCode="az-900"
vendorSlug="microsoft" />
</div>
Above the quiz: a pulsing "live demo · AZ-900" badge so users know it's the real product, not marketing.
Below the quiz: "not the cert you want? browse {N} certs →" CTA back to the catalog.
3. What's inside $9 (NEW)¶
3-card row replacing v1's "Why Guided?" (which was generic).
| Card | Status | Tagline |
|---|---|---|
| study guide | free forever | every concept in plain english. flashcards. ELI5 toggle. no signup. |
| 200 questions | $9 · once | three modes: study (instant feedback), exam (timed), flashcards (SM-2 spaced). |
| exam mode | included | timed simulation, 80% pass threshold, no peeking, review at the end. |
Closing: every answer explained — why it's right and why the others aren't.
Icons: simple line SVGs (lucide-style — book, pencil, clock). No emojis, no gradients.
4. Browse by Vendor (KEPT from v1)¶
Auto-scrolling carousel of vendor cards. Each card: SVG logo + vendor name + cert count + accent left border. Click → /guided/{vendor}/.
Implementation note: track is duplicated for seamless infinite loop. prefers-reduced-motion media query disables animation.
5. Featured Certifications (KEPT)¶
Shows certs with featured: true in TOML. Max 4 cards.
6. Not Sure Where to Start? (KEPT — recommender)¶
4 cards for paths: cloud / security / AI / networking. Click sets dropdown filters and scrolls to #catalog.
7. All Certifications Catalog (KEPT, polished)¶
Search bar + 4 dropdown filters (vendor / topic / level / type). Dynamic count "Showing N certifications". Default vendor: Microsoft (rubber-duck flagged this contradicts "All Certs" framing — open issue to consider).
Cert cards:
- Card click → cert landing page (/{code}/)
- "Try Practice →" button → practice page (/{code}/practice/)
- Button uses delegated e.stopPropagation() via .cert-practice-link
8. How Guided Compares (KEPT)¶
10-row feature comparison table: Guided vs "Typical Competitor". Includes "Starting price: $9 (guides free) vs $20–$50+".
9. Why this exists (NEW — replaces "About")¶
Founder voice block in lowercase brainbar register. Lifted from FAQ #11 + reordered.
why this exists
cert prep was always overpriced. $50, $79, $99 for practice questions,
on top of an exam that already costs $165–$200.
so i built guided. free study guides. $9 practice. the same content
i'd want for myself, priced like i'd want it.
no fluff, no gatekeeping, no upsells. just the prep.
The closing line no fluff, no gatekeeping, no upsells. just the prep. deliberately echoes the BrainBar about page's no fluff, no gatekeeping, no five paragraphs of seo. just the answer. — Sush's voice as the constant across planets.
Sub-block: i'm Sutheesh — Microsoft Copilot Solution Engineer in NZ. started as an infra admin. sat every exam i could get my hands on. (Proper nouns capitalised — voice rule.) Links to YouTube + help page.
10. FAQ (KEPT, trimmed)¶
<details>-based accordion matching FAQPage JSON-LD. First item open by default.
v2 trim: removed mentions of $59 vendor pass and $149 all-access per Sush's call to de-feature tier upsells (FAQ #1 was the worst offender). FAQ #1 now uses dynamic studyGuideCerts.length count instead of inaccurate "every cert has a study guide" claim.
Voice / tone register (locked in v2)¶
| Where | Case |
|---|---|
| Hero h1 + section h2 headings | lowercase ("practice exams that don't gatekeep") |
| Founder voice / philosophy paragraphs | lowercase ("cert prep was always overpriced…") |
| Cert codes | UPPERCASE (AZ-900, AI-901, CCNA) — proper nouns |
| Vendor names | Title Case (Microsoft, AWS, CompTIA, GCP) — proper nouns |
| Product names | Title Case (Azure Fundamentals, Stripe) — proper nouns |
| Personal name | Lowercase or Capitalised contextually (i'm Sutheesh — Microsoft Copilot Solution Engineer in NZ) |
| Acronym country code | UPPERCASE (NZ) — proper noun |
The rubber-duck overcorrection in v1 lowercased proper nouns. Fixed in v2. Voice rule: "lowercase voice for founder/philosophy copy. Proper nouns / cert codes / vendor names stay capitalised." Capitalisation is grammar, not style.
Canonical tone reference: BrainBar about page (aguidetocloud-revamp/brainbar/layouts/_default/about.html).
Tier upsell de-featuring (v2)¶
Sush's call (8 May 2026): de-feature $59 vendor pass and $149 all-access from the homepage. Lead with $9 per cert only. Tier SKU deletion from Stripe / backend deferred to a separate session.
What was removed in v2:
- The "Pick a tier" 3-card pricing block (was planned, never shipped — cancelled before v1 deploy)
- FAQ #1 Vendor passes ($59) and all-access ($149) are also available. fragment
- Comparison table tier rows (none existed in V1, no change needed)
What still exists in code (intentional — for active customers / direct-link checkouts):
- Stripe products for vendor pass / all-access still functional
- Backend /api/checkout still handles productType: 'vendor' | 'all'
- Checkout-return logic in src/lib/checkout.ts still handles all 3 product types
Future session will remove the SKU code paths once Sush is ready.
SLA-protected files NOT touched in v1 / v2¶
| File | Why |
|---|---|
src/components/interactive/PracticeQuiz.tsx |
Locked. v2 EMBEDS it from homepage but does not modify it. |
src/pages/[cert]/practice.astro |
Practice page route — paid product. |
src/pages/[slug]/index.astro |
Cert landing page — paid product. |
src/pages/embed/[cert]/practice.astro |
Embed route — paid product. |
src/data/questions/*.json |
Question banks — content. |
scripts/build-question-data.mjs |
Data pipeline. |
package.json build scripts |
Pipeline trigger. |
astro.config.mjs |
Build config. |
functions/guided/api/* |
Cloudflare Pages Functions (checkout, webhook, activate, verify). |
| Cloudflare env vars / bindings | Locked per CF API DANGER ZONE. |
| Header / Footer / theme toggle / fonts / tokens | One Body Two Organs rule. |
Tests + ship gates¶
test-guided-home.cjs 18/18 pass (rewritten in v2 to test the embedded PracticeQuiz; was 28 SampleExam checks in v1)
test-guided-qa.cjs 22/26 pass PRE-EXISTING failures (Fullscreen header / Quiz Complete / Domain breakdown) — NOT v1 or v2 regressions
build 2284 pages, ~120s, clean
practice page size 32.7 KB (under 50 KB SLA limit — questions are runtime-fetched, not inlined)
homepage size ~411 KB (down from 434 KB v1; smaller because PracticeQuiz hydrates client-side)
Smoke tests (mandatory pre-push and post-deploy):
curl -sf https://www.aguidetocloud.com/guided/data/questions/az-900.json | head -c 50
# Must return JSON starting with [{"meta":
curl -sf -X POST https://www.aguidetocloud.com/guided/api/checkout -H "Content-Type: application/json" \
-d '{"productType":"cert","certCode":"az-900","vendorSlug":"microsoft"}' | head -c 50
# Must return {"url":"https://checkout.stripe.com/...
curl -sf https://www.aguidetocloud.com/guided/az-900/practice/ -o /dev/null -w "%{http_code}"
# Must return 200
Structured Data (JSON-LD)¶
| Schema | Purpose |
|---|---|
| FAQPage | Trimmed FAQ items → rich FAQ snippets in Google |
| WebSite | Site entity + SearchAction for sitelinks search box |
| Organization | Publisher info, logo, social links (YouTube channels) |
Title and description in <BaseLayout> are now dynamic:
title={`guided — ${totalCerts} certs · practice exams that don't gatekeep`}
description={`$9 per cert, not $79. Free study guides forever. ${totalCerts} certs across ${activeVendors.slice(0, 5).map(v => v.shortName).join(', ')}…`}
(Was hardcoded 13 Vendors in v0 — fixed.)
JavaScript Behavior¶
Filter system (<script is:inline data-astro-rerun>)¶
- Reads all 4
<select>dropdown values - Filters
.cert-cardelements bydata-vendor,data-category,data-level,data-tier - Also filters by search text against
data-searchattribute - Updates result count text
- Runs
applyFilters()on load (applies Microsoft default)
Practice link handler¶
- Delegated event listener on
documentfor.cert-practice-linkclicks - Calls
e.stopPropagation()to prevent card link navigation - Reads
data-hrefand navigates to practice page
Embedded PracticeQuiz¶
- Hydrated via
client:visible(IntersectionObserver) - Fetches
/guided/data/questions/az-900.jsonat runtime - Standard PracticeQuiz lifecycle: setup screen → quiz → results
- Free-tier user gets 20 questions; clicking "Unlock" initiates Stripe checkout for AZ-900 (returns to
/guided/az-900/practice/?checkout_session=…perfunctions/guided/api/checkout.ts)
Maintenance Checklist¶
When adding a new cert:
- Drop TOML in
src/content/certs/— homepage auto-updates (totalCerts, vendor counts) - No page edits needed — card appears in catalog grid
- If
featured: true, it appears in Featured section (max 4) - Vendor card count auto-increments
- Hero stat strip auto-updates
When adding a new vendor:
- Add to
src/data/vendors.ts(includinglogofield) - Add SVG logo to
public/vendors/{slug}.svg - Add vendor slug to Zod enum in
src/content.config.ts - Homepage auto-generates vendor card + dropdown option
When changing tier strategy (e.g., re-introducing $59 / $149):
- Update FAQ #1 to mention the tier
- Add a section between catalog and comparison (tier card row)
- Decide: informational links to existing pages, or homepage-direct checkout?
- Informational = safer, no new SLA failure modes
- Direct checkout = needs new homepage
handleCheckoutReturn()wiring + Playwright tests covering all 3 product types
Pre-existing test-guided-qa failures (not v1/v2 regressions)¶
After v1 ship (7 May), test-guided-qa.cjs shows 4 failures:
| Test | Status | Likely cause |
|---|---|---|
ab-100: Fullscreen header — missing |
❌ | Test pattern drift — UI text "Exit" may have changed |
ab-730: Fullscreen header — missing |
❌ | Same |
Results: Quiz Complete — missing |
❌ | Same — pattern looks for "Quiz Complete" text |
Results: Domain breakdown — missing |
❌ | Same |
These were failing before v1. Verified by checking PracticeQuiz.tsx mtime (5/3/2026 — untouched in this session). Sush flagged for a separate session to investigate test pattern drift.
Related docs¶
- Brand assets — crescent logo + lockup pack, wire-up checklist
- Pricing strategy
- Page architecture — cert/vendor/practice page structure
- Reliability architecture — 9-layer redundancy
- Voice and tone — lowercase rules, when proper nouns stay capitalised
- Zen system quickref — design tokens
- Incident log — historical bugs