The SQLite of vector databases
Chroma runs embedded in your Python process. No server, no Docker, no configuration. `import chromadb; client = chromadb.Client(); collection = client.create_collection('docs'); collection.add(embeddings=[...], documents=['doc1', 'doc2'], ids=['1', '2']); results = collection.query(query_embeddings=[...], n_results=5)`. The entire API is 10 methods. For developers who want to get RAG working in 5 minutes without infrastructure, Chroma is the right choice.
Persistence: SQLite or DuckDB under the hood
By default, Chroma stores everything in memory. For persistence, `chromadb.PersistentClient(path='./chroma_data')` uses SQLite (default) or DuckDB (for larger datasets). The persistent mode stores: embeddings as binary blobs, metadata as JSON, and an HNSW index for fast search. For 50K vectors, the database is about 150MB. Backup is copying the directory. This simplicity is the opposite of Milvus or Pinecone which need multiple services.
Performance ceiling and when to move on
Chroma with HNSW index: up to 100K vectors with sub-50ms search latency. At 500K vectors: search latency jumps to 200ms, memory usage hits 4GB. At 1M vectors: queries timeout, memory hits 8GB+. The HNSW index in Chroma is simpler than Milvus's IVF_FLAT+HNSW combination. For the saas.pet RAG, Chroma worked perfectly for 3 months with 50K document chunks. When I expanded to 200K, I migrated to Milvus.
The API design that other vector DBs should copy
Chroma's API is elegantly simple: `collection.add()`, `collection.query()`, `collection.get()`, `collection.update()`, `collection.delete()`. Metadata filtering: `collection.query(where={'source': 'pdf'})`. This is cleaner than Pinecone's namespace-based filtering and Milvus's expression-based filtering. For developers building their first RAG app, Chroma's API is the standard to beat.
ChromaDB vs pgvector vs Qdrant for prototyping
ChromaDB: embedded, 5 lines to working RAG, 100K vector limit. Best for first RAG prototype. pgvector: runs in existing Postgres, no new infra. Best if you already use Postgres. Qdrant: faster at 500K+ vectors, Rust-based, REST API. Best for projects that will grow beyond 100K quickly.