What ChromaDB is and why it exists
ChromaDB is an in-process vector database for Python and JavaScript. The promise: SQLite simplicity for vector search. The repository has 18.7K stars on GitHub (as of 2026-07-25) and the maintainers include the original authors of the OpenAI retrieval cookbook. The architecture is straightforward: a client object owns collections, each collection holds documents, embeddings, and metadata. The HNSW (Hierarchical Navigable Small World) index runs in memory for fast similarity search. For the first 60 days of saas.pet semantic review search, ChromaDB held 50K vectors, served 200 queries per day, and never exceeded 4GB RAM on a single Hetzner CX31. For developers building any RAG project in 2026, ChromaDB is the fastest way from pip install to semantic search working. The only thing ChromaDB requires: pip install chromadb and a working Python environment.
The SQLite of vector databases
ChromaDB runs embedded in your Python process. No server, no Docker, no configuration. The minimal example is 5 lines: client = chromadb.PersistentClient(path='./data'), collection = client.get_or_create_collection('reviews'), collection.add(ids=['1'], documents=['review body'], embeddings=[[0.1, 0.2, ...]]), results = collection.query(query_embeddings=[[0.1, 0.2, ...]], n_results=5). The entire API surface is around 15 methods, all Pythonic, all documented with type hints. For developers who want to get RAG working in 5 minutes without infrastructure, ChromaDB is the right choice. For the saas.pet semantic search prototype, the entire search endpoint was 30 lines of Python. Compared to setting up Milvus (which requires etcd, MinIO, Pulsar, and 3 separate containers), ChromaDB is a single pip install. For prototypes and projects with under 100K vectors, use ChromaDB.
Persistence: SQLite, DuckDB, or in-memory
ChromaDB offers three persistence modes. (1) In-memory: chromadb.Client(), everything lost on restart. Good for tests. (2) SQLite-backed: chromadb.PersistentClient(path='./data'), single file, default for production. Holds up to 500K vectors on a single machine. (3) DuckDB-backed: chromadb.PersistentClient(path='./data', settings=Settings(...)), column-oriented, better for analytical queries. For saas.pet I used SQLite-backed for the 60 day period. The data directory grew to 180MB for 50K vectors at 1536 dimensions. Backup is copying the directory. Restoration is copying it back. No migration scripts needed. Compared to Pinecone (managed, no backup), Milvus (multi-component backup), and Weaviate (separate index file), ChromaDB persistence is the simplest possible. The downside: no built-in replication, no streaming inserts, no concurrent writers. For single-server deployments (which is 90% of vector projects), this is fine. For HA, you outgrow ChromaDB.
Performance: how fast is fast enough?
ChromaDB performance benchmarks on a 2023 MacBook Pro M2 with 50K vectors at 1536 dimensions: insert throughput 2K vectors per second, query latency 5-15ms for n_results=10, batch insert of 10K vectors in 8 seconds. The numbers are not industry-leading. Milvus handles 100K queries per second on a cluster. Pinecone handles 10K queries per second managed. But for saas.pet which serves 200 queries per day, ChromaDB's 5-15ms latency was 10x faster than needed. For developers building RAG, the bottleneck is rarely the vector database. The bottleneck is embedding generation (which takes 200-500ms per call) and LLM completion (which takes 2-10 seconds). Spending time optimizing from 5ms to 1ms query latency is wasted when the total request takes 3 seconds. ChromaDB is fast enough for 95% of RAG projects. For the 5% that need extreme throughput, use a different tool.
Metadata filtering: the underrated feature
ChromaDB supports metadata filtering with a where clause. collection.query(query_embeddings=[...], n_results=10, where={'category': 'AI Audio', 'rating': {'$gte': 4.0}}). For saas.pet semantic review search, the metadata includes category (audio, code, image, etc.), rating (1-5), written_by (alex, guest, community), and indexed_at (timestamp). Filtering by category before similarity search cuts the result noise in half. The filter syntax supports $eq, $ne, $gt, $gte, $lt, $lte, $in, $nin, $and, $or. For developers building any recommendation system, the metadata filtering is the feature you did not know you needed. For the saas.pet semantic search, the combined query took 20ms total: 10ms metadata filter, 10ms vector search. Without metadata filter, the result set includes irrelevant reviews. With metadata filter, the result set is curated. ChromaDB is not just a vector database; it is a hybrid vector-plus-metadata database.
The client ecosystem: Python, JavaScript, and Rust
ChromaDB ships official clients for Python (the most complete), JavaScript/TypeScript (good, in beta), and Rust (early stage). Third-party integrations include LangChain, LlamaIndex, Haystack, Pydantic AI, and 50+ other frameworks. For saas.pet I use the Python client directly, no framework overhead. For a side project with Next.js, I use the JavaScript client and it works the same way. The JavaScript client supports server-side (Node.js) and client-side (browser with the WASM build). The WASM build is 4MB and can run vector search in the browser, which is useful for offline apps. For developers using LangChain, ChromaDB is the default vector store in the documentation. For developers using LlamaIndex, ChromaDB is the recommended starting point. The ecosystem is the strongest argument for ChromaDB over FAISS (which has no clients, just a library) and over Qdrant (which has clients but a smaller ecosystem).
When ChromaDB fails: the 3 migration patterns
I migrated saas.pet away from ChromaDB after 60 days for 3 reasons. (1) Concurrent writers: ChromaDB does not handle 5 simultaneous ingestion processes well; mutex contention slows everything. (2) Vector count: at 100K vectors, query latency climbed from 10ms to 80ms (HNSW index hit a memory wall). (3) No streaming: batch insert of 1K vectors took 1 second, but RAG pipelines prefer streaming. The 3 migration patterns I considered: (A) Pinecone: managed, easy, $0.096 per million vectors after free tier. (B) Milvus: open source, self-hosted, requires etcd/MinIO/Pulsar. (C) pgvector in Supabase: zero new infrastructure if you already have Postgres. I chose (C) because saas.pet already uses Supabase. The migration took 4 hours: export ChromaDB vectors to JSON, write a SQL COPY script, build a pgvector index, swap the search endpoint. For developers hitting ChromaDB limits, pgvector in an existing Postgres is the simplest migration.
ChromaDB versus alternatives in 2026
The vector database landscape in 2026: ChromaDB, FAISS, Pinecone, Weaviate, Qdrant, Milvus, pgvector. Comparison: ChromaDB is simplest, slowest at extreme scale. FAISS is fastest library, no clients, no metadata. Pinecone is easiest managed, paid, $0.096/million vectors. Weaviate is open source, more features, more complex. Qdrant is Rust-based, faster than Chroma, similar simplicity. Milvus is most scalable, most complex. pgvector is part of Postgres, simplest if you already have Postgres. For developers choosing today: if under 50K vectors and value simplicity, use ChromaDB. If under 1M vectors and value performance, use Qdrant. If already on Postgres, use pgvector. If you want zero ops, use Pinecone. If you want maximum control, use Milvus. For saas.pet, pgvector in Supabase is the right choice. For my new indie project, ChromaDB is the right choice because the prototype has 2K vectors.
The 60-day honest verdict
After 60 days and 3 projects, the honest verdict. Pros: zero infrastructure to start, simple API, metadata filtering, multi-language clients, large ecosystem (LangChain, LlamaIndex), open source, MIT-licensed. Cons: limited concurrent writers, no streaming inserts, performance plateaus at 100K vectors, no replication, no built-in auth. For saas.pet I ran ChromaDB for 60 days before migrating to pgvector. For the 3 side projects, ChromaDB is still running because the vector count is under 5K. ChromaDB is the right tool for prototyping and small projects. ChromaDB is the wrong tool for production scale. The migration cost (4 hours) is so low that starting with ChromaDB and migrating later is a good strategy. For developers building RAG today, pip install chromadb and start building. If you outgrow it, the migration is straightforward. If you do not outgrow it, you saved weeks of infrastructure setup.