Open-source RAG platform for companies
Your documents become an assistant that answers and shows where the answer came from. Documents, database, vector index and encryption keys stay on your infrastructure. You choose the models, and changing provider is a config file.
How ingest works
A file lands in storage and a Temporal workflow takes over: parse, chunk with a splitter chosen for the file type, generate a summary of the whole document and prepend it as its own chunk, embed densely and sparsely, upsert into the organization's Qdrant collection. It runs asynchronously, so a 400-page PDF does not block anything.
upload → parse → chunk → summarize → hybrid embed → Qdrant How answering works
A question is first rewritten into a standalone one using the conversation so far, then expanded into an alternative phrasing. Both run as hybrid searches in parallel. Qdrant fuses dense and sparse results server-side with RRF, the union is deduplicated and, when a rerank provider is configured, passed to a cross-encoder before the model sees it, with citation prompting on top.
question → standalone → +1 variant → 2× hybrid search → RRF → dedupe → rerank → answer Hybrid search is not a toggle. It is part of the schema collections are created with, so it is always on. Reranking is a toggle: it needs a feature flag and a provider's credentials, and is skipped without them. Every stage degrades rather than fails – a reranker error falls back to the raw vector order, an expansion error falls back to a single query.
Permissions at retrieval
Every chunk carries an accessible_by filter applied at query time. A document a user cannot open will not enter an answer, a citation, or the context sent to the model.
Many companies on one installation
A separate vector collection per organization, a guard in the data layer that flags any query missing its org filter, and two separate role hierarchies. One installation serves many clients, with no per-seat fees.
How it compares
| Criterion | Hosted "chat with your docs" | Your own LangChain stack | Ragen |
|---|---|---|---|
| Where your documents live | Vendor's cloud | Yours | Yours |
| Choice of model | Vendor's shortlist | Anything | Anything LiteLLM supports |
| Access control | Usually per workspace | Whatever you build | Per file and folder, enforced at retrieval |
| Multi-tenant | Per seat, per workspace | Whatever you build | Built in, org-scoped data and index |
| Retrieval quality | Opaque | Yours to tune, and to debug | Hybrid, rerank and multi-query, a recorded decision per change |
| Time to a working answer | Minutes | Weeks | Minutes, one command plus your own model keys |
| Cost shape | Per seat, forever | Your engineers' time | Your infrastructure plus model spend |
| When it breaks | Support ticket | You | You, with the source and the recorded decisions |
If your requirements are genuinely unusual, building it yourself is a legitimate answer. Ragen is the better trade when you want those decisions already made, and documented, rather than made by you.
Requirements
| Resource | Evaluating | Small production install |
|---|---|---|
| CPU | 4 cores | 4 cores or more |
| RAM | 8 GB available to Docker | 16 GB |
| Disk | 25 GB | 100 GB SSD, growing with your documents |
| Docker | 24.0 or newer, Compose 2.26 or newer | same |
| GPU | not needed | not needed |
No GPU, unless you want one
Chat, embeddings and reranking all leave through the LiteLLM proxy, so the machine running Ragen does no model inference of its own. Point LiteLLM at a hosted provider and a laptop is enough. A GPU only enters the picture if you decide to serve models yourself, which is supported and is a separate box.
Where the memory actually goes
| Service | Idle memory | Needed for |
|---|---|---|
| Presidio analyzer | 959 MB | PII masking (optional) |
| Docling | 721 MB | local document parsing |
| LiteLLM | 560 MB | every model call |
| Temporal | 97 MB | async ingest |
| Postgres | 93 MB | everything |
| Presidio anonymizer | 55 MB | PII masking (optional) |
| Qdrant | 43 MB | retrieval, grows with your index |
| LiteLLM's Postgres and Temporal UI | 38 MB | the two supporting containers |
| Total | about 2.6 GB |
Measured on an idle stack, backing services only. Two of those are optional and together account for a gigabyte: drop Presidio if you are not masking PII, and DOCUMENT_PARSER=legacy skips Docling. Qdrant is the line that moves as you add documents, because the figure above is a near-empty index. Size that one against your own corpus rather than against this table. The four Ragen applications run on top of all this and are not in the table.
Stand it up yourself
One command brings up the lot: web, API, ingest worker, admin panel and the backing services. Then upload a document and ask it something.