Chroma
Open-source embedding database for LLM applications. The default 'just install pip and start' vector store for prototypes, with first-party clients in Python and JS. SQLite-backed locally, distributed mode in cloud.
Overview
What it is and how it works
Chroma is an open-source embedding database purpose-built for retrieval workloads in LLM applications: RAG pipelines, semantic search, agent memory, and deduplication. Its core abstraction is the "collection" — a named set of documents, each stored as a vector embedding plus optional metadata and the original text. You write to a collection with add(), query it with query() (nearest-neighbor search over an embedding, optionally filtered by metadata where clauses), and Chroma handles the indexing underneath. That API surface is deliberately small, which is a large part of why it became the default choice for prototyping — a working retrieval loop is a handful of lines of Python or JS, no schema migration, no cluster to provision.
Under the hood, local Chroma persists data through SQLite for metadata/document storage and uses HNSW (via the hnswlib-derived index, more recently chromadb's own Rust-based segment engine in newer versions) for approximate nearest-neighbor search over vectors. This is a meaningful architectural choice: Chroma was built bottom-up as an embedded, single-node database first, with a client-server mode layered on top, rather than being designed from day one as a distributed system. That heritage shows up directly in the tradeoffs below — it's why setup is trivial and why very large-scale deployments eventually hit a ceiling that dedicated distributed vector engines don't.
Chroma ships as a Python package (chromadb) that can run fully in-process (embedded mode, ideal for notebooks and small scripts), as a local persistent client writing to disk, or as a standalone server process that Python/JS clients talk to over HTTP. Chroma Cloud is the managed, distributed offering for teams that outgrow single-node deployment, built on the same client API so migration from local to cloud is mostly a connection-string change rather than a rewrite. Embedding generation itself is pluggable — Chroma doesn't lock you into a specific embedding model; it accepts vectors from OpenAI, Cohere, Sentence-Transformers, or any local embedding model, and also ships convenience wrappers for common providers.
Deployment patterns
The most common Chroma deployment is the solo-developer or small-team prototype: pip install chromadb, instantiate a PersistentClient pointing at a local directory, and start adding documents — no separate service, no Docker, no auth configuration. This "just works" path is why Chroma is the vector store most LangChain and LlamaIndex tutorials default to, and why it's frequently the first vector database an engineer touches when building a RAG proof of concept.
For homelab or single-server local-AI setups (the audience this site is written for), the natural next step is running Chroma as a standalone server via chroma run or the official Docker image, colocated with an inference server (llama.cpp, Ollama, vLLM) on the same box or LAN. This gives you a persistent HTTP endpoint that multiple local scripts or a small internal app can hit concurrently, without needing distributed infrastructure. Data lives on local disk (SQLite + index segments), so backup is just a matter of snapshotting the persist directory — a meaningful advantage for anyone running fully offline or air-gapped local-AI stacks.
For team or production use at meaningful scale, operators either self-host the server mode behind a reverse proxy with their own auth layer bolted on (Chroma's built-in auth/access-control has historically been thinner than what enterprise deployments expect, so many teams add their own gateway), or move to Chroma Cloud for the managed distributed version. Self-hosting Chroma at large scale (tens of millions of vectors and up) is where operators most often start evaluating a migration to a horizontally-scaled alternative, because the single-node storage engine and index become the bottleneck.
How it compares
Against Qdrant, Chroma trades raw performance and configurability for simplicity. Qdrant is written in Rust, exposes fine-grained control over its HNSW parameters, quantization, sharding, and payload indexing, and is generally the stronger choice once you're optimizing for latency or scale at production traffic levels. Chroma's query API is easier to pick up and requires less tuning knowledge to get a reasonable result on day one, but that same lack of low-level control becomes a ceiling in high-QPS or very-large-corpus scenarios.
Against Milvus, the gap is architectural: Milvus was designed from the ground up as a distributed system (separate compute/storage layers, multiple index types, Kubernetes-native operation) aimed squarely at billion-vector scale. Chroma at that scale is fighting its own single-node roots. For teams that know upfront they need to serve enormous corpora with elastic scaling, Milvus (or Milvus-based managed services like Zilliz) is the more appropriate starting point even though it costs far more operational complexity to stand up.
Against pgvector, the comparison is different in kind — pgvector isn't a dedicated vector database but a Postgres extension. Teams that already run Postgres and want vector search without adding a new service to their stack often prefer pgvector for operational simplicity (one database to back up, monitor, and secure) at the cost of the retrieval-specific ergonomics Chroma provides out of the box (collections, native metadata filtering conventions, first-class embedding-function plumbing).
FAISS is worth a mention too: it's a library, not a database — no persistence, no server, no metadata filtering built in. Chroma is essentially what you get when you wrap FAISS-like ANN search in an actual database with a document store and a real API, which is precisely the gap it was built to fill.
Best use cases and honest limitations
Chroma is the right call for local-first RAG prototypes, small-to-medium production RAG applications, agent memory stores, and any scenario where developer velocity and trivial local setup matter more than squeezing out maximum query throughput. Its Python ergonomics and active community (reflected in its widely-cited ~17k GitHub stars) mean documentation, tutorials, and framework integrations (LangChain, LlamaIndex, Haystack) are mature and easy to find, which shortens the path from idea to working retrieval loop considerably.
The honest limitations line up with the stated cons: performance trails Qdrant and Milvus once you're past roughly the 100M-vector mark or need to sustain high concurrent query loads, and the schema flexibility that makes Chroma pleasant to use (loosely-typed metadata, no upfront index tuning) comes at a real query-speed cost compared to engines that force you to declare and index your schema upfront. Chroma also historically lagged on production-grade access control and multi-tenancy compared to purpose-built enterprise vector platforms, though Chroma Cloud narrows that gap for teams willing to pay for a managed service.
If you're building a local-AI stack that needs to stay entirely on your own hardware, has a corpus in the thousands-to-low-millions of documents range, and you value getting from zero to a working retrieval pipeline in minutes, Chroma remains a solid, low-friction default. If you already know you're targeting tens of millions of vectors with strict latency SLAs, or you need fine-grained control over indexing and sharding from day one, you're better served starting with Qdrant or Milvus and accepting the extra setup cost upfront rather than migrating off Chroma later.
Stack & relationships
How Chroma relates to other entries in the catalog — recommended pairings, alternatives, dependencies, and edges to avoid. Each edge carries a one-line operator note from our editorial team.
Works with
- Works withAnythingLLM
Drop-in alternative to LanceDB. Pick when you want a real DB with introspection tooling.
Alternatives
- Alternative toQdrant
Chroma is the simplest dev-experience vector store; Qdrant is the production upgrade once your collection sizes outgrow Chroma's single-node design.
- Competes withLanceDB
LanceDB stores vectors in Arrow files on disk — embeddable, zero-server. Chroma has a similar embeddable mode. LanceDB scales further before needing a real server.
- Alternative toLanceDB
Both are embedded-first; LanceDB scales further before needing a server, Chroma has the simpler dev experience. Pick LanceDB for workstation-tier RAG; Chroma for prototyping.
Pros
- Trivial local setup
- Strong Python ergonomics
- Active 17k★ community
Cons
- Performance trails Qdrant/Milvus at 100M+ vectors
- Schema flexibility costs query speed
Compatibility
| Operating systems | macOS Linux Windows |
| GPU backends | n/a |
| License | Open source · free (OSS) + managed cloud |
Runtime health
Operator-grade signals on how actively Chroma is being maintained, how fresh its measurements are, and what failure classes operators have flagged. Every label below is anchored to a real date or count — we never infer maintainer activity we can't show.
Release cadence
Derived from the most recent editorial signal on this row.
32 days since last refresh · source: enrichedAt
Benchmark freshness
How recent the editorial measurements on this runtime are.
No editorial benchmarks for this runtime yet.
Community reproduction
Submissions that match an editorial measurement on similar hardware.
No community reproductions on file yet.
Get Chroma
Frequently asked
Is Chroma free?
What operating systems does Chroma support?
Does Chroma need a GPU?
Reviewed by RunLocalAI Editorial. See our editorial policy for how we evaluate tools.
Related — keep moving
Verify Chroma runs on your specific hardware before committing money.