# nishita786/lexicon-gate architecture

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

- Interactive diagram: https://gitdiagram.com/nishita786/lexicon-gate
- Repository: https://github.com/nishita786/lexicon-gate

## Overview

Lexicon Gate is a research desk centered on evidence-grounded Q&A over a user’s library. Its main workflow is sign-in, add sources, then ask: the backend retrieves evidence, gates its sufficiency, drafts, verifies claims, and returns a supported answer or abstains. The product also supports paper discovery, manuscript writing and review, collaboration, paper comparison, and events. The README documents the answer loop and optional services; sampled excerpts do not expose every route-to-service call, so uncertain wiring is omitted.

Main entry points: [`backend/app/main.py`](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/main.py) (FastAPI app), [`backend/app/pipelines/runner.py`](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/pipelines/runner.py) (Answer pipeline), [`backend/app/api/routes.py`](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/routes.py) (Core API routes), [`backend/app/api/projects.py`](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/projects.py) (Projects API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Web client"]
  node_webapp["Research desk UI<br/>[App.jsx]"]
  node_webapi["HTTP client<br/>[api.js]"]
  node_authscreen["Sign-in UI<br/>[Auth.jsx]"]
  node_writeui["Write interface<br/>[Write.jsx]"]
end

subgraph group_api["API and identity"]
  node_app["FastAPI app<br/>[main.py]"]
  node_authapi["Authentication API<br/>[auth.py]"]
  node_authgate["Auth middleware<br/>[auth_gate.py]"]
  node_routes["Core API routes<br/>[routes.py]"]
  node_authservice["Auth services<br/>[sessions.py]"]
  node_supabase[("Supabase persistence<br/>[client.py]")]
end

subgraph group_answer["Grounded answers"]
  node_runner["Answer pipeline<br/>[runner.py]"]
  node_analysis["Query analysis<br/>[query_analysis.py]"]
  node_retrieval["Hybrid retrieval<br/>[hybrid.py]"]
  node_gate["Evidence gate<br/>[evidence_gate.py]"]
  node_generation["Answer generation<br/>[registry.py]"]
  node_extractive["Extractive generator"]
  node_verification["Claim verification<br/>[claim_verifier.py]"]
end

subgraph group_library["Library and discovery"]
  node_knowledge[("Knowledge base<br/>[knowledge_base.py]")]
  node_vectorstore[("Vector store<br/>[registry.py]")]
  node_ingestion["Source ingestion<br/>[loaders.py]"]
  node_papersearch["Paper discovery<br/>[search.py]"]
  node_paperimport["Paper import<br/>[import_paper.py]"]
end

subgraph group_workspace["Research workspace"]
  node_projectsapi["Projects API<br/>[projects.py]"]
  node_manuscript["Manuscript tools<br/>[manuscript_ai.py]"]
  node_review["Manuscript review"]
  node_projectstore[("Project storage<br/>[store.py]")]
  node_storiesapi["Stories API<br/>[stories.py]"]
  node_storystore[("Story storage<br/>[store.py]")]
  node_workspaceapi["Workspace API<br/>[workspace.py]"]
  node_eventsapi["Events API<br/>[events.py]"]
  node_eventcatalog["Event catalog<br/>[catalog.py]"]
  node_compare["Paper comparison<br/>[paper_structure.py]"]
end

node_researcher(("Researcher"))
node_externalpapers(("Paper indexes"))

node_researcher -->|"uses"| node_webapp
node_webapp -->|"requests"| node_webapi
node_authscreen -->|"signs in"| node_webapi
node_webapi -->|"calls API"| node_app
node_app -->|"dispatches"| node_authapi
node_app -->|"dispatches"| node_routes
node_app -->|"dispatches"| node_projectsapi
node_app -->|"dispatches"| node_storiesapi
node_app -->|"dispatches"| node_workspaceapi
node_app -->|"dispatches"| node_eventsapi
node_authapi -->|"manages sessions"| node_authservice
node_authgate -->|"checks sessions"| node_authservice
node_authservice -.->|"persists optionally"| node_supabase
node_routes -->|"runs queries"| node_runner
node_runner -->|"analyzes query"| node_analysis
node_runner -->|"retrieves evidence"| node_retrieval
node_retrieval -->|"searches library"| node_knowledge
node_knowledge -->|"uses index"| node_vectorstore
node_runner -->|"assesses evidence"| node_gate
node_runner -->|"requests draft"| node_generation
node_generation -->|"selects provider"| node_extractive
node_runner -->|"checks claims"| node_verification
node_routes -->|"loads sources"| node_ingestion
node_ingestion -->|"indexes chunks"| node_knowledge
node_routes -->|"searches papers"| node_papersearch
node_papersearch -->|"queries indexes"| node_externalpapers
node_routes -->|"imports papers"| node_paperimport
node_paperimport -->|"loads source"| node_ingestion
node_writeui -->|"requests"| node_webapi
node_projectsapi -->|"supports drafting"| node_manuscript
node_projectsapi -->|"reviews evidence"| node_review
node_projectsapi -->|"reads and writes"| node_projectstore
node_storiesapi -->|"reads and writes"| node_storystore
node_workspaceapi -->|"compares papers"| node_compare
node_eventsapi -->|"browses events"| node_eventcatalog

click node_webapp "https://github.com/nishita786/lexicon-gate/blob/main/frontend/src/App.jsx"
click node_webapi "https://github.com/nishita786/lexicon-gate/blob/main/frontend/src/api.js"
click node_authscreen "https://github.com/nishita786/lexicon-gate/blob/main/frontend/src/Auth.jsx"
click node_app "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/main.py"
click node_authapi "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/auth.py"
click node_authgate "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/auth_gate.py"
click node_routes "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/routes.py"
click node_authservice "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/auth/sessions.py"
click node_supabase "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/supabase/client.py"
click node_runner "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/pipelines/runner.py"
click node_analysis "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/retrieval/query_analysis.py"
click node_retrieval "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/retrieval/hybrid.py"
click node_knowledge "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/store/knowledge_base.py"
click node_vectorstore "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/vectorstore/registry.py"
click node_ingestion "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/ingestion/loaders.py"
click node_papersearch "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/papers/search.py"
click node_paperimport "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/papers/import_paper.py"
click node_gate "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/verification/evidence_gate.py"
click node_generation "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/llm/registry.py"
click node_extractive "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/llm/extractive_engine.py"
click node_verification "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/verification/claim_verifier.py"
click node_writeui "https://github.com/nishita786/lexicon-gate/blob/main/frontend/src/Write.jsx"
click node_projectsapi "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/projects.py"
click node_manuscript "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/projects/manuscript_ai.py"
click node_review "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/projects/manuscript_review.py"
click node_projectstore "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/projects/store.py"
click node_storiesapi "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/stories.py"
click node_storystore "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/stories/store.py"
click node_workspaceapi "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/workspace.py"
click node_eventsapi "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/events.py"
click node_eventcatalog "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/events/catalog.py"
click node_compare "https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/extraction/paper_structure.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_webapp,node_webapi,node_authscreen,node_writeui toneBlue
class node_app,node_authapi,node_authgate,node_routes,node_authservice,node_supabase toneAmber
class node_runner,node_analysis,node_retrieval,node_gate,node_generation,node_extractive,node_verification toneMint
class node_knowledge,node_vectorstore,node_ingestion,node_papersearch,node_paperimport toneRose
class node_projectsapi,node_manuscript,node_review,node_projectstore,node_storiesapi,node_storystore,node_workspaceapi,node_eventsapi,node_eventcatalog,node_compare,node_researcher,node_externalpapers toneIndigo
```

## Components

### Web client

- [Research desk UI](https://github.com/nishita786/lexicon-gate/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [HTTP client](https://github.com/nishita786/lexicon-gate/blob/main/frontend/src/api.js): `frontend/src/api.js`
- [Sign-in UI](https://github.com/nishita786/lexicon-gate/blob/main/frontend/src/Auth.jsx): `frontend/src/Auth.jsx`
- [Write interface](https://github.com/nishita786/lexicon-gate/blob/main/frontend/src/Write.jsx): `frontend/src/Write.jsx`

### API and identity

- [FastAPI app](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/main.py): `backend/app/main.py`
- [Authentication API](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/auth.py): `backend/app/api/auth.py`
- [Auth middleware](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/auth_gate.py): `backend/app/api/auth_gate.py`
- [Core API routes](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/routes.py): `backend/app/api/routes.py`
- [Auth services](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/auth/sessions.py): `backend/app/services/auth/sessions.py`
- [Supabase persistence](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/supabase/client.py): `backend/app/services/supabase/client.py`

### Grounded answers

- [Answer pipeline](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/pipelines/runner.py): `backend/app/pipelines/runner.py`
- [Query analysis](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/retrieval/query_analysis.py): `backend/app/retrieval/query_analysis.py`
- [Hybrid retrieval](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/retrieval/hybrid.py): `backend/app/retrieval/hybrid.py`
- [Evidence gate](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/verification/evidence_gate.py): `backend/app/verification/evidence_gate.py`
- [Answer generation](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/llm/registry.py): `backend/app/services/llm/registry.py`
- [Extractive generator](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/llm/extractive_engine.py): `backend/app/services/llm/extractive_engine.py`
- [Claim verification](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/verification/claim_verifier.py): `backend/app/verification/claim_verifier.py`

### Library and discovery

- [Knowledge base](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/store/knowledge_base.py): `backend/app/services/store/knowledge_base.py`
- [Vector store](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/vectorstore/registry.py): `backend/app/services/vectorstore/registry.py`
- [Source ingestion](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/ingestion/loaders.py): `backend/app/services/ingestion/loaders.py`
- [Paper discovery](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/papers/search.py): `backend/app/services/papers/search.py`
- [Paper import](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/papers/import_paper.py): `backend/app/services/papers/import_paper.py`

### Research workspace

- [Projects API](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/projects.py): `backend/app/api/projects.py`
- [Manuscript tools](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/projects/manuscript_ai.py): `backend/app/services/projects/manuscript_ai.py`
- [Manuscript review](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/projects/manuscript_review.py): `backend/app/services/projects/manuscript_review.py`
- [Project storage](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/projects/store.py): `backend/app/services/projects/store.py`
- [Stories API](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/stories.py): `backend/app/api/stories.py`
- [Story storage](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/stories/store.py): `backend/app/services/stories/store.py`
- [Workspace API](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/workspace.py): `backend/app/api/workspace.py`
- [Events API](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/api/events.py): `backend/app/api/events.py`
- [Event catalog](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/events/catalog.py): `backend/app/services/events/catalog.py`
- [Paper comparison](https://github.com/nishita786/lexicon-gate/blob/main/backend/app/services/extraction/paper_structure.py): `backend/app/services/extraction/paper_structure.py`

### Other components

- **Researcher**
- **Paper indexes**

## Connections

- Researcher → Research desk UI: uses
- Research desk UI → HTTP client: requests
- Sign-in UI → HTTP client: signs in
- HTTP client → FastAPI app: calls API
- FastAPI app → Authentication API: dispatches
- FastAPI app → Core API routes: dispatches
- FastAPI app → Projects API: dispatches
- FastAPI app → Stories API: dispatches
- FastAPI app → Workspace API: dispatches
- FastAPI app → Events API: dispatches
- Authentication API → Auth services: manages sessions
- Auth middleware → Auth services: checks sessions
- Auth services → Supabase persistence: persists optionally
- Core API routes → Answer pipeline: runs queries
- Answer pipeline → Query analysis: analyzes query
- Answer pipeline → Hybrid retrieval: retrieves evidence
- Hybrid retrieval → Knowledge base: searches library
- Knowledge base → Vector store: uses index
- Answer pipeline → Evidence gate: assesses evidence
- Answer pipeline → Answer generation: requests draft
- Answer generation → Extractive generator: selects provider
- Answer pipeline → Claim verification: checks claims
- Core API routes → Source ingestion: loads sources
- Source ingestion → Knowledge base: indexes chunks
- Core API routes → Paper discovery: searches papers
- Paper discovery → Paper indexes: queries indexes
- Core API routes → Paper import: imports papers
- Paper import → Source ingestion: loads source
- Write interface → HTTP client: requests
- Projects API → Manuscript tools: supports drafting
- Projects API → Manuscript review: reviews evidence
- Projects API → Project storage: reads and writes
- Stories API → Story storage: reads and writes
- Workspace API → Paper comparison: compares papers
- Events API → Event catalog: browses events
