# smartexploit/ekiti30digital architecture

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

- Interactive diagram: https://gitdiagram.com/smartexploit/ekiti30digital
- Repository: https://github.com/smartexploit/ekiti30digital

## Overview

EKITI@30 DIGITAL is a public knowledge and community platform: visitors explore Ekiti’s history and places, ask questions, and contribute stories or future visions; administrators authenticate to manage platform content. The repository shows a Next.js frontend, a FastAPI API, knowledge-base ingestion and data models. The README documents broader capabilities than the sampled implementation. Because most route and page source was not sampled, the graph shows confirmed router registration and authentication wiring, but does not assume how individual screens call API endpoints.

Main entry points: [`backend/app/main.py`](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/main.py) (FastAPI application), [`frontend/src/app/timeline/page.tsx`](https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/timeline/page.tsx) (Timeline view), [`backend/app/api/routes/admin.py`](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/admin.py) (Admin API), [`backend/app/models/knowledge.py`](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/models/knowledge.py) (Knowledge documents)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_home["Platform home<br/>[page.tsx]"]
  node_timeline_page["Timeline view<br/>[page.tsx]"]
  node_timeline_data["Timeline events<br/>[timelineEvents.ts]"]
  node_explore_page["Explore Ekiti<br/>[page.tsx]"]
  node_story_page["My Ekiti Story<br/>[page.tsx]"]
  node_ask_page["Ask Ekiti<br/>[page.tsx]"]
  node_vision_page["Ekiti 2056<br/>[page.tsx]"]
end

subgraph group_api["API domains"]
  node_api_app["FastAPI application<br/>[main.py]"]
  node_timeline_api["Timeline API<br/>[timeline.py]"]
  node_lga_api["LGA API<br/>[lgas.py]"]
  node_story_api["Stories API<br/>[stories.py]"]
  node_ask_api["Ask Ekiti API<br/>[ask_ekiti.py]"]
  node_vision_api["Vision API<br/>[vision2056.py]"]
  node_upload_api["Media uploads API<br/>[uploads.py]"]
  node_admin_api["Admin API<br/>[admin.py]"]
  node_asset_model["Media asset model<br/>[asset.py]"]
end

subgraph group_knowledge["Knowledge data"]
  node_ingestion["KB manifest ingestion<br/>[ingestion.py]"]
  node_knowledge_models["Knowledge documents<br/>[knowledge.py]"]
  node_database[("Application database")]
end

subgraph group_security["Admin security"]
  node_auth_route["NextAuth handler<br/>[route.ts]"]
  node_auth_config["Admin login and JWT<br/>[auth.ts]"]
  node_backend_auth["JWT verification<br/>[auth.py]"]
end

node_visitor(("Visitor / citizen"))
node_admin(("Administrator"))

node_visitor -->|"opens"| node_home
node_visitor -->|"explores"| node_timeline_page
node_visitor -->|"explores"| node_explore_page
node_visitor -->|"contributes"| node_story_page
node_visitor -->|"asks"| node_ask_page
node_visitor -->|"shares vision"| node_vision_page
node_timeline_page -->|"reads events"| node_timeline_data
node_api_app -->|"registers route"| node_timeline_api
node_api_app -->|"registers route"| node_lga_api
node_api_app -->|"registers route"| node_story_api
node_api_app -->|"registers route"| node_ask_api
node_api_app -->|"registers route"| node_vision_api
node_api_app -->|"registers route"| node_upload_api
node_api_app -->|"registers route"| node_admin_api
node_ingestion -->|"upserts documents"| node_knowledge_models
node_knowledge_models -->|"persists records"| node_database
node_asset_model -->|"persists assets"| node_database
node_admin -->|"signs in"| node_auth_route
node_auth_route -->|"uses configuration"| node_auth_config
node_auth_config -->|"issues shared JWT"| node_backend_auth
node_admin_api -->|"validates admin"| node_backend_auth

click node_home "https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/page.tsx"
click node_timeline_page "https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/timeline/page.tsx"
click node_timeline_data "https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/data/timelineEvents.ts"
click node_explore_page "https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/explore/page.tsx"
click node_story_page "https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/my-story/page.tsx"
click node_ask_page "https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/ask-ekiti/page.tsx"
click node_vision_page "https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/ekiti-2056/page.tsx"
click node_api_app "https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/main.py"
click node_timeline_api "https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/timeline.py"
click node_lga_api "https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/lgas.py"
click node_story_api "https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/stories.py"
click node_ask_api "https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/ask_ekiti.py"
click node_vision_api "https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/vision2056.py"
click node_upload_api "https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/uploads.py"
click node_admin_api "https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/admin.py"
click node_ingestion "https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/services/ingestion.py"
click node_knowledge_models "https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/models/knowledge.py"
click node_asset_model "https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/models/asset.py"
click node_auth_route "https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/api/auth/%5B...nextauth%5D/route.ts"
click node_auth_config "https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/lib/auth.ts"
click node_backend_auth "https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/core/auth.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_home,node_timeline_page,node_timeline_data,node_explore_page,node_story_page,node_ask_page,node_vision_page toneBlue
class node_api_app,node_timeline_api,node_lga_api,node_story_api,node_ask_api,node_vision_api,node_upload_api,node_admin_api,node_asset_model toneAmber
class node_ingestion,node_knowledge_models,node_database toneMint
class node_auth_route,node_auth_config,node_backend_auth toneRose
class node_visitor,node_admin toneIndigo
```

## Components

### Web experience

- [Platform home](https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/page.tsx): `frontend/src/app/page.tsx`
- [Timeline view](https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/timeline/page.tsx): `frontend/src/app/timeline/page.tsx`
- [Timeline events](https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/data/timelineEvents.ts): `frontend/src/data/timelineEvents.ts`
- [Explore Ekiti](https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/explore/page.tsx): `frontend/src/app/explore/page.tsx`
- [My Ekiti Story](https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/my-story/page.tsx): `frontend/src/app/my-story/page.tsx`
- [Ask Ekiti](https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/ask-ekiti/page.tsx): `frontend/src/app/ask-ekiti/page.tsx`
- [Ekiti 2056](https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/ekiti-2056/page.tsx): `frontend/src/app/ekiti-2056/page.tsx`

### API domains

- [FastAPI application](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/main.py): `backend/app/main.py`
- [Timeline API](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/timeline.py): `backend/app/api/routes/timeline.py`
- [LGA API](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/lgas.py): `backend/app/api/routes/lgas.py`
- [Stories API](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/stories.py): `backend/app/api/routes/stories.py`
- [Ask Ekiti API](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/ask_ekiti.py): `backend/app/api/routes/ask_ekiti.py`
- [Vision API](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/vision2056.py): `backend/app/api/routes/vision2056.py`
- [Media uploads API](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/uploads.py): `backend/app/api/routes/uploads.py`
- [Admin API](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/api/routes/admin.py): `backend/app/api/routes/admin.py`
- [Media asset model](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/models/asset.py): `backend/app/models/asset.py`

### Knowledge data

- [KB manifest ingestion](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/services/ingestion.py): `backend/app/services/ingestion.py`
- [Knowledge documents](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/models/knowledge.py): `backend/app/models/knowledge.py`
- **Application database**

### Admin security

- [NextAuth handler](https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/app/api/auth/%5B...nextauth%5D/route.ts): `frontend/src/app/api/auth/[...nextauth]/route.ts`
- [Admin login and JWT](https://github.com/smartexploit/ekiti30digital/blob/main/frontend/src/lib/auth.ts): `frontend/src/lib/auth.ts`
- [JWT verification](https://github.com/smartexploit/ekiti30digital/blob/main/backend/app/core/auth.py): `backend/app/core/auth.py`

### Other components

- **Visitor / citizen**
- **Administrator**

## Connections

- Visitor / citizen → Platform home: opens
- Visitor / citizen → Timeline view: explores
- Visitor / citizen → Explore Ekiti: explores
- Visitor / citizen → My Ekiti Story: contributes
- Visitor / citizen → Ask Ekiti: asks
- Visitor / citizen → Ekiti 2056: shares vision
- Timeline view → Timeline events: reads events
- FastAPI application → Timeline API: registers route
- FastAPI application → LGA API: registers route
- FastAPI application → Stories API: registers route
- FastAPI application → Ask Ekiti API: registers route
- FastAPI application → Vision API: registers route
- FastAPI application → Media uploads API: registers route
- FastAPI application → Admin API: registers route
- KB manifest ingestion → Knowledge documents: upserts documents
- Knowledge documents → Application database: persists records
- Media asset model → Application database: persists assets
- Administrator → NextAuth handler: signs in
- NextAuth handler → Admin login and JWT: uses configuration
- Admin login and JWT → JWT verification: issues shared JWT
- Admin API → JWT verification: validates admin
