# sashantnipate/nitiassist architecture

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

- Interactive diagram: https://gitdiagram.com/sashantnipate/nitiassist
- Repository: https://github.com/sashantnipate/nitiassist

## Overview

NitiAssist is an authenticated assistant for financial-policy questions, with chat, web research, document analysis, and personalized scheme discovery. The principal workflow runs from the chat UI through Convex message storage and an Inngest event to agent processing, optional Firecrawl research, and a saved response that Convex updates reactively. The graph also preserves document upload/analysis, onboarding, and scheme-discovery capabilities. Some feature wiring is documented in the README or function registration; unverified links are dashed. Unsampled implementations are represented only at supported paths.

Main entry points: [`convex/schema.ts`](https://github.com/sashantnipate/nitiassist/blob/main/convex/schema.ts) (Convex data), [`features/chat/components/Chat.tsx`](https://github.com/sashantnipate/nitiassist/blob/main/features/chat/components/Chat.tsx) (Chat interface), [`features/chat/inngest/analyze-images.ts`](https://github.com/sashantnipate/nitiassist/blob/main/features/chat/inngest/analyze-images.ts) (Document analysis), [`app/api/inngest/route.ts`](https://github.com/sashantnipate/nitiassist/blob/main/app/api/inngest/route.ts) (Event endpoint)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["User experience"]
  node_app["App shell<br/>[layout.tsx]"]
  node_chat["Chat interface<br/>[Chat.tsx]"]
  node_chatmessages["Message renderer<br/>[ChatMessages.tsx]"]
  node_prompt["Prompt composer<br/>[ChatPrompt.tsx]"]
  node_sidebar["Conversation sidebar<br/>[Sidebar.tsx]"]
end

subgraph group_data["Identity and data"]
  node_auth["Clerk auth<br/>[page.tsx]"]
  node_convexprovider["Convex client"]
  node_hooks["Conversation hooks<br/>[useConversation.ts]"]
  node_documents_hooks["Document hooks<br/>[useDocuments.ts]"]
  node_convex[("Convex data<br/>[schema.ts]")]
end

subgraph group_assistant["Assistant workflows"]
  node_chat_action["Message actions<br/>[process-message.ts]"]
  node_inngest["Event endpoint<br/>[route.ts]"]
  node_processor["Chat agent network<br/>[process-message.ts]"]
  node_webtools["Web research tools"]
end

subgraph group_discovery["Documents and schemes"]
  node_document_library["Document library<br/>[Library.tsx]"]
  node_upload["Document upload<br/>[upload-document.ts]"]
  node_upload_api["R2 upload API<br/>[route.ts]"]
  node_doc_analysis["Document analysis<br/>[analyze-images.ts]"]
  node_onboarding["Onboarding<br/>[OnboardingFlow.tsx]"]
  node_scheme_ui["Scheme dashboard"]
  node_scheme_discovery["Scheme discovery"]
  node_scheme_search["Scheme search<br/>[search-schemes.ts]"]
end

node_user(("User"))
node_firecrawl["Firecrawl"]
node_r2[("Cloudflare R2")]
node_openai["OpenAI"]

node_user -->|"signs in"| node_auth
node_user -->|"asks question"| node_chat
node_app -->|"opens"| node_chat
node_chat -->|"renders"| node_prompt
node_chat -->|"renders"| node_chatmessages
node_app -.->|"shows"| node_sidebar
node_chat -->|"uses"| node_hooks
node_sidebar -->|"uses"| node_hooks
node_convexprovider -->|"uses identity"| node_auth
node_hooks -->|"queries and mutates"| node_convex
node_chat -->|"submits message"| node_chat_action
node_chat_action -->|"emits event"| node_inngest
node_inngest -->|"dispatches"| node_processor
node_processor -->|"loads and saves messages"| node_convex
node_processor -->|"uses tools"| node_webtools
node_webtools -->|"searches and scrapes"| node_firecrawl
node_chatmessages -->|"shows reactive updates"| node_convex
node_user -.->|"manages documents"| node_document_library
node_document_library -->|"uses"| node_documents_hooks
node_documents_hooks -->|"queries and mutates"| node_convex
node_document_library -->|"uploads"| node_upload
node_upload -->|"requests signed URL"| node_upload_api
node_upload_api -->|"signs storage operations"| node_r2
node_upload -.->|"registers document"| node_convex
node_upload -->|"triggers analysis"| node_doc_analysis
node_inngest -->|"dispatches"| node_doc_analysis
node_doc_analysis -->|"reads document"| node_r2
node_doc_analysis -->|"loads and saves description"| node_convex
node_doc_analysis -->|"analyzes content"| node_openai
node_user -.->|"provides profile"| node_onboarding
node_onboarding -->|"starts discovery"| node_scheme_ui
node_scheme_ui -.->|"requests discovery"| node_scheme_discovery
node_inngest -->|"dispatches"| node_scheme_discovery
node_scheme_discovery -.->|"uses search tool"| node_scheme_search
node_scheme_discovery -.->|"stores discovered schemes"| node_convex

click node_auth "https://github.com/sashantnipate/nitiassist/blob/main/app/(auth)/sign-in/%5B%5B...sign-in%5D%5D/page.tsx"
click node_app "https://github.com/sashantnipate/nitiassist/blob/main/app/(app)/layout.tsx"
click node_chat "https://github.com/sashantnipate/nitiassist/blob/main/features/chat/components/Chat.tsx"
click node_chatmessages "https://github.com/sashantnipate/nitiassist/blob/main/features/chat/components/ChatMessages.tsx"
click node_prompt "https://github.com/sashantnipate/nitiassist/blob/main/features/chat/components/ChatPrompt.tsx"
click node_sidebar "https://github.com/sashantnipate/nitiassist/blob/main/features/side-layout/components/Sidebar.tsx"
click node_convexprovider "https://github.com/sashantnipate/nitiassist/blob/main/components/ConvexClientProvider.tsx"
click node_hooks "https://github.com/sashantnipate/nitiassist/blob/main/hooks/useConversation.ts"
click node_documents_hooks "https://github.com/sashantnipate/nitiassist/blob/main/hooks/useDocuments.ts"
click node_convex "https://github.com/sashantnipate/nitiassist/blob/main/convex/schema.ts"
click node_chat_action "https://github.com/sashantnipate/nitiassist/blob/main/features/chat/actions/process-message.ts"
click node_inngest "https://github.com/sashantnipate/nitiassist/blob/main/app/api/inngest/route.ts"
click node_processor "https://github.com/sashantnipate/nitiassist/blob/main/features/chat/inngest/process-message.ts"
click node_webtools "https://github.com/sashantnipate/nitiassist/blob/main/features/chat/inngest/tools/firecrawl-search.ts"
click node_document_library "https://github.com/sashantnipate/nitiassist/blob/main/features/chat/components/Library.tsx"
click node_upload "https://github.com/sashantnipate/nitiassist/blob/main/features/documents/upload-document.ts"
click node_upload_api "https://github.com/sashantnipate/nitiassist/blob/main/app/api/uploads/r2/route.ts"
click node_doc_analysis "https://github.com/sashantnipate/nitiassist/blob/main/features/chat/inngest/analyze-images.ts"
click node_onboarding "https://github.com/sashantnipate/nitiassist/blob/main/features/onboarding/components/OnboardingFlow.tsx"
click node_scheme_ui "https://github.com/sashantnipate/nitiassist/blob/main/features/schemes/components/SchemesDashboard.tsx"
click node_scheme_discovery "https://github.com/sashantnipate/nitiassist/blob/main/features/schemes/inngest/discover-schemes.ts"
click node_scheme_search "https://github.com/sashantnipate/nitiassist/blob/main/features/schemes/inngest/tools/search-schemes.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_app,node_chat,node_chatmessages,node_prompt,node_sidebar,node_user toneBlue
class node_auth,node_convexprovider,node_hooks,node_documents_hooks,node_convex,node_r2 toneAmber
class node_chat_action,node_inngest,node_processor,node_webtools toneMint
class node_document_library,node_upload,node_upload_api,node_doc_analysis,node_onboarding,node_scheme_ui,node_scheme_discovery,node_scheme_search toneRose
class node_firecrawl,node_openai toneIndigo
```

## Components

### User experience

- [App shell](https://github.com/sashantnipate/nitiassist/blob/main/app/(app)/layout.tsx): `app/(app)/layout.tsx`
- [Chat interface](https://github.com/sashantnipate/nitiassist/blob/main/features/chat/components/Chat.tsx): `features/chat/components/Chat.tsx`
- [Message renderer](https://github.com/sashantnipate/nitiassist/blob/main/features/chat/components/ChatMessages.tsx): `features/chat/components/ChatMessages.tsx`
- [Prompt composer](https://github.com/sashantnipate/nitiassist/blob/main/features/chat/components/ChatPrompt.tsx): `features/chat/components/ChatPrompt.tsx`
- [Conversation sidebar](https://github.com/sashantnipate/nitiassist/blob/main/features/side-layout/components/Sidebar.tsx): `features/side-layout/components/Sidebar.tsx`

### Identity and data

- [Clerk auth](https://github.com/sashantnipate/nitiassist/blob/main/app/(auth)/sign-in/%5B%5B...sign-in%5D%5D/page.tsx): `app/(auth)/sign-in/[[...sign-in]]/page.tsx`
- [Convex client](https://github.com/sashantnipate/nitiassist/blob/main/components/ConvexClientProvider.tsx): `components/ConvexClientProvider.tsx`
- [Conversation hooks](https://github.com/sashantnipate/nitiassist/blob/main/hooks/useConversation.ts): `hooks/useConversation.ts`
- [Document hooks](https://github.com/sashantnipate/nitiassist/blob/main/hooks/useDocuments.ts): `hooks/useDocuments.ts`
- [Convex data](https://github.com/sashantnipate/nitiassist/blob/main/convex/schema.ts): `convex/schema.ts`

### Assistant workflows

- [Message actions](https://github.com/sashantnipate/nitiassist/blob/main/features/chat/actions/process-message.ts): `features/chat/actions/process-message.ts`
- [Event endpoint](https://github.com/sashantnipate/nitiassist/blob/main/app/api/inngest/route.ts): `app/api/inngest/route.ts`
- [Chat agent network](https://github.com/sashantnipate/nitiassist/blob/main/features/chat/inngest/process-message.ts): `features/chat/inngest/process-message.ts`
- [Web research tools](https://github.com/sashantnipate/nitiassist/blob/main/features/chat/inngest/tools/firecrawl-search.ts): `features/chat/inngest/tools/firecrawl-search.ts`

### Documents and schemes

- [Document library](https://github.com/sashantnipate/nitiassist/blob/main/features/chat/components/Library.tsx): `features/chat/components/Library.tsx`
- [Document upload](https://github.com/sashantnipate/nitiassist/blob/main/features/documents/upload-document.ts): `features/documents/upload-document.ts`
- [R2 upload API](https://github.com/sashantnipate/nitiassist/blob/main/app/api/uploads/r2/route.ts): `app/api/uploads/r2/route.ts`
- [Document analysis](https://github.com/sashantnipate/nitiassist/blob/main/features/chat/inngest/analyze-images.ts): `features/chat/inngest/analyze-images.ts`
- [Onboarding](https://github.com/sashantnipate/nitiassist/blob/main/features/onboarding/components/OnboardingFlow.tsx): `features/onboarding/components/OnboardingFlow.tsx`
- [Scheme dashboard](https://github.com/sashantnipate/nitiassist/blob/main/features/schemes/components/SchemesDashboard.tsx): `features/schemes/components/SchemesDashboard.tsx`
- [Scheme discovery](https://github.com/sashantnipate/nitiassist/blob/main/features/schemes/inngest/discover-schemes.ts): `features/schemes/inngest/discover-schemes.ts`
- [Scheme search](https://github.com/sashantnipate/nitiassist/blob/main/features/schemes/inngest/tools/search-schemes.ts): `features/schemes/inngest/tools/search-schemes.ts`

### Other components

- **User**
- **Firecrawl**
- **Cloudflare R2**
- **OpenAI**

## Connections

- User → Clerk auth: signs in
- User → Chat interface: asks question
- App shell → Chat interface: opens
- Chat interface → Prompt composer: renders (evidence: `features/chat/components/Chat.tsx`)
- Chat interface → Message renderer: renders (evidence: `features/chat/components/Chat.tsx`)
- App shell → Conversation sidebar: shows
- Chat interface → Conversation hooks: uses (evidence: `features/chat/components/Chat.tsx`)
- Conversation sidebar → Conversation hooks: uses
- Convex client → Clerk auth: uses identity (evidence: `components/ConvexClientProvider.tsx`)
- Conversation hooks → Convex data: queries and mutates (evidence: `hooks/useConversation.ts`)
- Chat interface → Message actions: submits message (evidence: `features/chat/components/Chat.tsx`)
- Message actions → Event endpoint: emits event
- Event endpoint → Chat agent network: dispatches (evidence: `app/api/inngest/route.ts`)
- Chat agent network → Convex data: loads and saves messages
- Chat agent network → Web research tools: uses tools (evidence: `features/chat/inngest/process-message.ts`)
- Web research tools → Firecrawl: searches and scrapes
- Message renderer → Convex data: shows reactive updates
- User → Document library: manages documents
- Document library → Document hooks: uses (evidence: `features/chat/components/Library.tsx`)
- Document hooks → Convex data: queries and mutates (evidence: `hooks/useDocuments.ts`)
- Document library → Document upload: uploads (evidence: `features/chat/components/Library.tsx`)
- Document upload → R2 upload API: requests signed URL (evidence: `features/documents/upload-document.ts`)
- R2 upload API → Cloudflare R2: signs storage operations (evidence: `app/api/uploads/r2/route.ts`)
- Document upload → Convex data: registers document
- Document upload → Document analysis: triggers analysis (evidence: `features/documents/upload-document.ts`)
- Event endpoint → Document analysis: dispatches (evidence: `app/api/inngest/route.ts`)
- Document analysis → Cloudflare R2: reads document (evidence: `features/chat/inngest/analyze-images.ts`)
- Document analysis → Convex data: loads and saves description (evidence: `features/chat/inngest/analyze-images.ts`)
- Document analysis → OpenAI: analyzes content (evidence: `features/chat/inngest/analyze-images.ts`)
- User → Onboarding: provides profile
- Onboarding → Scheme dashboard: starts discovery (evidence: `features/onboarding/components/OnboardingFlow.tsx`)
- Scheme dashboard → Scheme discovery: requests discovery
- Event endpoint → Scheme discovery: dispatches (evidence: `app/api/inngest/route.ts`)
- Scheme discovery → Scheme search: uses search tool
- Scheme discovery → Convex data: stores discovered schemes
