# otienokelvin/giwesa_public_website architecture

> Architecture diagram of the GitHub repository otienokelvin/giwesa_public_website, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-15). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/otienokelvin/giwesa_public_website
- Repository: https://github.com/otienokelvin/giwesa_public_website

## Overview

GIWESA Solutions is a public marketing and lead-capture website for a Kenyan microfinance organisation, with a protected staff area for managing content and incoming requests. Visitors explore solutions and financial-education articles, then submit an inquiry or consultation request; staff manage those leads and update the public site. The graph follows documented routes and sampled calls. Some admin capabilities and media behavior are included from the README, since their implementation files were not sampled.

Main entry points: [`src/app/admin/(dashboard)`](https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/admin/(dashboard)) (Admin operations), [`src/app/(public)`](https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/(public)) (Public pages), [`src/app/api/bookings/route.ts`](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/app/api/bookings/route.ts) (Booking endpoint), [`src/domains/site-settings/service.ts`](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/site-settings/service.ts) (Settings service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_public["Public experience"]
  node_public_site["Public pages"]
  node_solutions["Solutions content<br/>[page.tsx]"]
  node_insights["Insights pages<br/>[page.tsx]"]
  node_public_ui["Public components"]
  node_final_cta["Homepage CTA<br/>[final-cta.tsx]"]
end

subgraph group_leads["Lead capture"]
  node_booking_form["Booking form<br/>[booking-form.tsx]"]
  node_inquiry_form["Inquiry form<br/>[inquiry-form.tsx]"]
  node_booking_api["Booking endpoint<br/>[route.ts]"]
  node_inquiry_api["Inquiry endpoint<br/>[route.ts]"]
end

subgraph group_admin["Staff operations"]
  node_login["Staff login<br/>[page.tsx]"]
  node_admin_area["Admin operations"]
  node_blog_admin["Article management"]
  node_product_admin["Solution management"]
  node_lead_admin["Lead management"]
  node_settings_admin["Site settings"]
end

subgraph group_domains["Domain services"]
  node_booking_service["Booking service<br/>[service.ts]"]
  node_inquiry_service["Inquiry service<br/>[service.ts]"]
  node_email["Email notifications<br/>[service.ts]"]
  node_auth["Authentication"]
  node_blog["Article service<br/>[service.ts]"]
  node_products["Product service<br/>[service.ts]"]
  node_settings["Settings service<br/>[service.ts]"]
  node_media["Image processing<br/>[service.ts]"]
  node_audit["Audit records<br/>[service.ts]"]
end

subgraph group_foundation["Shared foundations"]
  node_db[("Application database<br/>[client.ts]")]
  node_validation["Input validation<br/>[validation.ts]"]
  node_rate_limit["Rate limiting<br/>[rate-limit.ts]"]
  node_seo["SEO metadata<br/>[seo.tsx]"]
  node_site_config["Site configuration<br/>[site.ts]"]
  node_button["Shared buttons<br/>[button.tsx]"]
  node_page_header["Page header<br/>[page-header.tsx]"]
end

node_visitor(("Visitor"))
node_staff(("Authorised staff"))
node_smtp(("SMTP service"))

node_visitor -->|"browses"| node_public_site
node_visitor -->|"views solutions"| node_solutions
node_visitor -->|"reads articles"| node_insights
node_public_site -->|"composes"| node_public_ui
node_public_site -->|"loads articles"| node_blog
node_public_site -->|"loads solutions"| node_products
node_public_site -->|"loads settings"| node_settings
node_insights -->|"queries articles"| node_blog
node_solutions -->|"queries solution"| node_products
node_solutions -->|"loads settings"| node_settings
node_public_site -->|"builds metadata"| node_seo
node_public_ui -->|"uses buttons"| node_button
node_public_ui -->|"renders headers"| node_page_header
node_final_cta -->|"loads settings"| node_settings
node_visitor -->|"requests consultation"| node_booking_form
node_visitor -->|"sends inquiry"| node_inquiry_form
node_booking_form -->|"submits request"| node_booking_api
node_inquiry_form -->|"submits inquiry"| node_inquiry_api
node_booking_api -->|"validates fields"| node_validation
node_inquiry_api -->|"validates fields"| node_validation
node_booking_api -->|"limits requests"| node_rate_limit
node_inquiry_api -->|"limits requests"| node_rate_limit
node_booking_api -->|"creates booking"| node_booking_service
node_inquiry_api -->|"creates inquiry"| node_inquiry_service
node_booking_api -->|"schedules notice"| node_email
node_inquiry_api -->|"schedules notice"| node_email
node_email -->|"sends notification"| node_smtp
node_booking_service -->|"persists bookings"| node_db
node_inquiry_service -->|"persists inquiries"| node_db
node_staff -->|"signs in"| node_login
node_staff -->|"manages site"| node_admin_area
node_login -->|"verifies session"| node_auth
node_admin_area -->|"checks access"| node_auth
node_admin_area -->|"manages articles"| node_blog_admin
node_admin_area -->|"manages solutions"| node_product_admin
node_admin_area -->|"handles inquiries"| node_lead_admin
node_admin_area -->|"edits settings"| node_settings_admin
node_blog_admin -->|"updates content"| node_blog
node_product_admin -->|"updates solutions"| node_products
node_lead_admin -->|"reviews inquiries"| node_inquiry_service
node_settings_admin -->|"updates settings"| node_settings
node_blog -->|"reads and writes"| node_db
node_products -->|"reads and writes"| node_db
node_settings -->|"reads and writes"| node_db
node_admin_area -.->|"records operations"| node_audit
node_blog_admin -.->|"processes cover images"| node_media
node_settings -->|"uses defaults"| node_site_config
node_booking_api -.->|"validates options"| node_site_config

click node_public_site "https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/(public)"
click node_solutions "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/app/(public)/solutions/%5Bslug%5D/page.tsx"
click node_insights "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/app/(public)/insights/page.tsx"
click node_public_ui "https://github.com/otienokelvin/giwesa_public_website/tree/main/src/components/public"
click node_booking_form "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/components/public/forms/booking-form.tsx"
click node_inquiry_form "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/components/public/forms/inquiry-form.tsx"
click node_booking_api "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/app/api/bookings/route.ts"
click node_inquiry_api "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/app/api/inquiries/route.ts"
click node_booking_service "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/bookings/service.ts"
click node_inquiry_service "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/inquiries/service.ts"
click node_email "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/email/service.ts"
click node_login "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/app/admin/login/page.tsx"
click node_admin_area "https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/admin/(dashboard)"
click node_blog_admin "https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/admin/(dashboard)/blog"
click node_product_admin "https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/admin/(dashboard)/products"
click node_lead_admin "https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/admin/(dashboard)/inquiries"
click node_settings_admin "https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/admin/(dashboard)/settings"
click node_auth "https://github.com/otienokelvin/giwesa_public_website/tree/main/src/domains/auth"
click node_blog "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/blog/service.ts"
click node_products "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/products/service.ts"
click node_settings "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/site-settings/service.ts"
click node_media "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/media/service.ts"
click node_audit "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/audit/service.ts"
click node_db "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/db/client.ts"
click node_validation "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/lib/validation.ts"
click node_rate_limit "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/lib/rate-limit.ts"
click node_seo "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/lib/seo.tsx"
click node_site_config "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/config/site.ts"
click node_button "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/components/ui/button.tsx"
click node_page_header "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/components/public/page-header.tsx"
click node_final_cta "https://github.com/otienokelvin/giwesa_public_website/blob/main/src/components/public/home/final-cta.tsx"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_public_site,node_solutions,node_insights,node_public_ui,node_final_cta toneBlue
class node_booking_form,node_inquiry_form,node_booking_api,node_inquiry_api toneAmber
class node_login,node_admin_area,node_blog_admin,node_product_admin,node_lead_admin,node_settings_admin toneMint
class node_booking_service,node_inquiry_service,node_email,node_auth,node_blog,node_products,node_settings,node_media,node_audit toneRose
class node_db,node_validation,node_rate_limit,node_seo,node_site_config,node_button,node_page_header,node_visitor,node_staff,node_smtp toneIndigo
```

## Components

### Public experience

- [Public pages](https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/(public)): `src/app/(public)`
- [Solutions content](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/app/(public)/solutions/%5Bslug%5D/page.tsx): `src/app/(public)/solutions/[slug]/page.tsx`
- [Insights pages](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/app/(public)/insights/page.tsx): `src/app/(public)/insights/page.tsx`
- [Public components](https://github.com/otienokelvin/giwesa_public_website/tree/main/src/components/public): `src/components/public`
- [Homepage CTA](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/components/public/home/final-cta.tsx): `src/components/public/home/final-cta.tsx`

### Lead capture

- [Booking form](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/components/public/forms/booking-form.tsx): `src/components/public/forms/booking-form.tsx`
- [Inquiry form](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/components/public/forms/inquiry-form.tsx): `src/components/public/forms/inquiry-form.tsx`
- [Booking endpoint](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/app/api/bookings/route.ts): `src/app/api/bookings/route.ts`
- [Inquiry endpoint](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/app/api/inquiries/route.ts): `src/app/api/inquiries/route.ts`

### Staff operations

- [Staff login](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/app/admin/login/page.tsx): `src/app/admin/login/page.tsx`
- [Admin operations](https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/admin/(dashboard)): `src/app/admin/(dashboard)`
- [Article management](https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/admin/(dashboard)/blog): `src/app/admin/(dashboard)/blog`
- [Solution management](https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/admin/(dashboard)/products): `src/app/admin/(dashboard)/products`
- [Lead management](https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/admin/(dashboard)/inquiries): `src/app/admin/(dashboard)/inquiries`
- [Site settings](https://github.com/otienokelvin/giwesa_public_website/tree/main/src/app/admin/(dashboard)/settings): `src/app/admin/(dashboard)/settings`

### Domain services

- [Booking service](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/bookings/service.ts): `src/domains/bookings/service.ts`
- [Inquiry service](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/inquiries/service.ts): `src/domains/inquiries/service.ts`
- [Email notifications](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/email/service.ts): `src/domains/email/service.ts`
- [Authentication](https://github.com/otienokelvin/giwesa_public_website/tree/main/src/domains/auth): `src/domains/auth`
- [Article service](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/blog/service.ts): `src/domains/blog/service.ts`
- [Product service](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/products/service.ts): `src/domains/products/service.ts`
- [Settings service](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/site-settings/service.ts): `src/domains/site-settings/service.ts`
- [Image processing](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/media/service.ts): `src/domains/media/service.ts`
- [Audit records](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/domains/audit/service.ts): `src/domains/audit/service.ts`

### Shared foundations

- [Application database](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/db/client.ts): `src/db/client.ts`
- [Input validation](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/lib/validation.ts): `src/lib/validation.ts`
- [Rate limiting](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/lib/rate-limit.ts): `src/lib/rate-limit.ts`
- [SEO metadata](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/lib/seo.tsx): `src/lib/seo.tsx`
- [Site configuration](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/config/site.ts): `src/config/site.ts`
- [Shared buttons](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/components/ui/button.tsx): `src/components/ui/button.tsx`
- [Page header](https://github.com/otienokelvin/giwesa_public_website/blob/main/src/components/public/page-header.tsx): `src/components/public/page-header.tsx`

### Other components

- **Visitor**
- **Authorised staff**
- **SMTP service**

## Connections

- Visitor → Public pages: browses
- Visitor → Solutions content: views solutions
- Visitor → Insights pages: reads articles
- Public pages → Public components: composes (evidence: `src/app/(public)/about/page.tsx`)
- Public pages → Article service: loads articles (evidence: `src/app/(public)/page.tsx`)
- Public pages → Product service: loads solutions (evidence: `src/app/(public)/page.tsx`)
- Public pages → Settings service: loads settings (evidence: `src/app/(public)/page.tsx`)
- Insights pages → Article service: queries articles (evidence: `src/app/(public)/insights/page.tsx`)
- Solutions content → Product service: queries solution (evidence: `src/app/(public)/solutions/[slug]/page.tsx`)
- Solutions content → Settings service: loads settings (evidence: `src/app/(public)/solutions/[slug]/page.tsx`)
- Public pages → SEO metadata: builds metadata (evidence: `src/app/(public)/about/page.tsx`)
- Public components → Shared buttons: uses buttons (evidence: `src/components/public/home/final-cta.tsx`)
- Public components → Page header: renders headers (evidence: `src/app/(public)/about/page.tsx`)
- Homepage CTA → Settings service: loads settings (evidence: `src/components/public/home/final-cta.tsx`)
- Visitor → Booking form: requests consultation
- Visitor → Inquiry form: sends inquiry
- Booking form → Booking endpoint: submits request
- Inquiry form → Inquiry endpoint: submits inquiry
- Booking endpoint → Input validation: validates fields (evidence: `src/app/api/bookings/route.ts`)
- Inquiry endpoint → Input validation: validates fields (evidence: `src/app/api/inquiries/route.ts`)
- Booking endpoint → Rate limiting: limits requests (evidence: `src/app/api/bookings/route.ts`)
- Inquiry endpoint → Rate limiting: limits requests (evidence: `src/app/api/inquiries/route.ts`)
- Booking endpoint → Booking service: creates booking (evidence: `src/app/api/bookings/route.ts`)
- Inquiry endpoint → Inquiry service: creates inquiry (evidence: `src/app/api/inquiries/route.ts`)
- Booking endpoint → Email notifications: schedules notice (evidence: `src/app/api/bookings/route.ts`)
- Inquiry endpoint → Email notifications: schedules notice (evidence: `src/app/api/inquiries/route.ts`)
- Email notifications → SMTP service: sends notification (evidence: `src/domains/email/service.ts`)
- Booking service → Application database: persists bookings (evidence: `src/domains/bookings/service.ts`)
- Inquiry service → Application database: persists inquiries (evidence: `src/domains/inquiries/service.ts`)
- Authorised staff → Staff login: signs in
- Authorised staff → Admin operations: manages site
- Staff login → Authentication: verifies session
- Admin operations → Authentication: checks access (evidence: `src/app/admin/(dashboard)/page.tsx`)
- Admin operations → Article management: manages articles
- Admin operations → Solution management: manages solutions
- Admin operations → Lead management: handles inquiries
- Admin operations → Site settings: edits settings
- Article management → Article service: updates content
- Solution management → Product service: updates solutions
- Lead management → Inquiry service: reviews inquiries
- Site settings → Settings service: updates settings
- Article service → Application database: reads and writes (evidence: `src/domains/blog/service.ts`)
- Product service → Application database: reads and writes (evidence: `src/domains/products/service.ts`)
- Settings service → Application database: reads and writes (evidence: `src/domains/site-settings/service.ts`)
- Admin operations → Audit records: records operations
- Article management → Image processing: processes cover images
- Settings service → Site configuration: uses defaults (evidence: `src/domains/site-settings/service.ts`)
- Booking endpoint → Site configuration: validates options
