Migrate from Chroma to Qdrant

What You Need from Chroma

  • Chroma URL — the HTTP endpoint of your Chroma server
  • Collection name — the collection to migrate
  • Authentication — API token or basic auth credentials, if configured

Concept Mapping

ChromaQdrantNotes
CollectionCollectionOne-to-one mapping
DocumentPointEach document becomes a point
EmbeddingsVectorMapped automatically
MetadataPayloadDirect mapping
Documents (text)Payload fieldStored via --qdrant.document-field

Run the Migration

docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration chroma \
    --chroma.url 'http://localhost:8000' \
    --chroma.collection 'your-collection' \
    --qdrant.url 'https://your-instance.cloud.qdrant.io:6334' \
    --qdrant.api-key 'your-qdrant-api-key' \
    --qdrant.collection 'your-collection'

With Authentication

docker run --net=host --rm -it registry.cloud.qdrant.io/library/qdrant-migration chroma \
    --chroma.url 'https://your-chroma-host:8000' \
    --chroma.collection 'your-collection' \
    --chroma.auth-type token \
    --chroma.token 'your-chroma-token' \
    --qdrant.url 'https://your-instance.cloud.qdrant.io:6334' \
    --qdrant.api-key 'your-qdrant-api-key' \
    --qdrant.collection 'your-collection'

All Chroma-Specific Flags

FlagRequiredDescription
--chroma.urlNoChroma HTTP endpoint (default: http://localhost:8000)
--chroma.collectionYesCollection name to migrate
--chroma.tenantNoChroma tenant
--chroma.databaseNoChroma database
--chroma.auth-typeNonone, basic, or token (default: none)
--chroma.usernameNoUsername (when auth-type is basic)
--chroma.passwordNoPassword (when auth-type is basic)
--chroma.tokenNoToken (when auth-type is token)
--chroma.token-headerNoCustom header name for token auth

Qdrant-Side Options

FlagDefaultDescription
--qdrant.document-fielddocumentPayload field name to store Chroma document text
--qdrant.id-field__id__Payload field name for original Chroma IDs
--qdrant.distance-metriceuclidcosine, dot, manhattan, or euclid

Gotchas

  • Document text: Chroma stores raw document text alongside embeddings. Use --qdrant.document-field to preserve this text as a payload field in Qdrant.
  • ID mapping: Chroma uses string IDs. The migration tool maps these to Qdrant point IDs and stores the original Chroma ID in a payload field (default: __id__).
  • Distance metric: Chroma defaults to L2 distance. Verify which metric your collection uses and set --qdrant.distance-metric accordingly.

Next Steps

After migration, verify your data arrived correctly with the Migration Verification Guide.

Was this page useful?

Thank you for your feedback! 🙏

We are sorry to hear that. 😔 You can edit this page on GitHub, or create a GitHub issue.