# 17shotsno38/cas--shukyoku architecture

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

- Interactive diagram: https://gitdiagram.com/17shotsno38/cas--shukyoku
- Repository: https://github.com/17shotsno38/cas--shukyoku

## Overview

CivicAlert is a multi-portal utility and resident alert system for CEPALCO, the Water District, and residents. Residents view local advisories and service information; utility staff manage and publish operational updates, with email and social delivery handled by backend integrations. The shared frontend uses Supabase actions and domain types, while the backend includes a separate API core and SQLite persistence. The excerpts establish several internal calls, but do not show how the three API entrypoints connect to the core or how the browser apps are mounted, so those links are omitted.

Main entry points: [`cas--CAS4.0/frontend/packages/ui/src/PortalApp.tsx`](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/packages/ui/src/PortalApp.tsx) (Portal interface), [`cas--CAS4.0/backend/packages/api-core/src/server.ts`](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/server.ts) (API core), [`cas--CAS4.0/frontend/packages/ui/src/supabaseActions.ts`](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/packages/ui/src/supabaseActions.ts) (Portal data actions), [`cas--CAS4.0/backend/packages/api-core/src/database.ts`](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/database.ts) (SQLite store)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_portals["Web portals"]
  node_resident["Resident portal<br/>[main.tsx]"]
  node_cepalco["CEPALCO portal<br/>[main.tsx]"]
  node_water["Water portal<br/>[main.tsx]"]
  node_portal_app["Portal interface<br/>[PortalApp.tsx]"]
  node_maps["Advisory maps<br/>[GoogleMaps.tsx]"]
end

subgraph group_frontend_data["Frontend data"]
  node_domain_types["Domain models<br/>[domainTypes.ts]"]
  node_supabase_actions["Portal data actions<br/>[supabaseActions.ts]"]
  node_supabase_client["Supabase client<br/>[supabase.ts]"]
  node_supabase_service[("Supabase service")]
end

subgraph group_api["Backend API"]
  node_api_core["API core<br/>[server.ts]"]
  node_resident_api["Resident API entry<br/>[main.ts]"]
  node_cepalco_api["CEPALCO API entry<br/>[main.ts]"]
  node_water_api["Water API entry<br/>[main.ts]"]
  node_sqlite[("SQLite store<br/>[database.ts]")]
  node_portal_settings["Portal settings<br/>[portalSettings.ts]"]
  node_ui_copy["Interface copy<br/>[uiCopy.ts]"]
end

subgraph group_delivery["External delivery"]
  node_gmail["Gmail delivery<br/>[gmail.ts]"]
  node_social["Social publishing<br/>[social.ts]"]
  node_gmail_service["Google Gmail"]
  node_social_service["Meta platforms"]
end

node_portal_app -->|"renders maps"| node_maps
node_portal_app -->|"uses models"| node_domain_types
node_portal_app -->|"uses client"| node_supabase_client
node_portal_app -->|"uses actions"| node_supabase_actions
node_supabase_actions -->|"uses models"| node_domain_types
node_supabase_actions -->|"uses client"| node_supabase_client
node_supabase_client -->|"connects to"| node_supabase_service
node_api_core -->|"reads and writes"| node_sqlite
node_api_core -->|"sends email"| node_gmail
node_api_core -->|"publishes notices"| node_social
node_api_core -->|"uses settings"| node_portal_settings
node_sqlite -->|"seeds settings"| node_portal_settings
node_sqlite -->|"seeds copy"| node_ui_copy
node_social -->|"parses images"| node_gmail
node_gmail -.->|"uses Gmail API"| node_gmail_service
node_social -.->|"publishes externally"| node_social_service

click node_resident "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/apps/resident-web/src/main.tsx"
click node_cepalco "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/apps/cepalco-web/src/main.tsx"
click node_water "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/apps/water-web/src/main.tsx"
click node_portal_app "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/packages/ui/src/PortalApp.tsx"
click node_maps "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/packages/ui/src/GoogleMaps.tsx"
click node_domain_types "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/packages/ui/src/domainTypes.ts"
click node_supabase_actions "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/packages/ui/src/supabaseActions.ts"
click node_supabase_client "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/packages/ui/src/supabase.ts"
click node_api_core "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/server.ts"
click node_resident_api "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/apps/resident-api/src/main.ts"
click node_cepalco_api "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/apps/cepalco-api/src/main.ts"
click node_water_api "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/apps/water-api/src/main.ts"
click node_sqlite "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/database.ts"
click node_portal_settings "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/portalSettings.ts"
click node_ui_copy "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/uiCopy.ts"
click node_gmail "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/gmail.ts"
click node_social "https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/social.ts"

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_resident,node_cepalco,node_water,node_portal_app,node_maps toneBlue
class node_domain_types,node_supabase_actions,node_supabase_client,node_supabase_service toneAmber
class node_api_core,node_resident_api,node_cepalco_api,node_water_api,node_sqlite,node_portal_settings,node_ui_copy toneMint
class node_gmail,node_social,node_gmail_service,node_social_service toneRose
```

## Components

### Web portals

- [Resident portal](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/apps/resident-web/src/main.tsx): `cas--CAS4.0/frontend/apps/resident-web/src/main.tsx`
- [CEPALCO portal](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/apps/cepalco-web/src/main.tsx): `cas--CAS4.0/frontend/apps/cepalco-web/src/main.tsx`
- [Water portal](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/apps/water-web/src/main.tsx): `cas--CAS4.0/frontend/apps/water-web/src/main.tsx`
- [Portal interface](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/packages/ui/src/PortalApp.tsx): `cas--CAS4.0/frontend/packages/ui/src/PortalApp.tsx`
- [Advisory maps](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/packages/ui/src/GoogleMaps.tsx): `cas--CAS4.0/frontend/packages/ui/src/GoogleMaps.tsx`

### Frontend data

- [Domain models](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/packages/ui/src/domainTypes.ts): `cas--CAS4.0/frontend/packages/ui/src/domainTypes.ts`
- [Portal data actions](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/packages/ui/src/supabaseActions.ts): `cas--CAS4.0/frontend/packages/ui/src/supabaseActions.ts`
- [Supabase client](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/frontend/packages/ui/src/supabase.ts): `cas--CAS4.0/frontend/packages/ui/src/supabase.ts`
- **Supabase service**

### Backend API

- [API core](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/server.ts): `cas--CAS4.0/backend/packages/api-core/src/server.ts`
- [Resident API entry](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/apps/resident-api/src/main.ts): `cas--CAS4.0/backend/apps/resident-api/src/main.ts`
- [CEPALCO API entry](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/apps/cepalco-api/src/main.ts): `cas--CAS4.0/backend/apps/cepalco-api/src/main.ts`
- [Water API entry](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/apps/water-api/src/main.ts): `cas--CAS4.0/backend/apps/water-api/src/main.ts`
- [SQLite store](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/database.ts): `cas--CAS4.0/backend/packages/api-core/src/database.ts`
- [Portal settings](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/portalSettings.ts): `cas--CAS4.0/backend/packages/api-core/src/portalSettings.ts`
- [Interface copy](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/uiCopy.ts): `cas--CAS4.0/backend/packages/api-core/src/uiCopy.ts`

### External delivery

- [Gmail delivery](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/gmail.ts): `cas--CAS4.0/backend/packages/api-core/src/gmail.ts`
- [Social publishing](https://github.com/17shotsno38/cas--shukyoku/blob/cas6.0/cas--CAS4.0/backend/packages/api-core/src/social.ts): `cas--CAS4.0/backend/packages/api-core/src/social.ts`
- **Google Gmail**
- **Meta platforms**

## Connections

- Portal interface → Advisory maps: renders maps (evidence: `cas--CAS4.0/frontend/packages/ui/src/PortalApp.tsx`)
- Portal interface → Domain models: uses models (evidence: `cas--CAS4.0/frontend/packages/ui/src/PortalApp.tsx`)
- Portal interface → Supabase client: uses client (evidence: `cas--CAS4.0/frontend/packages/ui/src/PortalApp.tsx`)
- Portal interface → Portal data actions: uses actions (evidence: `cas--CAS4.0/frontend/packages/ui/src/PortalApp.tsx`)
- Portal data actions → Domain models: uses models (evidence: `cas--CAS4.0/frontend/packages/ui/src/supabaseActions.ts`)
- Portal data actions → Supabase client: uses client (evidence: `cas--CAS4.0/frontend/packages/ui/src/supabaseActions.ts`)
- Supabase client → Supabase service: connects to (evidence: `cas--CAS4.0/frontend/packages/ui/src/supabase.ts`)
- API core → SQLite store: reads and writes (evidence: `cas--CAS4.0/backend/packages/api-core/src/server.ts`)
- API core → Gmail delivery: sends email (evidence: `cas--CAS4.0/backend/packages/api-core/src/server.ts`)
- API core → Social publishing: publishes notices (evidence: `cas--CAS4.0/backend/packages/api-core/src/server.ts`)
- API core → Portal settings: uses settings (evidence: `cas--CAS4.0/backend/packages/api-core/src/server.ts`)
- SQLite store → Portal settings: seeds settings (evidence: `cas--CAS4.0/backend/packages/api-core/src/database.ts`)
- SQLite store → Interface copy: seeds copy (evidence: `cas--CAS4.0/backend/packages/api-core/src/database.ts`)
- Social publishing → Gmail delivery: parses images (evidence: `cas--CAS4.0/backend/packages/api-core/src/social.ts`)
- Gmail delivery → Google Gmail: uses Gmail API
- Social publishing → Meta platforms: publishes externally
