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:
- Waits for Postgres to be ready
- Runs all pending migrations
- Creates the default memory space
- 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