data-infra

Chroma

Chroma (often called ChromaDB) is an open-source vector database optimized for developer experience and fast local iteration. Where Pinecone targets production scale as a managed service, Chroma's niche is the opposite end of the workflow: a `pip install chromadb` away, runnable in-process inside a Python script, a Jupyter notebook, or a lightweight Docker container, with zero external infrastructure required to get a RAG prototype working. Why it matters for AI/SaaS builders: the fastest way to validate whether retrieval-augmented generation will actually solve a product problem is to build a throwaway prototype, and Chroma removes every piece of setup friction from that loop — no API keys, no cloud account, no billing. It has become the default vector store in LangChain and LlamaIndex "quickstart" examples for exactly this reason, and many teams ship it to production for small-to-medium datasets before "graduating" to Pinecone, Qdrant, or pgvector once they need multi-node scale or stricter operational guarantees. How it works: Chroma stores vectors, documents, and metadata together in "collections" (roughly analogous to a table). It handles the embedding step for you if you don't supply vectors directly — pass raw text and a configured embedding function, and Chroma calls out to OpenAI, Sentence-Transformers, or another provider automatically. Under the hood it uses an HNSW index (via the hnswlib library) for approximate nearest neighbor search, and persists data to disk (SQLite + Parquet-like storage) so a local collection survives process restarts. It supports metadata filtering with a Mongo-style query syntax (`where={"category": "faq", "views": {"$gt": 100}}`) and can run in a client-server mode for small production deployments. Worked example: an indie developer builds a "chat with your PDF" tool. On file upload, the backend chunks the PDF into 800-character passages with 100-character overlap, creates a Chroma collection scoped to that document (`chroma_client.create_collection(name=f"doc_{file_id}")`), and adds the chunks with `collection.add(documents=chunks, ids=chunk_ids)`. At query time, `collection.query(query_texts=["What's the termination notice period?"], n_results=4)` returns the most relevant passages, which get stitched into the LLM prompt. Because everything runs in a single Python process, the whole prototype ships in under 100 lines of code before any cloud vector database is needed. Chroma also ships a client-server mode (`chromadb.HttpClient`) for teams that want to keep the same simple API but move storage onto a shared server as a prototype starts getting real usage, softening the "graduate to a bigger database" cliff that some prototyping tools have. Chroma is maintained as a genuinely open-source project (Apache 2.0 licensed) with an optional hosted "Chroma Cloud" offering for teams who want the same API without self-hosting the server — but unlike Pinecone, running it yourself for free, with no usage-based billing, remains fully supported and is how the majority of small and mid-size teams actually run it in production today.

Related terms

More Data & Infra terms