Installation
Install indx in layers. The base package is small, and each parser, model provider, embedder, store, and framework writer is an optional extra. Start with the stack you need today; add another backend later by installing its extra and changing a slot name.
This page covers requirements, common install paths, the extras matrix, and the missing-extra errors indx raises when a selected backend is not installed.
Requirements
Section titled “Requirements”- Python 3.11+, supported on 3.11, 3.12, and 3.13. The 3.11 floor lets indx avoid backports — it relies on stdlib
tomllib, modern typing primitives (Self,LiteralString), andExceptionGroup/except*for fan-out error handling. - A virtual environment is recommended —
python -m venv .venv && . .venv/bin/activate. - No native build step. The base install works on Linux, macOS, and Windows.
Install the base package
Section titled “Install the base package”pip install indxThe base install is intentionally light. It pulls in only:
| Dependency | Role |
|---|---|
| Typer | Type-annotated CLI surface |
| Rich | Terminal rendering: progress, tables, tracebacks |
| Click | Underlying CLI argument parser Typer builds on |
| Pydantic v2 | All boundary data models and validation |
| pydantic-settings | Layered config: defaults, indx.toml, environment, CLI |
TOML parsing uses the standard library’s tomllib, so there is no parsing dependency. No parser toolchain, no Torch, no vector-DB client, and no cloud SDK is installed by the base package.
Why the core is light
Section titled “Why the core is light”indx composes parsers and models; it does not bundle them. Heavy local runtimes and cloud dependencies (Docling, Torch, Qdrant clients, OpenAI/Anthropic SDKs) are each an optional extra, never a core requirement.
That buys you several things at once:
pip install indxstays small and fast.- The cloud-backed default is explicit, not implicit.
- A local profile stays first-class.
- No vendor lock-in — swapping a backend is a config change, not a reinstall of the world.
See the architecture overview and design principles for the reasoning.
A zero-dependency run is built in
Section titled “A zero-dependency run is built in”Even with nothing but the base package installed, indx includes a complete offline stack for
plain-text corpora. Use --offline, or select the same slots explicitly, to avoid every
optional backend:
| Slot | Built-in fallback |
|---|---|
| Parser | plaintext |
| Store | jsonl (no database) |
| VLM | none (skips vision enrichment) |
| Output writer | .indx and jsonl |
indx ./docs --out ./ai-ready --offlineThat command uses plaintext, none, hash, jsonl, and .indx to produce a usable, self-contained .indx archive with no extras, no database, and no network.
The trade-off is quality and scale:
plaintextonly reads text.hashis lexical rather than semantic.jsonldoes a brute-force linear scan suited to small corpora.
Choose an install path
Section titled “Choose an install path”The recommended cloud-backed stack uses Docling for parsing, OpenAI for text enrichment and embeddings, and Qdrant for storage:
pip install "indx[cloud]"Set OPENAI_API_KEY before running:
export OPENAI_API_KEY="..."This is equivalent to pip install "indx[docling,openai,qdrant]".
The local profile — Docling parser, local Ollama LLM, BGE-M3 embedder, and Qdrant store — in one command:
pip install "indx[local]"indx[local] and indx[defaults] are aliases for the same curated bundle. After installing, two more local prerequisites complete the offline stack.
Pull an Ollama model. The local profile uses ollama:qwen2.5, so install Ollama and pull the model:
ollama pull qwen2.5Docling and BGE-M3 may download models on first run. Run the stack once while online so the weights are cached, then subsequent runs are offline.
Just the base package — no extras:
pip install indxRun the zero-dependency stack with --offline:
indx ./docs --out ./ai-ready --offlineAdd a single extra when you want a richer parser or store, for example a light Markdown-first setup:
pip install "indx[markitdown]"Every backend across all six slots — handy for trying things out or for CI:
pip install "indx[all]"This is large (it pulls Torch, multiple parsers, and several DB clients). Prefer a targeted set of extras for real projects.
The extras matrix
Section titled “The extras matrix”Each extra enables one or more implementations and pulls only that backend’s dependencies. Pick per slot.
Parsers
Section titled “Parsers”| Install | Enables | Slot |
|---|---|---|
| pip install "indx[docling]" | Docling parser (the default; high-fidelity layout, local) | parser |
| pip install "indx[markitdown]" | MarkItDown parser (lightest local option) | parser |
See choosing a parser for the trade-offs.
LLMs and VLMs
Section titled “LLMs and VLMs”| Install | Enables | Slot |
|---|---|---|
| pip install "indx[openai]" | OpenAI LLM (default gpt-5-mini), embedder, and GPT-4o VLM | llm / vlm / embed |
| pip install "indx[ollama]" | Ollama LLM (qwen2.5 in the local profile) | llm |
| pip install "indx[anthropic]" | Anthropic LLM | llm |
VLM defaults to none; enable a vision model only when you want figure and image descriptions. See enrichment with LLMs and VLMs.
Embedders
Section titled “Embedders”| Install | Enables | Slot |
|---|---|---|
| pip install "indx[openai]" | OpenAI embedder (default text-embedding-3-small, API, light) | embed |
| pip install "indx[bge]" | BGE-M3 embedder (local profile, dim 1024; pulls Torch) | embed |
Local embedding is the heaviest optional path because it pulls Torch and model weights. See choosing an embedder.
Stores
Section titled “Stores”| Install | Enables | Slot |
|---|---|---|
| pip install "indx[qdrant]" | Qdrant store (the default; embedded or server) | store |
| pip install "indx[pgvector]" | pgvector store (Postgres) | store |
| pip install "indx[chroma]" | Chroma store | store |
| pip install "indx[lancedb]" | LanceDB store (file-based, columnar) | store |
The built-in jsonl store needs no extra at all. See choosing a store.
Output / framework writers
Section titled “Output / framework writers”| Install | Enables | Slot |
|---|---|---|
| pip install "indx[langchain]" | LangChain Document writer | output |
| pip install "indx[llamaindex]" | LlamaIndex node writer | output |
The .indx and jsonl writers ship in core. See output formats.
Bundles
Section titled “Bundles”| Install | What you get |
|---|---|
| pip install "indx[cloud]" | The default cloud-backed runtime stack: Docling + OpenAI + Qdrant |
| pip install "indx[local]" / pip install "indx[defaults]" | The recommended local / air-gapped stack: Docling + Ollama + BGE-M3 + Qdrant |
| pip install "indx[all]" | Every extra above, unioned |
For the complete, authoritative list of extras and the exact packages each pulls, see the extras reference.
Combining extras
Section titled “Combining extras”Extras compose — request several at once with commas:
pip install "indx[docling,bge,qdrant,openai]"This installs the Docling parser, the local BGE-M3 embedder, the Qdrant store, and the OpenAI SDK (for an OpenAI LLM/embedder) — a typical hybrid local-parse / cloud-LLM setup.
Missing extras: actionable errors
Section titled “Missing extras: actionable errors”Because backends are optional, indx is designed so that a missing dependency produces a precise, actionable message — and only when that slot is actually selected.
-
If you select a backend whose extra is not installed (for example
store = "qdrant"withoutindx[qdrant]), the run fails fast with an error that names the exact command to fix it:MissingDependencyError: store 'qdrant' requires the 'qdrant' extra: pip install indx[qdrant] -
The error is raised lazily. The registry resolves a backend only when its slot is chosen, so an installed-but-unused plugin — or simply not having an extra you do not use — never breaks an unrelated run. An
--offlinebuild usingplaintext,hash, andjsonlis never affected by missing parser or store extras.
This behaviour, surfaced through MissingDependencyError, is the contract that lets the core stay light without trapping you later. See errors and exit codes for the full hierarchy.
Verify your install
Section titled “Verify your install”-
Confirm the CLI is on your path and prints a version:
Terminal window indx --version -
Run a build on a small directory. Use the default stack if you installed its extras and set
OPENAI_API_KEY, or use--offlinefor the zero-dependency core stack:Terminal window indx ./docs --out ./ai-ready --offline -
Inspect the resulting archive:
Terminal window indx inspect ./ai-ready/handbook.indx
If indx inspect prints a document tree and counts, your install is working. The CLI reference documents every command and flag.