The four modes are really one decision — how far your data is allowed to go. Fully local keeps the embeddings, the reranker and the model on your machine; the ChatGPT and Claude modes keep the index local and let the answering model be remote.
An on-premises retrieval-augmented generation stack shipped as containers. An indexer walks a directory you nominate, embeddings go into a local Qdrant, and one of four modes decides where the answering model lives.
- Four modes: fully local with Ollama, a custom OpenAI-compatible LLM endpoint you already run, ChatGPT through a custom GPT, or Claude through MCP
- Recursive indexing of a root folder, covering `.pdf`, `.xls`, `.docx`, `.txt`, `.md` and `.csv`
- A local chat UI on http://localhost:3000, plus an Electron desktop app
- Choice of embedding model — any Sentence Transformer — with the vector size set to match, and a reranker for the Ollama path
- A custom-LLM path that skips Ollama and the reranker entirely, so the container build does not download the reranker model and the resource footprint drops
Docker Compose, plus Python 3.10 or newer and `uv` on the host for the MCP path. Copy `.env.sample` to `.env` and set at minimum `LOCAL_FILES_PATH` — the root folder to index — along with `EMBEDDING_MODEL_ID` and `EMBEDDING_SIZE`, which must match the model's actual embedding dimension. The Ollama path adds `OLLAMA_MODEL` and `RERANKER_MODEL`; the custom-LLM path adds `LLM_BASE_URL` and `LLM_MODEL`, with `LLM_API_KEY` optional. Start it with `docker compose -f docker-compose-mcp.yml --env-file .env up --build`, then point Claude Desktop at `uv --directory /path/to/minima/mcp-server run minima`. The ChatGPT path additionally needs `USER_ID` and `PASSWORD`, used to create the account that authorizes the custom GPT.
One command — docker compose -f docker-compose-mcp.yml --env-file .env up --build
