Back to blog

Memory Vault Now Runs With One Command

Milestone 2 shipped the search engine, ingestion pipeline, and embeddings. You could clone the repo and run it — if you had PostgreSQL 16 with pgvector installed, a Python virtual environment set up, the right dependencies, and your .env configured. Not exactly "clone and go."

That's what Milestone 3 fixes. One command:

git clone https://github.com/MihaiBuilds/memory-vault.git
cd memory-vault
docker compose up

PostgreSQL with pgvector, the Memory Vault app with all dependencies, migrations, and a default memory space — all running. No manual setup.

What happens when you run it

The docker compose up starts two containers:

PostgreSQL + pgvector — using the official pgvector/pgvector:pg16 image. Runs on port 5432 with a named volume for persistence. Your data survives docker compose down.

Memory Vault app — Python 3.11, CPU-only PyTorch (no 2GB CUDA download), sentence-transformers, psycopg 3, everything pre-installed. On first start, a startup script:

  1. Waits for Postgres to be ready
  2. Runs all pending migrations
  3. Creates the default memory space
  4. Prints status and stays alive for CLI access

The whole thing takes under a minute on a warm Docker cache. First build takes longer because it downloads PyTorch and sentence-transformers, but that only happens once.

Using it

Once it's running, you interact through the CLI:

# Check status
docker compose exec app memory-vault status

# Ingest a markdown file
docker compose exec app memory-vault ingest /path/to/file.md --space default

# Search your memories
docker compose exec app memory-vault search "hybrid search architecture"

The CLI is the interface for now. A REST API comes in M6 and a web dashboard in M5. But the core functionality — ingest, search, check status — works today.

Decisions I made

CPU-only PyTorch. The default PyTorch install pulls CUDA libraries (~2GB) even if you don't have a GPU. Memory Vault uses sentence-transformers for embedding, which runs perfectly fine on CPU. Installing from PyTorch's CPU-only index cuts the image size significantly.

No HTTP server yet. I was tempted to add a minimal health endpoint, but that's scope creep — the REST API is Milestone 6. The Docker healthcheck uses memory-vault status through the CLI instead. Works fine.

Named volumes for persistence. The PostgreSQL data lives in a Docker volume, not a bind mount. This means docker compose down doesn't delete your data. You have to explicitly run docker compose down -v to wipe the volume. Safer default.

Compose healthcheck on Postgres. The app container waits for the database using depends_on: condition: service_healthy. The startup script has a secondary socket check as a belt-and-suspenders approach, but the compose healthcheck does the real work.

What's next

Milestone 4 is the MCP server — four tools (recall, remember, forget, memory_status) that let Claude use Memory Vault as a live memory system during conversations. That's when this goes from "a search engine you run commands against" to "an AI that actually remembers."

The repo: github.com/MihaiBuilds/memory-vault