{
  "markdown": "<p align=\"center\">\n  <img src=\"assets/echovault-gopher-icon.svg\" width=\"120\" height=\"120\" alt=\"EchoVault\" />\n</p>\n\n<h1 align=\"center\">EchoVault — Go</h1>\n\n<p align=\"center\">\n  Local memory for coding agents. Your agent remembers decisions, bugs, and context across sessions — no cloud, no API keys, no cost.\n</p>\n\n<p align=\"center\">\n  <a href=\"#install\">Install</a> · <a href=\"#features\">Features</a> · <a href=\"#how-it-works\">How it works</a> · <a href=\"#commands\">Commands</a>\n</p>\n\n---\n\nThis is the **Go port** of [EchoVault](https://github.com/mraza007/echovault). It is a single static binary with no Python runtime dependency. The vault format and MCP interface are fully compatible with the Python version — you can switch between them without losing any memories.\n\n## Features\n\n**Works with 4 agents** — Claude Code, Cursor, Codex, OpenCode. One command sets up MCP config for your agent.\n\n**MCP native** — Runs as an MCP server exposing `memory_save`, `memory_search`, and `memory_context` as tools. Agents call them directly — no shell hooks needed.\n\n**Local-first** — Everything stays on your machine. Memories are stored as Markdown in `~/.memory/vault/`, readable in Obsidian or any editor.\n\n**Zero idle cost** — No background processes, no daemon, no RAM overhead. The MCP server only runs when the agent starts it.\n\n**Hybrid search** — FTS5 keyword search works out of the box. Add Ollama or OpenAI for semantic vector search.\n\n**Secret redaction** — 3-layer redaction strips API keys, passwords, and credentials before anything hits disk. Supports explicit `<redacted>` tags, pattern detection, and custom `.memoryignore` rules.\n\n**Cross-agent** — Memories saved by Claude Code are searchable in Cursor, Codex, and OpenCode. One vault, many agents.\n\n**Obsidian-compatible** — Session files are valid Markdown with YAML frontmatter. Point Obsidian at `~/.memory/vault/` and browse your agent's memory visually.\n\n## Install\n\n### Pre-built binary\n\nDownload the latest release for your platform from the [releases page](https://github.com/go-ports/echovault/releases) and place the binary somewhere on your `$PATH`.\n\n### Build from source\n\n```bash\ngit clone https://github.com/go-ports/echovault.git\ncd echovault\nmake build          # produces ./bin/memory\nsudo cp bin/memory /usr/local/bin/\n```\n\n> **CGO required.** The binary links against `go-sqlite3` and `sqlite-vec`, so a C compiler (gcc/clang) must be present. On macOS: `xcode-select --install`. On Debian/Ubuntu: `apt install build-essential`.\n\n### First run\n\n```bash\nmemory init\nmemory setup claude-code   # or: cursor, codex, opencode\n```\n\nThat's it. `memory setup` installs the MCP server config automatically.\n\nBy default the config is installed globally. To install for a specific project:\n\n```bash\ncd ~/my-project\nmemory setup claude-code --project   # writes .mcp.json in project root\nmemory setup opencode --project      # writes opencode.json in project root\nmemory setup codex --project         # writes .codex/config.toml + AGENTS.md\n```\n\n### Configure embeddings (optional)\n\nEmbeddings enable semantic search. Without them, you still get fast keyword search via FTS5.\n\nGenerate a starter config:\n\n```bash\nmemory config init\n```\n\nThis creates `~/.memory/config.yaml` with sensible defaults:\n\n```yaml\nembedding:\n  provider: ollama              # ollama | openai | openrouter\n  model: nomic-embed-text\n\ncontext:\n  semantic: auto                # auto | always | never\n  topup_recent: true\n```\n\n**What each section does:**\n\n- **`embedding`** — How memories get turned into vectors for semantic search. `ollama` runs locally; `openai` and `openrouter` call cloud APIs. `nomic-embed-text` is a good local model for Ollama.\n- **`context`** — Controls how memories are retrieved at session start. `auto` uses vector search when embeddings are available, falls back to keywords. `topup_recent` also includes recent memories so the agent has fresh context.\n\nFor cloud providers, add `api_key` under the provider section. API keys are redacted in `memory config` output.\n\n### Configure memory location\n\nBy default, EchoVault stores data in `~/.memory`.\n\nYou can change that in two ways:\n\n- `MEMORY_HOME=/path/to/memory` (highest priority, per-shell/per-process)\n- `memory config set-home /path/to/memory` (persistent default)\n\nUseful commands:\n\n```bash\nmemory config set-home /path/to/memory\nmemory config clear-home\nmemory config\n```\n\n`memory config` shows both `memory_home` and `memory_home_source` (`env`, `config`, or `default`).\n\nThe `--memory-home` global flag overrides everything for a single invocation:\n\n```bash\nmemory --memory-home /tmp/test-vault search \"authentication\"\n```\n\n## Usage\n\nOnce set up, your agent uses memory via MCP tools:\n\n- **Session start** — agent calls `memory_context` to load prior decisions and context\n- **During work** — agent calls `memory_search` to find relevant memories\n- **Session end** — agent calls `memory_save` to persist decisions, bugs, and learnings\n\nThe MCP tool descriptions instruct agents to save and retrieve automatically. No manual prompting needed in most cases.\n\nYou can also use the CLI directly:\n\n```bash\nmemory save --title \"Switched to JWT auth\" \\\n  --what \"Replaced session cookies with JWT\" \\\n  --why \"Needed stateless auth for API\" \\\n  --impact \"All endpoints now require Bearer token\" \\\n  --tags \"auth,jwt\" --category \"decision\" \\\n  --details \"Context:\nOptions considered:\n- Keep session cookies\n- Move to JWT\nDecision:\nTradeoffs:\nFollow-up:\"\n\nmemory search \"authentication\"\nmemory details <id>\nmemory context --project\n```\n\nFor long details, use `--details-file notes.md`. To scaffold structured details automatically, use `--details-template`.\n\n## How it works\n\n```\n~/.memory/\n├── vault/                    # Obsidian-compatible Markdown\n│   └── my-project/\n│       └── 2026-02-01-session.md\n├── index.db                  # SQLite: FTS5 + sqlite-vec\n└── config.yaml               # Embedding provider config\n```\n\n- **Markdown vault** — one file per session per project, with YAML frontmatter\n- **SQLite index** — FTS5 for keywords, sqlite-vec for semantic vectors\n- **Compact pointers** — search returns ~50-token summaries; full details fetched on demand\n- **3-layer redaction** — explicit tags, pattern matching, and `.memoryignore` rules\n\n## Supported agents\n\n| Agent | Setup command | What gets installed |\n|-------|---------------|---------------------|\n| Claude Code | `memory setup claude-code` | MCP server in `.mcp.json` (project) or `~/.claude.json` (global) |\n| Cursor | `memory setup cursor` | MCP server in `.cursor/mcp.json` |\n| Codex | `memory setup codex` | MCP server in `.codex/config.toml` + `AGENTS.md` fallback |\n| OpenCode | `memory setup opencode` | MCP server in `opencode.json` (project) or `~/.config/opencode/opencode.json` (global) |\n\nAll agents share the same memory vault at your effective `memory_home` path (default `~/.memory/`). A memory saved by Claude Code is searchable from Cursor, Codex, or OpenCode.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `memory init` | Create vault at effective memory home |\n| `memory setup <agent>` | Install MCP server config for an agent |\n| `memory uninstall <agent>` | Remove MCP server config for an agent |\n| `memory save ...` | Save a memory (`--details-file` and `--details-template` supported) |\n| `memory search \"query\"` | Hybrid FTS + semantic search |\n| `memory details <id>` | Full details for a memory |\n| `memory delete <id>` | Delete a memory by ID or prefix |\n| `memory context --project` | List memories for current project |\n| `memory sessions` | List session files |\n| `memory config` | Show effective config |\n| `memory config init` | Generate a starter config.yaml |\n| `memory config set-home <path>` | Persist default memory location |\n| `memory config clear-home` | Remove persisted memory location |\n| `memory reindex` | Rebuild vectors after changing provider |\n| `memory mcp` | Start the MCP server (stdio transport) |\n\n### Global flags\n\n| Flag | Description |\n|------|-------------|\n| `--memory-home <path>` | Override memory home for this invocation |\n| `--help` | Show help for any command |\n\n## Uninstall\n\n```bash\nmemory uninstall claude-code   # or: cursor, codex, opencode\nrm /usr/local/bin/memory\n```\n\nTo also remove all stored memories: `rm -rf ~/.memory/`\n\n## Privacy\n\nEverything stays local by default. If you configure OpenAI or OpenRouter for embeddings, those API calls go to their servers. Use Ollama for fully local operation.\n\n## License\n\nMIT — see [LICENSE](../LICENSE).\n",
  "bytes": 8546,
  "sha": "798d442d939707960f4b17e7797586293236c79ba171e5decf119d3aed617b60",
  "repo_slug": "go-ports/echovault",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_go_ports_echovault_87e157e9/readme"
}