Self-Hosting2026-11-02 · VecminDB Team

Self-Hosting Your Agent's Memory, Air-Gapped in Five Minutes

Most "self-hosted" memory setups quietly leak: the store runs on your box, but every embedding call ships your raw context to an external API. This walkthrough keeps everything — storage, embedding, retrieval — inside one container on your network. The exact commands, nothing made up.

1. Start the engine

docker run -d --name vecmindb \
  -p 5520:5520 \
  -v vecmindb-data:/home/vecminDB/data \
  -e VECMIN__SECURITY__ADMIN_KEY=my-secret-key \
  ghcr.io/lingxinmind/vecmindb:latest

One image, port 5520, data on a named volume. The image ships with the BGE-M3 embedding weights baked in — there is no model to download at runtime and no API key to configure, because there is no external embedding service.

Prefer a native binary? That works too, with the same data layout — useful on hosts where you do not want Docker at all.

2. Store a memory — plain text, no vectors

Write a memory as plain text. The embedded model handles the embedding locally; you never construct vectors yourself.

From here, your agent talks to the memory surface over MCP (Cursor, Claude and other MCP clients connect directly) or through the typed SDKs for Python, TypeScript and Rust. Correction, freeze and export are all first-class operations — see the MCP integration guide for per-tool setup.

3. Verify it is actually self-contained

This is the part worth proving, not claiming. Two checks:

4. Licensing without phoning home

The free tier runs without payment. For production use, licenses are activated offline: an Ed25519-signed license bound to a hardware fingerprint (HAI) derived from the host itself — no license server in your data path at runtime. Trial extensions are handled through the license service when you are online; the engine keeps working offline regardless.

5. When one node is not enough

For teams running this across multiple agents, the same image clusters with Raft consensus — three nodes, one command each, and the memory survives a node loss:

command: ["--node-id", "1", "--raft-addr", "node1:6001",
          "--peers", "1=node1:6001,2=node2:6002,3=node3:6003"]

Still zero external calls. The cluster replicates inside your own network.

The five-minute summary

Next steps: the full quickstart, the installation & ops guide (clustering, air-gapped hardening, trial mechanics), and how we handle security in the Trust Center.