# prannsss/seebu architecture

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

- Interactive diagram: https://gitdiagram.com/prannsss/seebu
- Repository: https://github.com/prannsss/seebu

## Overview

SEEBU is a civic-services PWA: residents authenticate, submit geotagged complaints and track their status; city administrators triage and assign reports, workforce administrators delegate department tasks, and officers complete work with photo proof. The frontend proxies API requests to an Express backend, which uses Supabase for application data and storage. Privacy scanning and EgoBlur redaction protect submitted images. README capabilities inform the broader workflow, but unsampled controller and route wiring is not inferred.

Main entry points: [`src/app/api/proxy/[...path]/route.ts`](https://github.com/prannsss/seebu/blob/main/src/app/api/proxy/%5B...path%5D/route.ts) (API proxy), [`backend/src/controllers/reportController.ts`](https://github.com/prannsss/seebu/blob/main/backend/src/controllers/reportController.ts) (Report handling), [`backend/src/app.ts`](https://github.com/prannsss/seebu/blob/main/backend/src/app.ts) (Express API), [`backend/src/config/db.ts`](https://github.com/prannsss/seebu/blob/main/backend/src/config/db.ts) (Supabase)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_client["Resident portal<br/>[page.tsx]"]
  node_reporting["Report submission<br/>[page.tsx]"]
  node_tracking["Report tracking<br/>[page.tsx]"]
  node_admin["Admin operations<br/>[page.tsx]"]
  node_wfadmin["Department queue<br/>[page.tsx]"]
  node_workforce["Officer tasks<br/>[page.tsx]"]
  node_authui["Auth workflows<br/>[page.tsx]"]
  node_proxy["API proxy<br/>[route.ts]"]
  node_session["Session cookies<br/>[route.ts]"]
  node_taskquery["Task data hooks<br/>[useTasks.ts]"]
end

subgraph group_api["Backend API"]
  node_apiapp["Express API<br/>[app.ts]"]
  node_authroutes["Auth routes<br/>[authRoutes.ts]"]
  node_reports["Report handling"]
  node_tasks["Task handling<br/>[taskController.ts]"]
  node_analytics["Analytics"]
  node_email["Email notifications<br/>[emailService.ts]"]
  node_sms["SMS notifications<br/>[smsService.ts]"]
end

subgraph group_privacy["Image privacy"]
  node_privacycheck["Image moderation<br/>[imageModeration.ts]"]
  node_media["Media storage<br/>[mediaStorage.ts]"]
  node_redactor["EgoBlur service<br/>[main.py]"]
end

subgraph group_data["Data services"]
  node_supabase[("Supabase<br/>[db.ts]")]
end

node_resident(("Resident"))
node_staff(("City staff"))
node_officer(("Field officer"))

node_resident -->|"signs in"| node_authui
node_authui -->|"requests auth"| node_proxy
node_proxy -->|"forwards API"| node_apiapp
node_apiapp -->|"mounts routes"| node_authroutes
node_authroutes -->|"returns credentials"| node_session
node_resident -->|"submits issue"| node_reporting
node_reporting -->|"sends report"| node_proxy
node_proxy -->|"forwards API"| node_apiapp
node_reports -->|"checks images"| node_privacycheck
node_reports -->|"persists photos"| node_media
node_reports -->|"reads and writes"| node_supabase
node_media -.->|"requests blur"| node_redactor
node_media -->|"stores images"| node_supabase
node_reports -->|"sends tracking"| node_email
node_reports -->|"sends tracking"| node_sms
node_resident -->|"checks progress"| node_tracking
node_tracking -->|"requests report"| node_proxy
node_staff -->|"reviews reports"| node_admin
node_admin -->|"triages reports"| node_proxy
node_staff -->|"delegates work"| node_wfadmin
node_wfadmin -->|"manages queue"| node_proxy
node_officer -->|"executes task"| node_workforce
node_workforce -->|"loads tasks"| node_taskquery
node_taskquery -->|"fetches and updates"| node_proxy
node_proxy -->|"forwards task API"| node_apiapp
node_tasks -->|"reads and writes"| node_supabase
node_staff -->|"views metrics"| node_analytics
node_analytics -->|"queries metrics"| node_supabase

click node_client "https://github.com/prannsss/seebu/blob/main/src/app/client/page.tsx"
click node_reporting "https://github.com/prannsss/seebu/blob/main/src/app/client/report/page.tsx"
click node_tracking "https://github.com/prannsss/seebu/blob/main/src/app/client/tracking/page.tsx"
click node_admin "https://github.com/prannsss/seebu/blob/main/src/app/admin/reports/page.tsx"
click node_wfadmin "https://github.com/prannsss/seebu/blob/main/src/app/workforce-admin/page.tsx"
click node_workforce "https://github.com/prannsss/seebu/blob/main/src/app/workforce/tasks/page.tsx"
click node_authui "https://github.com/prannsss/seebu/blob/main/src/app/auth/login/page.tsx"
click node_proxy "https://github.com/prannsss/seebu/blob/main/src/app/api/proxy/%5B...path%5D/route.ts"
click node_session "https://github.com/prannsss/seebu/blob/main/src/app/api/session/route.ts"
click node_apiapp "https://github.com/prannsss/seebu/blob/main/backend/src/app.ts"
click node_authroutes "https://github.com/prannsss/seebu/blob/main/backend/src/routes/authRoutes.ts"
click node_reports "https://github.com/prannsss/seebu/blob/main/backend/src/controllers/reportController.ts"
click node_tasks "https://github.com/prannsss/seebu/blob/main/backend/src/controllers/taskController.ts"
click node_taskquery "https://github.com/prannsss/seebu/blob/main/src/hooks/queries/useTasks.ts"
click node_privacycheck "https://github.com/prannsss/seebu/blob/main/backend/src/utils/imageModeration.ts"
click node_media "https://github.com/prannsss/seebu/blob/main/backend/src/utils/mediaStorage.ts"
click node_redactor "https://github.com/prannsss/seebu/blob/main/egoblur-service/main.py"
click node_supabase "https://github.com/prannsss/seebu/blob/main/backend/src/config/db.ts"
click node_analytics "https://github.com/prannsss/seebu/blob/main/backend/src/controllers/analyticsController.ts"
click node_email "https://github.com/prannsss/seebu/blob/main/backend/src/utils/emailService.ts"
click node_sms "https://github.com/prannsss/seebu/blob/main/backend/src/utils/smsService.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_client,node_reporting,node_tracking,node_admin,node_wfadmin,node_workforce,node_authui,node_proxy,node_session,node_taskquery toneBlue
class node_apiapp,node_authroutes,node_reports,node_tasks,node_analytics,node_email,node_sms toneAmber
class node_privacycheck,node_media,node_redactor toneMint
class node_supabase toneRose
class node_resident,node_staff,node_officer toneIndigo
```

## Components

### Web experience

- [Resident portal](https://github.com/prannsss/seebu/blob/main/src/app/client/page.tsx): `src/app/client/page.tsx`
- [Report submission](https://github.com/prannsss/seebu/blob/main/src/app/client/report/page.tsx): `src/app/client/report/page.tsx`
- [Report tracking](https://github.com/prannsss/seebu/blob/main/src/app/client/tracking/page.tsx): `src/app/client/tracking/page.tsx`
- [Admin operations](https://github.com/prannsss/seebu/blob/main/src/app/admin/reports/page.tsx): `src/app/admin/reports/page.tsx`
- [Department queue](https://github.com/prannsss/seebu/blob/main/src/app/workforce-admin/page.tsx): `src/app/workforce-admin/page.tsx`
- [Officer tasks](https://github.com/prannsss/seebu/blob/main/src/app/workforce/tasks/page.tsx): `src/app/workforce/tasks/page.tsx`
- [Auth workflows](https://github.com/prannsss/seebu/blob/main/src/app/auth/login/page.tsx): `src/app/auth/login/page.tsx`
- [API proxy](https://github.com/prannsss/seebu/blob/main/src/app/api/proxy/%5B...path%5D/route.ts): `src/app/api/proxy/[...path]/route.ts`
- [Session cookies](https://github.com/prannsss/seebu/blob/main/src/app/api/session/route.ts): `src/app/api/session/route.ts`
- [Task data hooks](https://github.com/prannsss/seebu/blob/main/src/hooks/queries/useTasks.ts): `src/hooks/queries/useTasks.ts`

### Backend API

- [Express API](https://github.com/prannsss/seebu/blob/main/backend/src/app.ts): `backend/src/app.ts`
- [Auth routes](https://github.com/prannsss/seebu/blob/main/backend/src/routes/authRoutes.ts): `backend/src/routes/authRoutes.ts`
- [Report handling](https://github.com/prannsss/seebu/blob/main/backend/src/controllers/reportController.ts): `backend/src/controllers/reportController.ts`
- [Task handling](https://github.com/prannsss/seebu/blob/main/backend/src/controllers/taskController.ts): `backend/src/controllers/taskController.ts`
- [Analytics](https://github.com/prannsss/seebu/blob/main/backend/src/controllers/analyticsController.ts): `backend/src/controllers/analyticsController.ts`
- [Email notifications](https://github.com/prannsss/seebu/blob/main/backend/src/utils/emailService.ts): `backend/src/utils/emailService.ts`
- [SMS notifications](https://github.com/prannsss/seebu/blob/main/backend/src/utils/smsService.ts): `backend/src/utils/smsService.ts`

### Image privacy

- [Image moderation](https://github.com/prannsss/seebu/blob/main/backend/src/utils/imageModeration.ts): `backend/src/utils/imageModeration.ts`
- [Media storage](https://github.com/prannsss/seebu/blob/main/backend/src/utils/mediaStorage.ts): `backend/src/utils/mediaStorage.ts`
- [EgoBlur service](https://github.com/prannsss/seebu/blob/main/egoblur-service/main.py): `egoblur-service/main.py`

### Data services

- [Supabase](https://github.com/prannsss/seebu/blob/main/backend/src/config/db.ts): `backend/src/config/db.ts`

### Other components

- **Resident**
- **City staff**
- **Field officer**

## Connections

- Resident → Auth workflows: signs in
- Auth workflows → API proxy: requests auth
- API proxy → Express API: forwards API
- Express API → Auth routes: mounts routes
- Auth routes → Session cookies: returns credentials
- Resident → Report submission: submits issue
- Report submission → API proxy: sends report
- API proxy → Express API: forwards API
- Report handling → Image moderation: checks images
- Report handling → Media storage: persists photos
- Report handling → Supabase: reads and writes
- Media storage → EgoBlur service: requests blur
- Media storage → Supabase: stores images
- Report handling → Email notifications: sends tracking
- Report handling → SMS notifications: sends tracking
- Resident → Report tracking: checks progress
- Report tracking → API proxy: requests report
- City staff → Admin operations: reviews reports
- Admin operations → API proxy: triages reports
- City staff → Department queue: delegates work
- Department queue → API proxy: manages queue
- Field officer → Officer tasks: executes task
- Officer tasks → Task data hooks: loads tasks
- Task data hooks → API proxy: fetches and updates
- API proxy → Express API: forwards task API
- Task handling → Supabase: reads and writes
- City staff → Analytics: views metrics
- Analytics → Supabase: queries metrics
