# smaranvelpula/streetfood-price-intel architecture

> Architecture diagram of the GitHub repository smaranvelpula/streetfood-price-intel, 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/smaranvelpula/streetfood-price-intel
- Repository: https://github.com/smaranvelpula/streetfood-price-intel

## Overview

The product is a crowd-sourced street-food price intelligence dashboard. A contributor submits prices through the web app; the frontend API client sends them to the FastAPI service, which exposes data and analysis for dashboards, city comparisons, SFII-versus-CPI views, and forecasts. The README documents the major capabilities and endpoint mapping; sampled source confirms app routing, selected API calls, and inflation/forecast calculations. Several page and router implementations were not sampled, so their internal data connections are not inferred.

Main entry points: [`frontend/src/App.jsx`](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/App.jsx) (App routes), [`backend/app/main.py`](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/main.py) (FastAPI service), [`frontend/src/api/client.js`](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/api/client.js) (API client), [`backend/app/routers/analytics.py`](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/analytics.py) (Analytics endpoints)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_app["App routes<br/>[App.jsx]"]
  node_home["Overview<br/>[Home.jsx]"]
  node_dashboard["Dashboard<br/>[Dashboard.jsx]"]
  node_food_pages["Food browsing<br/>[FoodPrices.jsx]"]
  node_details["Food details<br/>[FoodDetails.jsx]"]
  node_client["API client<br/>[client.js]"]
end

subgraph group_collection["Price collection"]
  node_submit["Price submission<br/>[SubmitPrice.jsx]"]
  node_foods["Food endpoints<br/>[foods.py]"]
end

subgraph group_service["API service"]
  node_api["FastAPI service<br/>[main.py]"]
  node_cities["City endpoints<br/>[cities.py]"]
end

subgraph group_analysis["Price analysis"]
  node_analytics_page["Filtered analytics<br/>[Analytics.jsx]"]
  node_compare_page["City comparison<br/>[Compare.jsx]"]
  node_inflation_page["SFII and CPI<br/>[Inflation.jsx]"]
  node_forecast_page["Price forecast<br/>[Forecast.jsx]"]
  node_analytics["Analytics endpoints<br/>[analytics.py]"]
  node_compare["Comparison endpoint<br/>[compare.py]"]
  node_inflation["Inflation endpoint<br/>[inflation.py]"]
  node_forecast["Forecast endpoint<br/>[forecast.py]"]
end

subgraph group_data["Data layer"]
  node_models["Domain models<br/>[models.py]"]
  node_database[("Database<br/>[database.py]")]
end

node_contributor(("Contributor"))

node_contributor -->|"uses"| node_app
node_app -->|"routes to"| node_home
node_app -->|"routes to"| node_dashboard
node_app -->|"routes to"| node_food_pages
node_app -->|"routes to"| node_details
node_app -->|"routes to"| node_submit
node_app -->|"routes to"| node_analytics_page
node_app -->|"routes to"| node_compare_page
node_app -->|"routes to"| node_inflation_page
node_app -->|"routes to"| node_forecast_page
node_home -->|"requests dashboard"| node_client
node_submit -->|"submits price"| node_client
node_client -->|"calls API"| node_api
node_api -->|"registers"| node_cities
node_api -->|"registers"| node_foods
node_api -->|"registers"| node_analytics
node_api -->|"registers"| node_compare
node_api -->|"registers"| node_inflation
node_api -->|"registers"| node_forecast
node_compare -->|"uses records"| node_analytics
node_inflation -->|"uses records"| node_analytics
node_forecast -->|"uses records"| node_analytics
node_inflation -->|"queries CPI"| node_models
node_forecast -->|"filters items"| node_models
node_compare -->|"queries data"| node_models
node_models -->|"uses base"| node_database
node_api -->|"creates tables"| node_database
node_client -->|"submits prices"| node_foods
node_client -->|"requests analysis"| node_analytics
node_client -->|"requests comparison"| node_compare
node_client -->|"requests index"| node_inflation
node_client -->|"requests forecast"| node_forecast

click node_app "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/App.jsx"
click node_home "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/Home.jsx"
click node_dashboard "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/Dashboard.jsx"
click node_food_pages "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/FoodPrices.jsx"
click node_details "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/FoodDetails.jsx"
click node_submit "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/SubmitPrice.jsx"
click node_analytics_page "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/Analytics.jsx"
click node_compare_page "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/Compare.jsx"
click node_inflation_page "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/Inflation.jsx"
click node_forecast_page "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/Forecast.jsx"
click node_client "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/api/client.js"
click node_api "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/main.py"
click node_cities "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/cities.py"
click node_foods "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/foods.py"
click node_analytics "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/analytics.py"
click node_compare "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/compare.py"
click node_inflation "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/inflation.py"
click node_forecast "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/forecast.py"
click node_models "https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/models.py"
click node_database "https://github.com/smaranvelpula/streetfood-price-intel/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_app,node_home,node_dashboard,node_food_pages,node_details,node_client toneBlue
class node_submit,node_foods toneAmber
class node_api,node_cities toneMint
class node_analytics_page,node_compare_page,node_inflation_page,node_forecast_page,node_analytics,node_compare,node_inflation,node_forecast toneRose
class node_models,node_database,node_contributor toneIndigo
```

## Components

### Web application

- [App routes](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Overview](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/Home.jsx): `frontend/src/pages/Home.jsx`
- [Dashboard](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/Dashboard.jsx): `frontend/src/pages/Dashboard.jsx`
- [Food browsing](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/FoodPrices.jsx): `frontend/src/pages/FoodPrices.jsx`
- [Food details](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/FoodDetails.jsx): `frontend/src/pages/FoodDetails.jsx`
- [API client](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/api/client.js): `frontend/src/api/client.js`

### Price collection

- [Price submission](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/SubmitPrice.jsx): `frontend/src/pages/SubmitPrice.jsx`
- [Food endpoints](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/foods.py): `backend/app/routers/foods.py`

### API service

- [FastAPI service](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/main.py): `backend/app/main.py`
- [City endpoints](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/cities.py): `backend/app/routers/cities.py`

### Price analysis

- [Filtered analytics](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/Analytics.jsx): `frontend/src/pages/Analytics.jsx`
- [City comparison](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/Compare.jsx): `frontend/src/pages/Compare.jsx`
- [SFII and CPI](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/Inflation.jsx): `frontend/src/pages/Inflation.jsx`
- [Price forecast](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/frontend/src/pages/Forecast.jsx): `frontend/src/pages/Forecast.jsx`
- [Analytics endpoints](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/analytics.py): `backend/app/routers/analytics.py`
- [Comparison endpoint](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/compare.py): `backend/app/routers/compare.py`
- [Inflation endpoint](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/inflation.py): `backend/app/routers/inflation.py`
- [Forecast endpoint](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/routers/forecast.py): `backend/app/routers/forecast.py`

### Data layer

- [Domain models](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/models.py): `backend/app/models.py`
- [Database](https://github.com/smaranvelpula/streetfood-price-intel/blob/main/backend/app/database.py): `backend/app/database.py`

### Other components

- **Contributor**

## Connections

- Contributor → App routes: uses (evidence: `README.md`)
- App routes → Overview: routes to (evidence: `frontend/src/App.jsx`)
- App routes → Dashboard: routes to (evidence: `frontend/src/App.jsx`)
- App routes → Food browsing: routes to (evidence: `frontend/src/App.jsx`)
- App routes → Food details: routes to (evidence: `frontend/src/App.jsx`)
- App routes → Price submission: routes to (evidence: `frontend/src/App.jsx`)
- App routes → Filtered analytics: routes to (evidence: `frontend/src/App.jsx`)
- App routes → City comparison: routes to (evidence: `frontend/src/App.jsx`)
- App routes → SFII and CPI: routes to (evidence: `frontend/src/App.jsx`)
- App routes → Price forecast: routes to (evidence: `frontend/src/App.jsx`)
- Overview → API client: requests dashboard (evidence: `frontend/src/pages/Home.jsx`)
- Price submission → API client: submits price (evidence: `frontend/src/pages/SubmitPrice.jsx`)
- API client → FastAPI service: calls API (evidence: `README.md`)
- FastAPI service → City endpoints: registers (evidence: `backend/app/main.py`)
- FastAPI service → Food endpoints: registers (evidence: `backend/app/main.py`)
- FastAPI service → Analytics endpoints: registers (evidence: `backend/app/main.py`)
- FastAPI service → Comparison endpoint: registers (evidence: `backend/app/main.py`)
- FastAPI service → Inflation endpoint: registers (evidence: `backend/app/main.py`)
- FastAPI service → Forecast endpoint: registers (evidence: `backend/app/main.py`)
- Comparison endpoint → Analytics endpoints: uses records (evidence: `backend/app/routers/compare.py`)
- Inflation endpoint → Analytics endpoints: uses records (evidence: `backend/app/routers/inflation.py`)
- Forecast endpoint → Analytics endpoints: uses records (evidence: `backend/app/routers/forecast.py`)
- Inflation endpoint → Domain models: queries CPI (evidence: `backend/app/routers/inflation.py`)
- Forecast endpoint → Domain models: filters items (evidence: `backend/app/routers/forecast.py`)
- Comparison endpoint → Domain models: queries data (evidence: `backend/app/routers/compare.py`)
- Domain models → Database: uses base (evidence: `backend/app/models.py`)
- FastAPI service → Database: creates tables (evidence: `backend/app/main.py`)
- API client → Food endpoints: submits prices (evidence: `README.md`)
- API client → Analytics endpoints: requests analysis (evidence: `README.md`)
- API client → Comparison endpoint: requests comparison (evidence: `README.md`)
- API client → Inflation endpoint: requests index (evidence: `README.md`)
- API client → Forecast endpoint: requests forecast (evidence: `README.md`)
