---
path: /welcome/domains
surface: customer
domain: onboarding-public
auth: anon
source: apps/oshun/web/src/app/welcome/domains/page.tsx
status: walked + e2e-covered
last_walked:
  '2026-07-01 by Codex (welcome-marketing.spec.ts covers full six-domain
  catalogue order, current beta badges, anchor jumps, per-domain signup and
  signin CTA hrefs plus public-auth-funnel telemetry for every domain, footer
  auth/nav links, mobile standalone SmartAppBanner/touch targets/no overflow,
  real service-worker offline replay, reduced-motion runtime state, metadata
  preview assets, and axe-gated contrast after domain landing CSS fixes),
  against commit HEAD'
  '2026-05-29 automated runtime walk (Playwright headless) — render, /v1 data
  (2xx), console/page-errors, expected content, screenshot verified; live
  screen-reader, touch, offline, and telemetry-delivery checks pending a manual
  AT pass. Evidence: WALKTHROUGH/results/runtime-sweep-2026-05-29.md'
---

# Welcome · Domain landings

## Purpose

Detailed marketing content for each of the six domains (Tara, Veritas, Nyx,
Arete, Nisaba, Metis) with feature showcases, capability lists, stats, use-case
lists, and per-domain CTAs into the sign-up flow.

## Entry points

- Footer "Domains" or "Tara/Veritas/Nyx/Arete/Nisaba/Metis" anchor links
- Marketing campaign links targeting a specific domain anchor
  (`/welcome/domains#tara`)
- Outbound product pages on the marketing site
- Direct URL / bookmark — yes (anon)

## Layout regions

`page.tsx` is a server component built on `welcomePage` CSS classes (shared with
`/welcome` and `/welcome/download`). Renders `<SmartAppBanner />` then iterates
`DOMAIN_CONTENT` (a hard-coded array of six domain landing definitions, one per
`WebNavigableDomainId`).

- **SmartAppBanner**: mobile install nudge
- **welcomeHero**: eyebrow "OSHUN domains", h1 "Six domains, one practice",
  subtitle paragraph
- **Six `.domainLandingSection`** stacked vertically, each with:
  - `.domainLandingBadge`: accent dot (from
    `getDomainMetadata(id).accentColor`), domain label, and a Beta pill when
    `meta.availability === 'beta'`
  - `.domainLandingHeadline` (h2)
  - `.domainLandingDescription`
  - `.domainLandingStats`: four `<article>` stat cards with value + label
  - `.domainLandingFeatures`: four feature cards with `<h3>` + body
  - `.domainLandingUseCases`: bullet list of 4 use cases
  - `.domainLandingCta` (data-attr `data-welcome-domains-actions={id}`): primary
    "Create an account and open <Label>" + secondary "I already have access"
- **welcomeFooterCta** ("Better together"): cross-domain CTA with two buttons
  (signup / signin)
- **welcomeFooter**: brand mark, nav links, anchor links to each `#<domain>`,
  copyright with `new Date().getFullYear()`

## States

- [x] **Loading** — N/A; static server component
- [x] **Default** — all six sections render in `DOMAIN_CONTENT` order (tara,
      veritas, nyx, arete, nisaba, metis)
- [x] **Beta badge visible** — for any domain where
      `getDomainMetadata(id).availability === 'beta'`; current walked state: Nyx
      and Nisaba render `Beta`.
- [x] **Anchor scroll** — landing on `/welcome/domains#tara` and clicking the
      footer `#metis` link both bring the target section into view
      (`id={domain.id}` set on each `<section>`)
- [x] **Standalone PWA / mobile** — iPhone standalone launch shows the
      SmartAppBanner, preserves every CTA as a 44px+ touch target, and avoids
      horizontal overflow
- [x] **Reduced motion** — Playwright verifies the runtime media preference is
      `prefers-reduced-motion: reduce` while the static page remains readable
- [x] **Offline** — real `sw.js` warms and replays `/welcome/domains` while the
      browser context is offline; no generic offline fallback header is used

## Interactions

### SmartAppBanner

- [x] **Banner row** — mobile iOS install nudge is visible with Open and Dismiss
      controls

### Per-domain CTAs

For each of the six sections:

- [x] **"Create an account and open <Domain Label>"** (link, primary,
      `data-welcome-domains-cta={id}`)
  - Function: navigates to
    `buildPublicAuthEntryPath({ mode: 'signup', redirectPath: buildWebDomainRoutePath(id, { origin: 'home' }), entrySource: 'welcome-domains' })`
  - Telemetry: `public_auth_funnel_cta_clicked` fires for every domain with
    `surface: 'welcome_domains'`, `step: 'domains_signup'`, the matching
    `targetDomain`, `targetPath`, and href.
- [x] **"I already have access"** (link, secondary)
  - Function: navigates to
    `buildPublicAuthEntryPath({ mode: 'signin', redirectPath: ... })`
  - Telemetry: `public_auth_funnel_cta_clicked` fires for every domain with
    `step: 'domains_signin'` and the same domain target contract.

### "Better together" footer CTA

- [x] **"Create your account"** (link, primary)
  - Function:
    `buildPublicAuthEntryPath({ mode: 'signup', entrySource: 'welcome-domains' })`
- [x] **"Sign in to the shell"** (link, secondary)
  - Function: signin with `redirectPath: '/'`

### Footer nav

- [x] **"Home" link** — `/welcome`
- [x] **"Dashboard" link** —
      `buildPublicAuthEntryPath(... signin,     redirect '/' ...)`
- [x] **Six anchor links** (`#tara` etc.) — in-page scroll; `#metis` is verified
      after footer click and every footer anchor href matches a rendered section
      id

## Data & contracts

- **Reads**:
  - `getDomainMetadata(id)` from `@oshun/domain-registry` (accent colour, label,
    availability)
  - Domain content hard-coded in `DOMAIN_CONTENT` array inside `page.tsx`
- **Writes**: none directly; CTAs hand off to the auth flow
- **Caching**: SSR static; SW cache
- **Auth**: anon (in middleware `PUBLIC_PREFIXES`)
- **Telemetry**: CTAs carry `data-welcome-domains-cta` /
  `data-welcome-domains-actions` attributes; `PublicAuthFunnelLink` fires
  `public_auth_funnel_cta_clicked` on click

## Cross-references

- Sibling public surfaces: [`welcome.md`](./welcome.md),
  [`welcome-download.md`](./welcome-download.md), [`landing.md`](./landing.md)
- Per-domain routes (post-sign-in):
  - [`../03-tara/tara.md`](../03-tara/tara.md)
  - `../04-arete/`, `../05-veritas/`, `../06-nyx/`, `../07-nisaba/`,
    `../08-metis/`
- Cross-route navigation:
  [`d-domain-path.md`](../02-home-discovery/d-domain-path.md),
  [`domains-domainId.md`](../02-home-discovery/domains-domainId.md)
- Component sources:
  - `apps/oshun/web/src/components/SmartAppBanner.tsx`
  - `apps/oshun/web/src/navigation/routes` (`buildWebDomainRoutePath`)
  - `apps/oshun/web/src/lib/public-entry` (`buildPublicAuthEntryPath`)
  - `libs/shared/domain-registry` (`getDomainMetadata`)
- E2E:
  [`apps/oshun/web/e2e/welcome-marketing.spec.ts`](../../../apps/oshun/web/e2e/welcome-marketing.spec.ts)
  covers the route-level catalogue, anchor, auth handoff, telemetry, mobile
  standalone, offline replay, metadata, and axe-gated accessibility contracts

## Open questions / known gaps

- [x] Confirm telemetry firing on `data-welcome-domains-cta` links —
      `PublicAuthFunnelLink` dispatches `trackPublicAuthFunnelCtaClicked`, and
      `welcome-marketing.spec.ts` verifies every domain signup/signin CTA plus
      footer auth CTAs.
- [ ] Hard-coded `DOMAIN_CONTENT` array — verify whether marketing copy is
      expected to be data-driven (CMS) or stays in the page source
- [ ] Metis description references "the fuller learner experience unlocking
      behind launch-readiness gates" — confirm against current Metis launch
      state in `V1/features.md#metis`
- [x] Six anchor links in footer; each href matches a rendered section id and
      footer `#metis` scrolls the matching section into view.
