Documentation · Visp Memory

Visp Memory docs.

From the first install to a useful next session. A guide to the local, single-repository workflow.

  • v0.9.0
  • Python 3.10+
  • CLI · MCP · dashboard
  • SQLite, on your disk
  • Checked Oct 11, 2026
pip install "visp-memory[mcp,capture]"

How memory carries forward

Visp Memory stores project knowledge outside the conversation, so a coding agent can retrieve it in a later session.

It complements your agent’s instruction files: those describe how to work; memory supplies relevant history, decisions, warnings, and goals.

  1. 1CaptureGit history, instruction files, explicit records
  2. 2StoreEvents, knowledge and intent, with their origin
  3. 3RetrieveCandidates for the task and the files in scope
  4. 4CurateRelevance, trust, duplication and budget checks
  5. 5RecordThe reasoning worth reusing, after the work
The next session starts with it
  1. Capture. Initialization mines existing git history and instruction files. You or your connected agent can also record a decision, a bug fix, or a warning explicitly.
  2. Store with context. Memories retain their origin and project scope in a persistent local store. Events, reusable knowledge, and intentions have distinct roles.
  3. Retrieve for the task. Search finds candidates. A task brief combines relevant memory with evidence citations, constraints, and explicit unknowns within a token budget.
  4. Curate what gets injected. Automatic injection applies relevance, trust, duplication, and budget checks. It can return nothing when the evidence is weak.
  5. Record the outcome. Save the reasoning and discoveries worth reusing after work. New projects gain useful history only as someone records it.
The memory lifecycle. What you record after the work becomes something the next session can retrieve.

Further reading: injection policy and provenance and trust.

Architecture

One memory core, several ways in.

The Python Memory facade coordinates configuration, memory layers, storage, and retrieval. The CLI and MCP server expose that core; an optional FastAPI server lets the dashboard and remote clients use it.

Interfaces
CLIvisp-memory
MCP servervisp-memory-mcp
FastAPI serverDashboard and remote clients
Core
Memory facadeConfiguration · capture · retrieval · context preparation
Memory layers
EpisodicEvents and decisions
SemanticKnowledge and warnings
IntentGoals and constraints
Storage
SQLiteThe default. No database service to run.
Embeddings & vector indexSemantic search: a provider plus Chroma

CLI · You, or your agent following its installed instructions, run visp-memory commands such as decision, recall and brief.

MCP · An MCP client runs visp-memory-mcp and calls tools such as memory_prepare_task and memory_record.

API · An optional FastAPI server for the dashboard and remote clients. It needs the api extra and is experimental.

Shared coreAlways presentOptional
Interfaces share one memory core. The local workflow needs no separate database service.

Three kinds of memory

EpisodicWhat happened

Decisions, discoveries, and bug fixes, including the reasoning behind a change.

SemanticWhat is known

Reusable facts, conventions, patterns, and warnings. Immutable evidence is stored apart from semantic beliefs, and a belief can’t be written without evidence from the same project.

IntentWhat comes next

Goals, focus, and constraints that give context to the current task. Outcome records do not make memory the authority for task completion status.

Where your data lives

SQLite is the default storage backend, and keyword search always works. Semantic search needs both an embedding provider and the Chroma vector index, so install them together: visp-memory[chroma,local-embeddings] for sentence-transformers, [chroma,ollama] for Ollama, or [chroma,openai] for OpenAI or OpenRouter. Changing the provider or model needs an index rebuild.

Your machine
Local embedding modelOllama or sentence-transformers
Hosted embedding providerSuch as OpenAI or OpenRouter. Receives the text it embeds.

With VISP_MEMORY_EMBEDDING_PROVIDER=noop, search is keyword-only and nothing leaves your machine. Set it explicitly: the default, auto, tries a hosted provider first when its API key is in the environment.

Semantic search with a model you run yourself. sentence-transformers downloads its model once; Ollama processes text wherever its endpoint is, which may be another machine.

Text sent for embedding goes to the selected service. The store itself stays in SQLite on your disk.

Where data goes, by search setup. Local storage doesn’t make every setup offline: a hosted embedding provider receives the text it embeds.

Source references: memory core, architecture reference, and evidence contract. Use the feature status below when evaluating optional backends.

Functionality & support

What is stable today, and what is still settling.

CapabilityWhat you can doStatus
CLI & local storageRecord knowledge, search history, prepare briefs, and persist with SQLite.Stable
MCP core toolsLet an agent recall, record, prepare tasks, and inspect file context.Stable
Git capture & searchSeed from history; retrieve with keywords or configured embeddings.Stable
Injection & auditingBudget context, inspect provenance, and filter stale or quarantined memory. Claude Code auto-injection is also beta.Beta
Shared local serverOne store at ~/.visp-memory/data for several projects and agents on one machine, with a single-writer guard.Beta
Dreaming & workflow reportsPreview and apply duplicate cleanup and review proposals; receive completion reports from your assistant.Beta
Neo4j backendAn optional evidence graph. Needs an external service; SQLite stays the default.Beta
Other hooks & UICodex, Cursor, Aider, and generic integrations; REST API and dashboard; ranking and coverage options; agent attribution.Experimental
Teams & aggregationTeam accounts, cross-repo aggregation and ArcadeDB are outside the supported path.Frozen

Checked against the upstream feature status for release 0.9.0 on October 11, 2026. Use your installed command’s --help to check release-specific options.

User guide

Four steps, in order. Each one ends with something you can check.

1. Install and initialize

Use Python 3.10 or newer and run these commands from your project’s git repository. A virtual environment keeps the installation separate from system Python. The extras enable MCP and git capture.

python -m venv .venv
# macOS / Linux; Windows PowerShell: .venv\Scripts\Activate.ps1
source .venv/bin/activate
python -m pip install "visp-memory[mcp,capture]"
visp-memory init
visp-memory doctor

Initialization creates visp-memory.yaml and stores data under .visp-memory/data by default, adding the data directory to git ignores. It uses the project name as the default repository scope and seeds from history. Use visp-memory init --no-mine instead if you want an empty store, or run visp-memory demo to try capture and recall in a temporary store first.

Prefer the dashboard? Run the Docker image

The published Linux amd64 image runs the server and dashboard with persistent storage. On a fresh store, the logs print a one-use link to create your administrator account; there is no default password.

docker run -d --name visp-memory \
  -p 127.0.0.1:8000:8000 \
  -v visp-memory-data:/data \
  -e VISP_MEMORY_EMBEDDING_PROVIDER=noop \
  ghcr.io/djkeshawa/visp-memory:0.9.0
docker logs visp-memory

Then open http://127.0.0.1:8000/dashboard. The REST API and dashboard are experimental.

2. Make memory reachable by your agent

visp-memory hooks list
visp-memory hooks install claude-code --mcp   # hooks, plus the MCP server in .mcp.json
visp-memory hooks install codex
visp-memory doctor

For Claude Code, --mcp merges a visp-memory server into the project’s .mcp.json without replacing your other servers. The Codex integration adds project instructions to AGENTS.md and a visp-memory-mcp entry in ~/.codex/config.toml, keeping a backup of the old file. Review the generated files and look for “Agent reachability: reachable” in the doctor output. Other targets include cursor, aider, and generic.

Connect an MCP client directly

Use the installed visp-memory-mcp executable with the project as its working directory. Replace the path below, and use your client’s equivalent working-directory setting if it does not support cwd. Ensure the executable from your virtual environment is on the client’s PATH, or supply its absolute path.

{
  "mcpServers": {
    "visp-memory": {
      "command": "visp-memory-mcp",
      "args": [],
      "cwd": "/absolute/path/to/your-project",
      "env": {
        "VISP_MEMORY_MCP_PROFILE": "core",
        "VISP_MEMORY_EMBEDDING_PROVIDER": "noop",
        "VISP_MEMORY_AGENT": "your-client-name"
      }
    }
  }
}

Restart the client, check that memory tools appear, and ask it to use memory_prepare_task before edits and memory_decision or memory_record after useful discoveries. This example uses keyword search, and VISP_MEMORY_AGENT labels what this client writes. For a shared server, see the MCP integration guide.

Share one store across projects Beta

When several projects or assistants on one machine should use the same memory, run one shared server and connect each project to it. The store lives at ~/.visp-memory/data instead of in the repository.

visp-memory serve --shared                       # once, on your machine
visp-memory connect --agent-config claude-code   # in each project; or codex

connect writes the project’s repository ID and client mode into its config, and --migrate-local copies existing local records across, marked external until you re-approve them. A single-writer guard stops a server and local processes from writing the same store.

Scoping is not access control. In the default open local-owner mode, any local process that reaches the loopback port can read or write any project. Start the server with accounts or tokens if projects must be kept apart.

3. Record useful knowledge

Write concrete statements with a reason or file context. These examples illustrate a project that uses bounded API retries, one per kind of memory:

visp-memory decision "Limit API retries to three" "Avoid retry storms during outages"
visp-memory warn "src/api/client.py" "Keep retries bounded to avoid retry storms"
visp-memory record "Fixed duplicate requests after client timeouts"
visp-memory goal "Improve API resilience" --priority 2

4. Recall before changing code

Use search to explore what was recorded. Use a task brief when preparing work; its file scope and token budget keep the output focused.

visp-memory recall "API retries"
visp-memory brief "Update API retry handling" --file src/api/client.py --tokens 1200
visp-memory preview "Update API retry handling" --file src/api/client.py
visp-memory audit
recallWhat was recorded about this?Search across memory, by keyword or configured embeddings.
briefWhat should the agent know for this task?Cited task context for the files in scope, within a token budget.
previewWould automatic injection add anything, and why?Explains the injection policy’s selection or abstention.
auditWhere did this memory come from?Provenance, and whether a memory can be injected.
Four commands, four questions. preview is not a preview of brief: it explains the separate automatic injection policy.
CandidatesRetrieved for the task and files
ProvenanceTraced to a source
TrustNot stale or quarantined
RelevanceClears the bar for this task
RedundancyNot already said
BudgetFits the token budget
Useful evidence remainsInject the selected context, each item with its source.
No suitable evidenceAbstain. Inject nothing.
The selection policy checks provenance, trust, relevance, redundancy, and budget. Use preview to inspect a decision. An empty injection can be the intended outcome.

A brief reports an active goal only when the task shares a topic word with it; otherwise it lists the goal under unknowns. brief and recall also take --ranking-strategy hybrid or hybrid_union, which are experimental.

After the change, record the new decision or lesson so the next session can use it.

Command reference: CLI source and upstream setup guide.

Where it helps

Resume a feature after a break
Record the current goal and design decisions before stopping. Prepare a brief in the next session to recover the rationale and constraints.
Avoid repeating a bug
Save the root cause and fix as an event, then attach a warning to the fragile area. Retrieve that file’s context before another change.
Revisit an architectural choice
Record what you chose, why, and alternatives with decision --alt. Search that history before proposing a replacement.
Start on an established repository
Mine git history to get initial context, then check the source evidence against the code. Historical commits are clues, not a guarantee that a claim is still current.
Move between coding assistants
Connect each assistant to the same project store through CLI instructions or MCP. Each client still needs its own integration configured.

A new repository has little history to retrieve. Start by writing decisions. Visp Memory is focused on codebase knowledge, and the current evidence does not establish that it improves an agent’s code quality. See the upstream benchmark scope and limitations.

When something is missing

The agent never uses memory
Run doctor, install the appropriate hooks, and review the project instructions. For MCP, restart the client and verify its executable path and working directory.
Search or injection is empty
Check that you are in the initialized project and correct repo scope. Try a specific query with a file path, inspect audit, and use preview for injection decisions. No injected memory can be an intentional result.
A command is refused because a server owns the data directory
While a server runs on a store, local CLI, MCP and hook processes on that directory are refused, with a message naming the server. Switch those projects to client mode with visp-memory connect.
visp-memory[mcp] won’t install next to another tool
Since 0.9.0 the mcp extra uses MCP SDK 2.x, so it conflicts with an environment pinned to mcp<2. Install Visp Memory in its own virtual environment. Clients on older protocol versions still connect.
A command or tool is unavailable
Check visp-memory --help and the subcommand’s --help. MCP requires the mcp extra; API serving requires api. Development-branch documentation may describe options absent from an older release.