Components
Application core
Section titled “Application core”Frontend
Section titled “Frontend”The React application provides workspace navigation, document management, research conversations, source previews, working documents, profiles, and administration surfaces. At runtime it needs the public backend base URL.
Backend
Section titled “Backend”The ASP.NET Core application owns authentication, authorization, workspace and organization rules, document and indexing orchestration, research conversations, citations, exports, provider selection, and the public API.
It is the security boundary between users and tenant-owned database or object-storage data.
PostgreSQL with pgvector
Section titled “PostgreSQL with pgvector”PostgreSQL stores application records and vector embeddings. The service is private and should not be exposed publicly. The regular backend process refuses to start with pending Entity Framework migrations; migrations must be applied deliberately before serving traffic.
Backups
Section titled “Backups”The Compose topology includes scheduled PostgreSQL backups with daily, weekly, and monthly retention. Operators remain responsible for protecting the backup destination and testing restoration.
Selectable infrastructure
Section titled “Selectable infrastructure”Garage object storage
Section titled “Garage object storage”Garage provides local S3-compatible storage. It can be replaced with AWS S3 or another compatible service by changing the S3 settings and credentials. Uploaded sources and extraction artifacts live here, so retention and recovery policies must cover this store as well as PostgreSQL.
Caddy provides reverse proxying and automatic TLS for a single-host deployment. It can be replaced by an existing proxy or ingress. The replacement must route both frontend and backend addresses and preserve trusted forwarded-header behavior.
Ollama
Section titled “Ollama”Ollama provides local chat, embedding, and reranking models when configured. On macOS, native Ollama is preferred for development because Linux containers cannot use Apple Metal acceleration.
Extractor
Section titled “Extractor”The standalone Python service uses Docling to convert supported files into structured chunks. It can run standard or vision pipelines, OCR scanned content, detect tables, and optionally enrich formulas, code, and pictures.
Each job runs in a disposable subprocess and temporary scratch directory. The production posture uses
a read-only root filesystem, dropped Linux capabilities, no-new-privileges, and tmpfs mounts.
Dependency flow
Section titled “Dependency flow”Browser → Reverse proxy → Frontend → Backend ├─ PostgreSQL + pgvector ├─ S3-compatible object storage ├─ Extractor ├─ Chat provider ├─ Embedding provider ├─ Reranking provider └─ SMTP serverOptional components are connected by configured URLs. The backend does not depend on a specific local Compose service name when an external implementation is supplied.