Qdrant

If your team already runs Qdrant, Recall can keep its memory there. Facts stay typed, corrections follow the same rules, and the history is kept the same way. polign_db is still the default backend and the one Recall is tested against first; a few features need it, and they are listed under What works differently.

Before you start

Run the memory server on Qdrant

  1. Start Qdrant, if it is not running yet:

    docker run -d -p 6333:6333 qdrant/qdrant
  2. Add Recall to Claude Code as an MCP server:

    claude mcp add recall \
      -e RECALL_BACKEND=qdrant \
      -e QDRANT_URL=http://localhost:6333 \
      -- recall mcp -write

    For a server that requires a key, add -e QDRANT_API_KEY=.... Leave out -write for a read-only connection. Other MCP hosts take the same command and variables, or the flags recall -backend qdrant -url http://localhost:6333 mcp -write.

  3. Restart Claude Code and ask it to remember something. The first write creates the collection, recall_lexical_v1 unless you pass -collection.

recall setup and the Recall plugin set up a polign_db connection only. With Qdrant, add the MCP server yourself as in step 2.

Use it from Go

Import the backend package and open it by name:

import (
	"github.com/Polign/recall"
	_ "github.com/Polign/recall/backend/qdrant"
)

backend, err := recall.OpenBackend("qdrant", recall.BackendOptions{
	URL:    "http://localhost:6333",
	APIKey: os.Getenv("QDRANT_API_KEY"),
})
client, err := recall.NewClient(recall.Config{
	Backend:    backend,
	Collection: "team_memory",
	Registry:   recall.DefaultRegistry(),
	Embedder:   recall.LexicalEmbedder{},
})

To pick the distance metric a new collection gets, or to pass your own HTTP client, call qdrant.New with a qdrant.Config instead. Collections that already exist keep their settings.

What gets stored

RecallQdrant
A collectionA collection of the same name, created on the first write with the first vector's size (256 for the built-in embedder) and Cosine distance
An eventA point whose ID is a UUIDv5 of the event ID; the event ID itself is in the payload as _recall_id
Event fieldsPayload fields with their types kept: subject, predicate, value, confidence, observed time, source, evidence
FiltersPayload indexes on subject, predicate, kind and observed_ms, added when the collection is created

Use a collection only Recall writes to. A point without _recall_id makes reads of that collection fail instead of guessing.

What works differently

Remember, recall, forget, history, as-of reads, evidence links and audit export work the same as on polign_db. These do not:

FeatureOn Qdrant
Agent resume (recall mcp -agent)Not available. Resume takes a lease so only one process acts for an agent at a time, and Qdrant cannot grant one. recall mcp -agent refuses to start. From Go, Client.Resume with Unleased: true works if something else, such as one pod per agent, already guarantees one process per agent.
Keyword searchNot available. On polign_db, recall ranks with BM25 beside the vector search. On Qdrant it uses the vector search alone, which ranks exact words worse. A model embedder (-embed-url) helps with paraphrased questions but does not add keyword matching.
Cached readsNot available. Every read rebuilds the current value from the fact's history, so busy facts cost more requests than on polign_db.

Writes wait until Qdrant has applied them, so a read right after a write sees it. Recall adds no transactions of its own; concurrent writers follow Qdrant's consistency settings.

If something goes wrong

What you seeWhat to do
flag provided but not defined: -backendYour recall is older than 0.13.0. Upgrade it.
qdrant: request: ... connection refusedQdrant is not listening at that URL. Check the port, and use the REST port (6333), not gRPC (6334).
qdrant: HTTP 401 or 403Set QDRANT_API_KEY or pass -key.
-agent needs agent leasesExpected on Qdrant. Drop -agent, or use polign_db for agents that need resume.
Wrong vector dimension errorsThe collection was created with another embedder. Use a new -collection when you change embedders.

Source & license

The Qdrant backend is part of Recall, open source under the Apache License 2.0, in github.com/Polign/recall. It uses Qdrant's REST API and adds no dependencies. Bug reports and pull requests go there.