mrkeyoor.com_
Wed 16 Sept 06:49 UTC
Dataevaluationupdated 26 Aug 2026

chroma review

Chroma is an open-source database for storing embeddings, documents, and metadata, then retrieving the closest records for a query. Python users can start it in memory or on disk, while Python, TypeScript, and Rust clients can connect to a separate local, self-hosted, or cloud server.

+62stars / 7d
Verdict

Our Chroma install took 392 seconds, and pytest ran 0 tests because 2 collection errors stopped on a missing hypothesis module. Chroma remains one of the easiest ways to put retrieval inside a Python prototype, with a clean path to persistence and client-server use. Choose it for the simple API, but validate local versus distributed behavior and pin every embedding integration before production.

We ran it

Lab card: what happened when we ran chromaScreenshot of chroma (www.trychroma.com)
Install✓ · 392s97 packages · 294 MB
Build✓ · 6s
Tests✗ · 13s0 passed · 0 failed · 2 errors of 2 (pytest)
Known vulns0(pip-audit)
Repo2133 files~460,844 lines of source · 47.1 MB · 22 CI workflows · Dockerfile

Answers from our run

Does chroma build from source?

Dependencies installed in 392 seconds (97 packages), and the build succeeded in 6 seconds. We cloned commit 93652ec into a clean Debian container with 3 CPUs and no project-specific setup.

Do chroma's tests pass?

Yes: 0 of 2 passed when we ran the project's own test command (pytest), with 2 collection errors. Some failures need services or credentials a bare container does not have.

Does chroma have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use chroma?

Teams demanding identical local and distributed behavior: Chroma's open-source page says the two modes use different storage systems and local Chroma may lack features.

What are the alternatives to chroma?

Qdrant, Weaviate, Milvus. Our Chroma install took 392 seconds, and pytest ran 0 tests because 2 collection errors stopped on a missing hypothesis module.

Setup3/5Tiny user API, but source install was slow and tests lacked a dependency
Docs5/5Clear clients, persistence, server, embedding, and cloud guidance
Community5/529,147 stars with August pushes and active issue handling
Maturity4/5Established API, while local and distributed parity remains unfinished

Discussed on

  1. hnDensity Based Retrieval Relevance6 points

Who it’s for

Python developers prototyping retrieval with a small collection API and automatic embeddings.
AI applications that need vector similarity plus document and metadata filtering.
Teams that want an Apache-licensed local database before deciding whether to run a server or use Chroma Cloud.
Developers willing to test the exact embedding function, client language, and deployment mode they choose.

Who it’s NOT for

Teams demanding identical local and distributed behavior: Chroma's open-source page says the two modes use different storage systems and local Chroma may lack features.
Rust users expecting the Python client's automatic text embedding: the Rust getting-started guide requires callers to provide embeddings directly.
Applications that need durable data from the in-memory client: the docs say its contents disappear when the program ends.
Mistral embedding users upgrading without a compatibility test: issue #7633 says Chroma v1.5.9 imports a path that fails with Mistral's Python package v2.
Contributors requiring a clean default test collection: our sandbox stopped on 2 setup errors before any test ran because hypothesis was missing.

Setup reality

Our sandbox installed 97 Python packages in 392 seconds and used 294 MB on disk. The build succeeded in 6 seconds. pytest failed after 13 seconds before running tests: 0 passed, 0 failed, and 2 collection or setup errors. The log names a missing hypothesis module in chromadb/test and an unknown asyncio_mode configuration option. pip-audit found 0 known vulnerabilities.

The shortest Python path needs only the package and an in-memory client, but that data vanishes at process exit. Persistence uses PersistentClient or a server started with a path. TypeScript and Rust require a running server; cloud use adds an API key, tenant, database, and sometimes a region-specific host.

Our test method used commit 93652ec in an unprivileged Python 3.12 Debian container with 3 CPUs, 8 GB of RAM, and no secrets. The repository had 2,133 files, about 460,844 source lines, a Dockerfile, a Compose file, and 22 CI workflows. The missing test dependency means the source setup was incomplete for the documented suite in this environment.

Chroma reduces retrieval to collections and 4 core actions

Chroma's appeal is its small mental model. Create a collection, add records, query similar records, and retrieve them by ID. Documents can carry metadata for filtering, and the Python client can turn text into embeddings automatically through a chosen embedding function. Applications may also supply their own vectors. That is enough for a notebook, a retrieval-augmented assistant, semantic search, or a first pass at document recall without designing a separate index service.

The README calls the core API 4 functions, and the getting-started guide keeps the first example similarly compact. Python can create an in-memory client in the application process. A persistent client writes database files to a path. Client-server mode changes the constructor and points at a process on port 8000. TypeScript uses the server path even for local work, while the Rust client expects callers to generate embeddings themselves. The simplicity is real, although it differs by language.

Local and distributed Chroma do not yet have full parity

Chroma's open-source documentation says single-node local Chroma and distributed Chroma use different storage subsystems. Most current engineering effort goes into the distributed system and cloud service, so local mode may temporarily lack features or behavior. The team states that full feature and API parity is a goal, along with unifying storage. Buyers should read that as a current limitation and an aspiration, not a completed migration or a dated delivery plan.

The deployment choice therefore affects more than hosting. An in-memory Python client is excellent for experiments but loses all data at process exit. PersistentClient loads and saves local data automatically. A separate server supports multiple clients and language bindings, while Chroma Cloud adds a tenant, database, API key, and region endpoint. Moving between these shapes may expose behavioral differences. A realistic evaluation should run the same add, update, filter, delete, and query cases against the intended target.

What happened when we ran it

Our sandbox installed 97 packages in 392 seconds and consumed 294 MB. Building commit 93652ec succeeded in 6 seconds. The checkout contained 2,133 files and about 460,844 source lines, using 47.1 MB. We used an unprivileged Python 3.12 Debian container with 3 CPUs, 8 GB of RAM, and no secrets. pip-audit reported 0 known vulnerabilities in the environment that the harness installed.

pytest failed after 13 seconds before executing a test. The result was 0 passed, 0 failed, and 2 collection or setup errors. One error came from bin/rust_python_compat_test.py; the other came from chromadb/test, where importing hypothesis raised ModuleNotFoundError. pytest also warned that asyncio_mode was an unknown configuration option. The log does not show why those test dependencies or plugins were absent, so we report the setup failure without assigning blame.

Embedding convenience creates dependency edges

Automatic embedding is convenient because an application can add text and query text without managing vectors. Chroma also supports swapping embedding functions or providing embeddings directly. That interface connects the database to fast-moving model SDKs, which deserves separate version tests. Issue #7633 gives a current example: Chroma v1.5.9 reportedly checks for Mistral through an import path that no longer works with version 2 of the Mistral Python package.

The issue was opened August 24, 2026 after an earlier pull request saw no activity. It is one integration report, not proof that Chroma's core indexing is broken. It does show why an embedding provider belongs in an application's lockfile and smoke suite. Add a known document, generate an embedding, query it, and verify the returned ID during upgrades. Teams that want fewer SDK edges can generate vectors in a separate service and send only numeric embeddings to Chroma.

The project is active despite an older latest release

GitHub showed 29,147 stars, 803 open issues and pull requests, and a last push on August 24, 2026. The latest GitHub release we fetched was 1.5.9 from May 5. A release date alone is weak health evidence; the later push and current issue activity show ongoing work. The README also states that PyPI and npm packages follow a Monday release cadence, with hotfixes during the week, though repository tags and package publishing can differ.

Release 1.5.9 included sharded collection rebuilds, group-by work, garbage-collection fixes, sparse indexing work, multi-region testing, and separate Python, JavaScript, and CLI package versions. That list shows a system extending beyond the notebook use case. It also explains the large Rust and Python codebase behind the small client API. Operators should track client and server compatibility together rather than assuming one package number describes every component.

Chroma is best when easy experimentation matters first

The fastest useful trial is a Python process with a few documents and an in-memory collection. If retrieval quality looks promising, switch to PersistentClient and restart the process to prove data survives. A team planning shared access should test client-server mode early, including authentication, backups, failure recovery, and the exact metadata filters used by the application. Cloud users should generate the connection profile and confirm the correct regional host.

Chroma is easy to recommend for prototypes because the first successful query takes little code. Production confidence requires more work than that friendly API suggests. Our source run never reached a test assertion, local and distributed storage still differ, and embedding adapters can break when provider SDKs move. Those are manageable risks for a team with integration tests. Without them, a server-first vector database with narrower client behavior may be the safer decision.

Alternatives

ProjectWhat it isPick it when
Qdrant gh↗A Rust vector database with filtering, persistence, and distributed deployment.pick this instead when an operations-focused vector service and explicit server boundary matter more than Chroma's embedded Python start.
WeaviateA vector database with hybrid search, modules, and a broader schema layer.pick this instead when hybrid retrieval and a server-first platform are central requirements.
Milvus gh↗A distributed vector database designed for large-scale serving and indexing.pick this instead when cluster scale and operational depth outweigh local notebook simplicity.

Sources

  1. Chroma repository and README
  2. Chroma getting-started guide
  3. Chroma open-source deployment notes
  4. Chroma 1.5.9 release notes
  5. Mistral Python v2 embedding compatibility report

More data reviews

GeoLibre · TradingView-API · os-taxonomy · Lean · bokeh · orm · the whole board →