# akshay-kesavarapu/raktsetu architecture

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

- Interactive diagram: https://gitdiagram.com/akshay-kesavarapu/raktsetu
- Repository: https://github.com/akshay-kesavarapu/raktsetu

## Overview

VITALS is a blood-inventory tracking PWA: bank staff report stock through the web or SMS, the public search nearby banks by location and inventory, and NGOs monitor reporting coverage. The backend exposes these workflows through FastAPI routers and services backed by PostgreSQL; the frontend also includes offline storage and synchronization. The graph preserves the documented emergency and silent-alert capabilities, though their exact call paths are not shown in the sampled source. Unsampled frontend and backend modules are represented only where their paths and product roles are supported by the tree and README.

Main entry points: [`frontend/lib/api.ts`](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/lib/api.ts) (API client), [`backend/app/main.py`](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/main.py) (FastAPI app), [`backend/app/database.py`](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/database.py) (Database session), [`backend/app/routers/search.py`](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/search.py) (Search routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_public["Public Search"]
  node_search_page["Search page<br/>[page.tsx]"]
  node_search_filters["Search filters<br/>[SearchFilters.tsx]"]
  node_search_results["Bank results"]
  node_search_map["Search map<br/>[SearchMap.tsx]"]
end

subgraph group_reporting["Bank Reporting"]
  node_report_page["Stock report<br/>[page.tsx]"]
  node_report_form["Report form"]
  node_offline_sync["Offline sync<br/>[sync.ts]"]
  node_offline_db[("Offline store<br/>[offline-db.ts]")]
  node_sms_simulator["SMS reporting"]
  node_bank_portal["Bank portal<br/>[page.tsx]"]
end

subgraph group_monitoring["Coverage Monitoring"]
  node_dashboard_page["Dashboard<br/>[page.tsx]"]
  node_coverage_map["Coverage map<br/>[CoverageMap.tsx]"]
end

subgraph group_backend["API and Data"]
  node_api_client["API client<br/>[api.ts]"]
  node_api_app["FastAPI app<br/>[main.py]"]
  node_search_router["Search routes<br/>[search.py]"]
  node_stock_router["Stock routes<br/>[stock.py]"]
  node_sms_router["SMS routes<br/>[sms.py]"]
  node_bank_router["Bank routes<br/>[bank.py]"]
  node_dashboard_router["Dashboard routes<br/>[dashboard.py]"]
  node_bank_directory["Bank directory<br/>[blood_banks.py]"]
  node_search_service["Search service<br/>[search_service.py]"]
  node_stock_service["Stock service<br/>[stock_service.py]"]
  node_sms_service["SMS processing<br/>[sms_service.py]"]
  node_coverage_service["Coverage metrics"]
  node_alert_services["Alert services"]
  node_silent_service["Silent alerts"]
  node_db_layer["Database session<br/>[database.py]"]
end

node_public_user(("Public user"))
node_staff(("Bank staff"))
node_ngo(("NGO operator"))
node_postgres[("PostgreSQL")]
node_sms_gateway(("SMS gateway"))

node_public_user -->|"searches"| node_search_page
node_search_page -->|"sets criteria"| node_search_filters
node_search_filters -->|"requests search"| node_api_client
node_api_client -->|"calls API"| node_search_router
node_search_router -->|"invokes"| node_search_service
node_search_service -->|"queries"| node_db_layer
node_db_layer -->|"reads data"| node_postgres
node_search_router -->|"returns matches"| node_api_client
node_api_client -->|"supplies results"| node_search_results
node_api_client -->|"supplies results"| node_search_map
node_staff -->|"reports stock"| node_report_page
node_report_page -->|"presents form"| node_report_form
node_report_form -->|"submits update"| node_api_client
node_api_client -->|"calls API"| node_stock_router
node_stock_router -->|"invokes"| node_stock_service
node_stock_service -->|"writes stock"| node_db_layer
node_report_form -->|"stores offline"| node_offline_db
node_offline_sync -->|"reads queued reports"| node_offline_db
node_offline_sync -->|"syncs reports"| node_api_client
node_staff -->|"sends SMS update"| node_sms_simulator
node_sms_simulator -->|"submits payload"| node_api_client
node_api_client -->|"calls webhook"| node_sms_router
node_sms_router -->|"dispatches"| node_sms_service
node_sms_service -->|"updates inventory"| node_stock_service
node_sms_service -.->|"sends confirmation"| node_sms_gateway
node_staff -->|"uses portal"| node_bank_portal
node_bank_portal -->|"requests bank actions"| node_api_client
node_api_client -->|"calls API"| node_bank_router
node_ngo -->|"monitors coverage"| node_dashboard_page
node_dashboard_page -->|"requests metrics"| node_api_client
node_api_client -->|"calls API"| node_dashboard_router
node_dashboard_router -->|"invokes"| node_coverage_service
node_coverage_service -->|"queries activity"| node_db_layer
node_dashboard_page -->|"displays coverage"| node_coverage_map
node_api_app -->|"registers"| node_search_router
node_api_app -->|"registers"| node_stock_router
node_api_app -->|"registers"| node_sms_router
node_api_app -->|"registers"| node_bank_router
node_api_app -->|"registers"| node_dashboard_router
node_api_app -->|"registers"| node_bank_directory
node_alert_services -->|"accesses data"| node_db_layer
node_silent_service -->|"accesses data"| node_db_layer

click node_search_page "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/app/(light)/search/page.tsx"
click node_search_filters "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/components/search/SearchFilters.tsx"
click node_search_results "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/components/search/BloodBankResults.tsx"
click node_search_map "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/components/search/SearchMap.tsx"
click node_report_page "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/app/(light)/report/page.tsx"
click node_report_form "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/components/report/StockReportForm.tsx"
click node_offline_sync "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/lib/sync.ts"
click node_offline_db "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/lib/offline-db.ts"
click node_sms_simulator "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/components/report/SMSPipelineSimulator.tsx"
click node_bank_portal "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/app/(light)/bank/portal/page.tsx"
click node_dashboard_page "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/app/dashboard/page.tsx"
click node_coverage_map "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/components/dashboard/CoverageMap.tsx"
click node_api_client "https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/lib/api.ts"
click node_api_app "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/main.py"
click node_search_router "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/search.py"
click node_stock_router "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/stock.py"
click node_sms_router "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/sms.py"
click node_bank_router "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/bank.py"
click node_dashboard_router "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/dashboard.py"
click node_bank_directory "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/blood_banks.py"
click node_search_service "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/services/search_service.py"
click node_stock_service "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/services/stock_service.py"
click node_sms_service "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/services/sms_service.py"
click node_coverage_service "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/services/coverage_service.py"
click node_alert_services "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/services/emergency_alert_service.py"
click node_silent_service "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/services/silent_alert_service.py"
click node_db_layer "https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/database.py"

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_search_page,node_search_filters,node_search_results,node_search_map,node_public_user toneBlue
class node_report_page,node_report_form,node_offline_sync,node_offline_db,node_sms_simulator,node_bank_portal,node_postgres toneAmber
class node_dashboard_page,node_coverage_map toneMint
class node_api_client,node_api_app,node_search_router,node_stock_router,node_sms_router,node_bank_router,node_dashboard_router,node_bank_directory,node_search_service,node_stock_service,node_sms_service,node_coverage_service,node_alert_services,node_silent_service,node_db_layer toneRose
class node_staff,node_ngo,node_sms_gateway toneIndigo
```

## Components

### Public Search

- [Search page](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/app/(light)/search/page.tsx): `frontend/app/(light)/search/page.tsx`
- [Search filters](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/components/search/SearchFilters.tsx): `frontend/components/search/SearchFilters.tsx`
- [Bank results](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/components/search/BloodBankResults.tsx): `frontend/components/search/BloodBankResults.tsx`
- [Search map](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/components/search/SearchMap.tsx): `frontend/components/search/SearchMap.tsx`

### Bank Reporting

- [Stock report](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/app/(light)/report/page.tsx): `frontend/app/(light)/report/page.tsx`
- [Report form](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/components/report/StockReportForm.tsx): `frontend/components/report/StockReportForm.tsx`
- [Offline sync](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/lib/sync.ts): `frontend/lib/sync.ts`
- [Offline store](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/lib/offline-db.ts): `frontend/lib/offline-db.ts`
- [SMS reporting](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/components/report/SMSPipelineSimulator.tsx): `frontend/components/report/SMSPipelineSimulator.tsx`
- [Bank portal](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/app/(light)/bank/portal/page.tsx): `frontend/app/(light)/bank/portal/page.tsx`

### Coverage Monitoring

- [Dashboard](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/app/dashboard/page.tsx): `frontend/app/dashboard/page.tsx`
- [Coverage map](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/components/dashboard/CoverageMap.tsx): `frontend/components/dashboard/CoverageMap.tsx`

### API and Data

- [API client](https://github.com/akshay-kesavarapu/raktsetu/blob/main/frontend/lib/api.ts): `frontend/lib/api.ts`
- [FastAPI app](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/main.py): `backend/app/main.py`
- [Search routes](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/search.py): `backend/app/routers/search.py`
- [Stock routes](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/stock.py): `backend/app/routers/stock.py`
- [SMS routes](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/sms.py): `backend/app/routers/sms.py`
- [Bank routes](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/bank.py): `backend/app/routers/bank.py`
- [Dashboard routes](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/dashboard.py): `backend/app/routers/dashboard.py`
- [Bank directory](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/routers/blood_banks.py): `backend/app/routers/blood_banks.py`
- [Search service](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/services/search_service.py): `backend/app/services/search_service.py`
- [Stock service](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/services/stock_service.py): `backend/app/services/stock_service.py`
- [SMS processing](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/services/sms_service.py): `backend/app/services/sms_service.py`
- [Coverage metrics](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/services/coverage_service.py): `backend/app/services/coverage_service.py`
- [Alert services](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/services/emergency_alert_service.py): `backend/app/services/emergency_alert_service.py`
- [Silent alerts](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/services/silent_alert_service.py): `backend/app/services/silent_alert_service.py`
- [Database session](https://github.com/akshay-kesavarapu/raktsetu/blob/main/backend/app/database.py): `backend/app/database.py`

### Other components

- **Public user**
- **Bank staff**
- **NGO operator**
- **PostgreSQL**
- **SMS gateway**

## Connections

- Public user → Search page: searches
- Search page → Search filters: sets criteria
- Search filters → API client: requests search
- API client → Search routes: calls API
- Search routes → Search service: invokes
- Search service → Database session: queries
- Database session → PostgreSQL: reads data
- Search routes → API client: returns matches
- API client → Bank results: supplies results
- API client → Search map: supplies results
- Bank staff → Stock report: reports stock
- Stock report → Report form: presents form
- Report form → API client: submits update
- API client → Stock routes: calls API
- Stock routes → Stock service: invokes
- Stock service → Database session: writes stock
- Report form → Offline store: stores offline
- Offline sync → Offline store: reads queued reports
- Offline sync → API client: syncs reports
- Bank staff → SMS reporting: sends SMS update
- SMS reporting → API client: submits payload
- API client → SMS routes: calls webhook
- SMS routes → SMS processing: dispatches
- SMS processing → Stock service: updates inventory
- SMS processing → SMS gateway: sends confirmation
- Bank staff → Bank portal: uses portal
- Bank portal → API client: requests bank actions
- API client → Bank routes: calls API
- NGO operator → Dashboard: monitors coverage
- Dashboard → API client: requests metrics
- API client → Dashboard routes: calls API
- Dashboard routes → Coverage metrics: invokes
- Coverage metrics → Database session: queries activity
- Dashboard → Coverage map: displays coverage
- FastAPI app → Search routes: registers
- FastAPI app → Stock routes: registers
- FastAPI app → SMS routes: registers
- FastAPI app → Bank routes: registers
- FastAPI app → Dashboard routes: registers
- FastAPI app → Bank directory: registers
- Alert services → Database session: accesses data
- Silent alerts → Database session: accesses data
