# Website Data Flow (Strict) This document defines the **apps/website** data flow. Authoritative contract: [`docs/architecture/website/WEBSITE_CONTRACT.md`](docs/architecture/website/WEBSITE_CONTRACT.md:1). Website scope: - `apps/website/**` ## 1) Website role The website is a **delivery layer**. It renders truth from the API and forwards user intent to the API. ## 2) Read flow ### Server Components (RSC) ```text RSC page.tsx ↓ PageQuery ↓ API client (infra) ↓ API Transport DTO ↓ ViewData Builder (lib/builders/view-data/) ↓ Formatters (lib/display-objects/) -- [primitive output] ↓ ViewData (Plain JSON) ↓ Template ``` ### Client Components (Hydration / Interactive) ```text Client Wrapper / Component ↓ ViewData (from Props) ↓ ViewModel (lib/view-models/) -- [new ViewModel(viewData)] ↓ Display Objects (lib/display-objects/) -- [rich API] ↓ Interactive UI State ``` ### Client Components (Direct Fetch) ```text Client Component ↓ API client (useEffect / useQuery) ↓ API Transport DTO ↓ ViewModel Builder (lib/builders/view-models/) ↓ ViewModel (lib/view-models/) ↓ Client State (useState) ↓ Template ``` ## 3) Write flow All writes enter through **Server Actions**. ```text User intent ↓ Server Action ↓ Command Model / Request DTO ↓ API ↓ Revalidation ↓ RSC reload ``` ## 4) Non-negotiable rules 1. Templates accept ViewData only. 2. Page Queries do not format. 3. ViewData Builders transform API DTO → ViewData (RSC). 4. ViewModel Builders transform API DTO → ViewModel (Client). 5. Builders do not call the API. 6. Client state is UI-only.