# rijin-shaji/docuvalt-ai architecture

> Architecture diagram of the GitHub repository rijin-shaji/docuvalt-ai, 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/rijin-shaji/docuvalt-ai
- Repository: https://github.com/rijin-shaji/docuvalt-ai

## Overview

DocuVault AI is a tenant-isolated document Q&A product with a dashboard and developer API. The principal workflow is to add a file or URL, process its content into searchable chunks, then ask questions and receive grounded answers; the dashboard also supports account access, API keys, and usage views. Sampled code confirms the query, retrieval, generation, and background chunk-and-embedding paths. Upload dispatch, citation construction, and several dashboard/API integrations are not shown, so those connections are left out.

Main entry points: [`backend/app/main.py`](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/main.py) (FastAPI app), [`backend/app/api/v1/query.py`](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/api/v1/query.py) (Query endpoints), [`backend/app/tasks/ingestion_tasks.py`](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/tasks/ingestion_tasks.py) (Ingestion task), [`frontend/src/components/ChatInterface.jsx`](https://github.com/rijin-shaji/docuvalt-ai/blob/main/frontend/src/components/ChatInterface.jsx) (Chat interface)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Web application"]
  node_dashboard["Dashboard<br/>[Dashboard.jsx]"]
  node_chat["Chat interface<br/>[ChatInterface.jsx]"]
  node_client["API client<br/>[client.js]"]
  node_auth_ui["Login and signup<br/>[Login.jsx]"]
end

subgraph group_api["API and identity"]
  node_api_app["FastAPI app<br/>[main.py]"]
  node_auth_api["Auth endpoints<br/>[auth.py]"]
  node_tenant_auth["Tenant authentication<br/>[dependencies.py]"]
  node_key_api["API key endpoints<br/>[api_keys.py]"]
  node_docs_api["Document endpoints<br/>[documents.py]"]
  node_query_api["Query endpoints<br/>[query.py]"]
  node_usage_api["Usage endpoints<br/>[usage.py]"]
end

subgraph group_ingestion["Document ingestion"]
  node_ingestion_task["Ingestion task<br/>[ingestion_tasks.py]"]
  node_loaders["Content loaders<br/>[__init__.py]"]
  node_chunker["Text chunker<br/>[chunker.py]"]
  node_embedder["Embedding<br/>[embedder.py]"]
end

subgraph group_qa["Question answering"]
  node_rag_graph["RAG graph<br/>[graph.py]"]
  node_retrieval["Vector retrieval<br/>[retrieval.py]"]
  node_llm["Answer generation<br/>[llm.py]"]
end

subgraph group_storage["Persistence"]
  node_postgres[("PostgreSQL<br/>[postgres.py]")]
  node_vectors["Document vectors<br/>[document_vector.py]"]
  node_tenants["Tenant records<br/>[tenant.py]"]
  node_mongo[("MongoDB<br/>[mongo.py]")]
end

node_user(("User"))
node_groq{{"Groq service"}}

node_user -->|"uses"| node_dashboard
node_dashboard -->|"opens"| node_chat
node_chat -->|"uploads files or URLs"| node_docs_api
node_chat -->|"sends questions"| node_query_api
node_chat -->|"uploads through"| node_client
node_client -->|"sends API requests"| node_api_app
node_auth_ui -->|"submits credentials"| node_auth_api
node_auth_api -->|"reads and writes"| node_tenants
node_auth_api -->|"uses session"| node_postgres
node_api_app -->|"registers"| node_docs_api
node_api_app -->|"registers"| node_query_api
node_api_app -->|"registers"| node_auth_api
node_api_app -->|"registers"| node_key_api
node_api_app -->|"registers"| node_usage_api
node_api_app -->|"pings health"| node_mongo
node_docs_api -.->|"dispatch unknown"| node_loaders
node_ingestion_task -->|"chunks text"| node_chunker
node_ingestion_task -->|"embeds chunks"| node_embedder
node_ingestion_task -->|"commits vectors"| node_postgres
node_ingestion_task -->|"creates rows"| node_vectors
node_query_api -->|"requires tenant"| node_tenant_auth
node_query_api -->|"gets session"| node_postgres
node_query_api -->|"invokes"| node_rag_graph
node_query_api -->|"retrieves for streaming"| node_retrieval
node_retrieval -->|"embeds query"| node_embedder
node_retrieval -->|"queries vectors"| node_postgres
node_retrieval -->|"filters and ranks"| node_vectors
node_query_api -->|"streams answer"| node_llm
node_llm -->|"requests completion"| node_groq

click node_dashboard "https://github.com/rijin-shaji/docuvalt-ai/blob/main/frontend/src/pages/Dashboard.jsx"
click node_chat "https://github.com/rijin-shaji/docuvalt-ai/blob/main/frontend/src/components/ChatInterface.jsx"
click node_client "https://github.com/rijin-shaji/docuvalt-ai/blob/main/frontend/src/api/client.js"
click node_auth_ui "https://github.com/rijin-shaji/docuvalt-ai/blob/main/frontend/src/pages/Login.jsx"
click node_api_app "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/main.py"
click node_auth_api "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/api/v1/auth.py"
click node_tenant_auth "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/core/dependencies.py"
click node_key_api "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/api/v1/api_keys.py"
click node_docs_api "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/api/v1/documents.py"
click node_query_api "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/api/v1/query.py"
click node_usage_api "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/api/v1/usage.py"
click node_ingestion_task "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/tasks/ingestion_tasks.py"
click node_loaders "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/ingestion/loaders/__init__.py"
click node_chunker "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/ingestion/chunker.py"
click node_embedder "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/ingestion/embedder.py"
click node_rag_graph "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/rag/graph.py"
click node_retrieval "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/rag/retrieval.py"
click node_llm "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/rag/llm.py"
click node_postgres "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/db/postgres.py"
click node_vectors "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/db/models/document_vector.py"
click node_tenants "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/db/models/tenant.py"
click node_mongo "https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/db/mongo.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_dashboard,node_chat,node_client,node_auth_ui,node_user toneBlue
class node_api_app,node_auth_api,node_tenant_auth,node_key_api,node_docs_api,node_query_api,node_usage_api toneAmber
class node_ingestion_task,node_loaders,node_chunker,node_embedder toneMint
class node_rag_graph,node_retrieval,node_llm toneRose
class node_postgres,node_vectors,node_tenants,node_mongo,node_groq toneIndigo
```

## Components

### Web application

- [Dashboard](https://github.com/rijin-shaji/docuvalt-ai/blob/main/frontend/src/pages/Dashboard.jsx): `frontend/src/pages/Dashboard.jsx`
- [Chat interface](https://github.com/rijin-shaji/docuvalt-ai/blob/main/frontend/src/components/ChatInterface.jsx): `frontend/src/components/ChatInterface.jsx`
- [API client](https://github.com/rijin-shaji/docuvalt-ai/blob/main/frontend/src/api/client.js): `frontend/src/api/client.js`
- [Login and signup](https://github.com/rijin-shaji/docuvalt-ai/blob/main/frontend/src/pages/Login.jsx): `frontend/src/pages/Login.jsx`

### API and identity

- [FastAPI app](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/main.py): `backend/app/main.py`
- [Auth endpoints](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/api/v1/auth.py): `backend/app/api/v1/auth.py`
- [Tenant authentication](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/core/dependencies.py): `backend/app/core/dependencies.py`
- [API key endpoints](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/api/v1/api_keys.py): `backend/app/api/v1/api_keys.py`
- [Document endpoints](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/api/v1/documents.py): `backend/app/api/v1/documents.py`
- [Query endpoints](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/api/v1/query.py): `backend/app/api/v1/query.py`
- [Usage endpoints](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/api/v1/usage.py): `backend/app/api/v1/usage.py`

### Document ingestion

- [Ingestion task](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/tasks/ingestion_tasks.py): `backend/app/tasks/ingestion_tasks.py`
- [Content loaders](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/ingestion/loaders/__init__.py): `backend/app/ingestion/loaders/__init__.py`
- [Text chunker](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/ingestion/chunker.py): `backend/app/ingestion/chunker.py`
- [Embedding](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/ingestion/embedder.py): `backend/app/ingestion/embedder.py`

### Question answering

- [RAG graph](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/rag/graph.py): `backend/app/rag/graph.py`
- [Vector retrieval](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/rag/retrieval.py): `backend/app/rag/retrieval.py`
- [Answer generation](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/rag/llm.py): `backend/app/rag/llm.py`

### Persistence

- [PostgreSQL](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/db/postgres.py): `backend/app/db/postgres.py`
- [Document vectors](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/db/models/document_vector.py): `backend/app/db/models/document_vector.py`
- [Tenant records](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/db/models/tenant.py): `backend/app/db/models/tenant.py`
- [MongoDB](https://github.com/rijin-shaji/docuvalt-ai/blob/main/backend/app/db/mongo.py): `backend/app/db/mongo.py`

### Other components

- **User**
- **Groq service**

## Connections

- User → Dashboard: uses
- Dashboard → Chat interface: opens
- Chat interface → Document endpoints: uploads files or URLs
- Chat interface → Query endpoints: sends questions
- Chat interface → API client: uploads through
- API client → FastAPI app: sends API requests
- Login and signup → Auth endpoints: submits credentials
- Auth endpoints → Tenant records: reads and writes
- Auth endpoints → PostgreSQL: uses session
- FastAPI app → Document endpoints: registers
- FastAPI app → Query endpoints: registers
- FastAPI app → Auth endpoints: registers
- FastAPI app → API key endpoints: registers
- FastAPI app → Usage endpoints: registers
- FastAPI app → MongoDB: pings health
- Document endpoints → Content loaders: dispatch unknown
- Ingestion task → Text chunker: chunks text
- Ingestion task → Embedding: embeds chunks
- Ingestion task → PostgreSQL: commits vectors
- Ingestion task → Document vectors: creates rows
- Query endpoints → Tenant authentication: requires tenant
- Query endpoints → PostgreSQL: gets session
- Query endpoints → RAG graph: invokes
- Query endpoints → Vector retrieval: retrieves for streaming
- Vector retrieval → Embedding: embeds query
- Vector retrieval → PostgreSQL: queries vectors
- Vector retrieval → Document vectors: filters and ranks
- Query endpoints → Answer generation: streams answer
- Answer generation → Groq service: requests completion
