Tech Stack
The table below lists every fixed technology decision in the v1 stack. These are not configurable — changing any of them constitutes a structural change to the application.
Fixed Decisions
| Layer | Technology | Rationale |
|---|---|---|
| Frontend | SvelteKit + TypeScript + Tailwind CSS | Simpler component model, file-based routing, clean minimal shell |
| Backend | Python 3.13+ + FastAPI + Pydantic | Model orchestration fit, streaming support, Pydantic contracts |
| ORM | SQLAlchemy 2.x + Alembic | Type-safe queries, migration management |
| Database | PostgreSQL 16 + pgvector | Primary relational store + vector search in one system |
| Auth | Supabase Auth (GoTrue) | Email/password, JWT sessions; app enforces authorization |
| Object Storage | Supabase Storage / S3-compatible | Single object-store abstraction |
| Background Queue | Redis + RQ | Lightweight, sufficient for ingestion jobs |
| Chat Streaming | Server-Sent Events (SSE) | Simpler than WebSockets for one-way token streaming |
| LLM Providers | OpenAI, Anthropic, OpenRouter, Ollama | One active provider at a time |
Notes
React is not part of the v1 stack. The application frontend is built entirely with SvelteKit. The documentation site (this site) uses Docusaurus, which is React-based, but it is a separate artifact from the application itself.
One active LLM provider at a time. The application supports OpenAI, Anthropic, OpenRouter, and Ollama as provider options, but only a single provider/model is active globally at any given time. Switching providers is done through the Admin settings UI.
pgvector eliminates a separate vector database. Storing embeddings directly in PostgreSQL via the pgvector extension keeps the infrastructure footprint small and avoids the operational overhead of a dedicated vector store.
SSE over WebSockets for streaming. Chat token streaming is a one-way server-to-client flow. Server-Sent Events are sufficient and simpler to operate than a full WebSocket connection.