{
  "markdown": "<!-- mcp-name: io.github.VonderVuflya/yggdrasil -->\n<h1 align=\"center\">🌳 Yggdrasil</h1>\n\n<p align=\"center\"><b>Stop re-explaining your project to every new AI session.</b><br/>\nOne local memory for Claude Code, Codex, and every MCP agent — shared across sessions, tools, and projects. Zero dependencies. Nothing leaves your machine.</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/VonderVuflya/Yggdrasil/releases/latest\"><img src=\"https://img.shields.io/github/v/release/VonderVuflya/Yggdrasil?label=release&color=blue\" alt=\"Latest release\"></a>\n  <a href=\"https://pypi.org/project/yggdrasil-memory/\"><img src=\"https://img.shields.io/pypi/v/yggdrasil-memory?label=PyPI&color=blue\" alt=\"PyPI\"></a>\n  <a href=\"https://glama.ai/mcp/servers/VonderVuflya/Yggdrasil\"><img src=\"https://glama.ai/mcp/servers/VonderVuflya/Yggdrasil/badges/score.svg\" alt=\"Glama quality score\"></a>\n  <a href=\"./BENCHMARKS.md\"><img src=\"https://img.shields.io/badge/recall@1-0.94%20·%20reproducible-brightgreen\" alt=\"Benchmarks\"></a>\n  <a href=\"./LICENSE\"><img src=\"https://img.shields.io/badge/License-AGPL%203.0-blue.svg\" alt=\"AGPL-3.0\"></a>\n  <img src=\"https://img.shields.io/badge/status-alpha-orange\" alt=\"alpha\">\n</p>\n\n<p align=\"center\">\n  <a href=\"#-install\">Install</a> ·\n  <a href=\"#-how-it-works\">How it works</a> ·\n  <a href=\"#-the-numbers\">Numbers</a> ·\n  <a href=\"#-yggdrasil-vs-the-rest\">Compare</a> ·\n  <a href=\"#-faq\">FAQ</a>\n</p>\n\n<p align=\"center\">\n  Read this in: <a href=\"./i18n/README.ru.md\">Русский</a> · <a href=\"./i18n/README.zh.md\">简体中文</a> · <a href=\"./i18n/README.es.md\">Español</a> · <a href=\"./i18n/README.fr.md\">Français</a> · <a href=\"./i18n/README.ja.md\">日本語</a> · <a href=\"./i18n/README.de.md\">Deutsch</a>\n</p>\n\n---\n\n<p align=\"center\">\n  <img src=\"docs/demo.gif\" alt=\"Yggdrasil — a brand-new session already knows your project, and recalls a fix from another project\" width=\"880\">\n</p>\n\nEvery new chat, your AI forgets. You re-explain the project, the decisions, the gotchas — every time, in every tool. **Yggdrasil is a tiny always-on memory that any agent plugs into.** Open a new session, in any project, with any AI, and it already knows what you decided, what broke, and what's still open.\n\n```text\n$ cd ~/projects/checkout-api && claude        # a brand-new session\n\n🌳 Yggdrasil  (injected automatically at session start)\n   • [project_status] payments refactor: idempotency keys added; open: e2e tests\n   • [lesson] webhook 401 → signing secret rotated; update env + redeploy\n\n> \"have I solved a flaky websocket reconnect anywhere before?\"\n\n🌳 recall → found in project `realtime-dash`:\n   refresh the token *before* opening the socket, then retry with capped backoff.\n```\n\nNo \"let me remind you what we did yesterday.\" It's just there.\n\n## 🚀 Install\n\nTwo commands, inside **Claude Code** (the plugin launches via [`uv`](https://docs.astral.sh/uv/)):\n\n```text\n/plugin marketplace add VonderVuflya/Yggdrasil\n/plugin install yggdrasil\n```\n\nThe engine lazy-starts on first use and generates its own local token — no API key, no cloud, nothing to configure. Codex and Cursor use the same flow.\n\n<details>\n<summary>All other channels — CLI daemon, Homebrew, npm, Claude Desktop, from source…</summary>\n\n| Host / tool | Command |\n| --- | --- |\n| **uvx** _(recommended CLI)_ | `uvx --from yggdrasil-memory ygg install` |\n| **npm / npx** | `npx yggdrasil-memory install` |\n| **pipx** | `pipx install yggdrasil-memory && ygg install` |\n| **pip** | `pip install yggdrasil-memory && ygg install` |\n| **Homebrew** _(macOS)_ | `brew install VonderVuflya/tap/yggdrasil && ygg install` |\n| **Claude Desktop** _(app)_ | drag the `.mcpb` from the [latest release](https://github.com/VonderVuflya/Yggdrasil/releases/latest) onto Settings → Extensions, paste your token (`ygg token`) — the desktop app then shares the same memory as your CLI agents ([guide](./packaging/mcpb/README.md)) |\n| **from source** | `uvx --from git+https://github.com/VonderVuflya/yggdrasil.git ygg install` |\n\n`ygg install` is a one-time guided setup: it installs an always-on background service, registers the MCP tools with every agent host it finds — **Claude Code, Codex, OpenCode** — and, if your hardware allows, recommends optional local models (or pick `none` to stay zero-config).\n\n<details>\n<summary><b>OpenCode</b> — nothing to configure</summary>\n\nInstall [OpenCode](https://opencode.ai) first, then run `ygg install` (or `ygg redeploy` if Yggdrasil is already set up) — the entry is written for you and merged into any existing `opencode.json`. Confirm with:\n\n```bash\nopencode mcp list        # -> ✓ yggdrasil connected\n```\n\nInstalled OpenCode *after* Yggdrasil? Just re-run `ygg install`.\n\nIf you'd rather write it by hand, note that OpenCode's schema differs from Claude's in four places at once — servers live under `mcp` (not `mcpServers`), `type` is required, `command` is one array (not `command` + `args`), and env is `environment` (not `env`), so the Claude snippet won't port:\n\n```jsonc\n// ~/.config/opencode/opencode.json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"mcp\": {\n    \"yggdrasil\": {\n      \"type\": \"local\",\n      \"command\": [\"/path/to/python3\", \"~/.yggdrasil/scripts/ygg_mcp_server.py\"],\n      \"enabled\": true,\n      \"environment\": { \"YGG_ENGINE_URL\": \"http://127.0.0.1:42069\" }\n    }\n  }\n}\n```\n\nNo token goes in the config — the engine reads the 0600 `~/.yggdrasil/token` itself. Run `ygg doctor` if the tools don't show up.\n\n</details>\n\nThere is also a [`yggdrasil-memory` skill](./skills/) for any Claude surface: MCP connects the *tools*, the skill teaches the agent *when* to use them. Use both for the best behavior.\n\nTry it with nothing installed and a throwaway DB: `uvx --from yggdrasil-memory ygg serve --reset --db /tmp/ygg.sqlite`.\n\n</details>\n\nThen just work: ask your agent *\"recall what we decided about this project\"*, tell it *\"remember this decision\"* — next session it's already there. Verify the install any time with `ygg doctor`.\n\n**Already have history?** Seed memory from your existing Claude Code + Codex transcripts, Obsidian vaults, and `CLAUDE.md` repos — distilled locally:\n\n```bash\nygg seed --dry-run    # see what it would import; drop the flag to distill for real\n```\n\n**Leaving another memory tool?** `ygg import --from mcp-memory --path memory.json` pulls its whole store into Yggdrasil (deduped, secret-guarded) — then you can delete it.\n\n## Why\n\n- 🧠 **Persistent** — decisions, lessons, and project status survive across sessions.\n- 🔌 **One brain, every tool** — Claude Code, Codex, OpenCode, and any MCP host share the same memory.\n- 🌐 **Cross-project recall** — *\"this looks like what you did in project B — reuse it?\"*\n- 🧹 **Curated, not captured** — your agent saves the few things that matter; governance dedupes and archives, never deletes.\n- 🌱 **Self-maintaining** *(opt-in)* — a small local model consolidates memory in the background. Zero API tokens.\n- 🪪 **One identity everywhere** — an optional name and persona every agent picks up, so Claude Code and Codex feel like the same assistant.\n- 🔒 **100% local** — your memory lives on your machine. No cloud, no account, no telemetry.\n\n## 🧠 How it works\n\nYggdrasil is **memory + tools** — the *intelligence* is your LLM. It just makes sure the right memory is in front of the right agent at the right moment.\n\n- 🛎️ **Always-on daemon** — a tiny local service (~21 MB RAM) your agents reach over MCP tools (`ygg_search`, `ygg_recall`, `ygg_remember` …).\n- 🪝 **Hooks** — session start auto-injects identity, project status, and open follow-ups (~300 tokens); an optional per-prompt hook auto-recalls memory relevant to *each request*.\n- 📌 **Ranking** — pinned and frequently-recalled memories surface first.\n- 🧹 **Governance** — duplicates and conflicts are queued for review; changes are non-destructive (archive, never delete).\n- 📓 **Obsidian** — every memory doubles as a plain-Markdown note you can read, edit, and grep.\n\n## 🎛️ Memory tiers — zero-config by default\n\nOut of the box, Yggdrasil runs on **SQLite + FTS5 with zero dependencies** — instant keyword search, no models, nothing to download. Optional **local** models add two independent tiers:\n\n| Tier | You add | You gain |\n| --- | --- | --- |\n| **0 · default** | nothing — SQLite + FTS5 | keyword search, zero deps, instant — recall@1 = **0.77** |\n| **1 · semantic** | an **embedding** model (`all-minilm` 45 MB · `paraphrase-multilingual` ~560 MB) | search by **meaning**, across languages — recall@1 = **0.94**, recall@3 **1.00** |\n| **2 · self-maintaining** | a small **LLM** (`qwen2.5:1.5b` ~1 GB) | background dedupe/merge of memory (propose-only) |\n\nThe runtime only *computes* vectors and runs the background model — every memory and every vector stays in the same local SQLite.\n\n`ygg install` scans for [Ollama](https://ollama.com), [LM Studio](https://lmstudio.ai) and llama.cpp, offers to start whichever is installed but idle, and then shows one menu per job with **green for models you already have and red for models it would download**. Pick a row, and it writes `embed_backend`, `embed_url` and `distill_url` for you — including the part nobody guesses right, that `embed_url` wants the `/v1` base while `distill_url` wants the host root. A runtime on another machine is one URL: paste it and the dialect is detected. `ygg recommend` shows the same scan plus the full catalog without changing anything.\n\n<details>\n<summary>Full model menu</summary>\n\n**Embeddings (semantic search):**\n\n| Model | Size | Good for |\n| --- | --- | --- |\n| `all-minilm` | 45 MB | English, tiny & fast |\n| `nomic-embed-text` | 274 MB | English, better quality (768d) |\n| `mxbai-embed-large` | 670 MB | English, high quality (1024d) |\n| `paraphrase-multilingual` | ~560 MB | multilingual (EN/RU + 50 langs, 768d) |\n| `bge-m3` | 1.2 GB | multilingual, top quality (heavier) |\n\n**Embedding backend** — Ollama by default. `ygg install` sets all of this for you\nonce you pick a runtime; the manual route below is for scripted setups and for\nchanging one thing later. To use an OpenAI-compatible `/v1/embeddings` server\ninstead (llama.cpp's `llama-server --embeddings`, OpenRouter, LM Studio, vLLM),\nset `embed_backend`:\n\n```bash\n# local llama.cpp — no key needed\nygg config set embed_backend openai\nygg config set embed_url http://127.0.0.1:8080/v1\nygg config set embed_model bge-small-en-v1.5\nygg redeploy\n\n# OpenRouter — free embeddings, no GPU needed\nygg config set embed_backend openai\nygg config set embed_url https://openrouter.ai/api/v1\nygg config set embed_model nvidia/llama-nemotron-embed-vl-1b-v2:free\nygg config set embed_api_key sk-or-...    # or export YGG_EMBED_API_KEY\nygg redeploy\n```\n\nThe key is stored in `~/.yggdrasil/embed_api_key` (0600) rather than\n`config.json`, and reaches the daemon as a **file path** — so it never shows up\nin `ps`, the launchd plist or the systemd unit. `ygg config list` masks it.\n\nCheck it took with `ygg doctor` — dense should name your model:\n\n```\n✓ dense    active (nvidia/llama-nemotron-embed-vl-1b-v2:free)\n```\n\n<details>\n<summary><b>LM Studio: the four things that catch people out</b></summary>\n\n`ygg install` handles all of this. Read on only if you're wiring it by hand.\n\n**1. Two settings, two different shapes of the same URL.** `embed_url` is the\n`/v1` base; `distill_url` is the host root. Same server, and swapping them gets\nyou a 404 that reads like the endpoint is simply wrong.\n\n```bash\nygg config set embed_backend openai\nygg config set embed_url    http://127.0.0.1:1234/v1\nygg config set distill_url  http://127.0.0.1:1234\n```\n\n**2. The model id is not what you downloaded.** `lms get nomic-embed-text` puts\na model on disk that the API answers to as\n`text-embedding-nomic-embed-text-v1.5`. Ask the server, don't guess:\n\n```bash\ncurl -s http://127.0.0.1:1234/api/v0/models | grep '\"id\"'\n```\n\n**3. Turn on Just-In-Time model loading** (Developer tab). Without it nothing is\nloaded when the daemon calls, and every request 404s.\n\n**4. Turn on \"run the server on login\".** The Yggdrasil daemon starts at boot; if\nLM Studio's server doesn't, dense search silently degrades to lexical until you\nnext open the app.\n\n</details>\n\n<details>\n<summary><b>OpenRouter: two settings that will bite you</b></summary>\n\n**1. Use an inference key, not a provisioning key.** Keys from\n[openrouter.ai/settings/provisioning-keys](https://openrouter.ai/settings/provisioning-keys)\ncan only mint other keys — embedding calls with one return a baffling\n`401 User not found`. Create a normal key at\n[openrouter.ai/settings/keys](https://openrouter.ai/settings/keys) instead.\n\nNote that `GET /api/v1/models` answers `200 OK` for *any* key, valid or not —\nit ignores auth entirely, so it can't tell you whether your key works. Check\n`GET /api/v1/key` instead: it returns `is_provisioning_key`, and fails outright\non a bad key.\n\n**2. Privacy settings silently hide most models.** If a model 404s with\n`All providers have been ignored`, the model is fine — your account is\nfiltering out every provider that serves it. Fix it at\n[openrouter.ai/settings/privacy](https://openrouter.ai/settings/privacy).\nThat filter is also why `openai/text-embedding-3-*` can come back `403` on a\nprovider's terms of service.\n\nBrowse what's actually available at\n[openrouter.ai/models?output_modalities=embeddings](https://openrouter.ai/models?fmt=cards&output_modalities=embeddings)\n(26 models at the time of writing). Useful ones:\n\n| Model | Price / 1M tokens |\n| --- | --- |\n| `nvidia/llama-nemotron-embed-vl-1b-v2:free` | **$0** |\n| `perplexity/pplx-embed-v1-0.6b` | $0.004 |\n| `intfloat/multilingual-e5-large` | $0.01 — multilingual |\n| `google/gemini-embedding-2` | $0.20 |\n\n</details>\n\nStaying local still wins on quality *and* privacy: on the 232-memory / 110-query\ncorpus, local `paraphrase-multilingual` scores recall@1 **0.964** vs **0.946**\nfor the free hosted model — and your memories never leave the machine. Reach for\na hosted backend when the box can't run Ollama, not to chase accuracy.\n\nBigger vectors do **not** buy accuracy here — on the same corpus\n`mxbai-embed-large` (1024d) scores 0.809 and `nomic-embed-text` (768d) 0.818,\na difference their confidence intervals swallow whole. What actually moves the\nnumber is whether the model handles *your* languages: both are English-only and\ncollapse to 0.40–0.45 on cross-language queries, where the multilingual default\nholds 0.95.\n\n**Background consolidation (small LLM):**\n\n| Model | Size | Good for |\n| --- | --- | --- |\n| `qwen2.5:0.5b` | ~400 MB | tiny, fast on CPU |\n| `qwen2.5:1.5b` | ~1 GB | best CPU default |\n| `llama3.2:3b` | ~2 GB | better quality, slower on CPU |\n\nThe engine itself is swappable — any service meeting the `MemoryBackend` contract is a drop-in (`YGG_ENGINE_URL`); see [docs/backend-boundary.md](./docs/backend-boundary.md).\n\n</details>\n\n## 📊 The numbers\n\nMeasured by [`eval/ygg_eval.py`](./eval/ygg_eval.py) — 232 memories, 110 labelled queries, ranking weights tuned on the *dev* split only, so **holdout is the unbiased number** (recall@1, with the `paraphrase-multilingual` model):\n\n| Search view | holdout recall@1 | recall@3 | zero-dep lexical |\n| --- | --- | --- | --- |\n| **Within a project** (the real path, pool ~11) | **0.94** | **1.00** | 0.76 |\n| **Whole store** (no filter, pool 232) | 0.72 | 0.87 | 0.69 |\n\n**Within a project — the path you use — the right memory is #1 for 0.94 of queries and in the top 3 every time (recall@3 = 1.00).** Searching the whole store with no filter is harder (recall@1 0.72, recall@3 0.87 across all 232). Zero-dep lexical mode already solves keyword and code-identifier queries (1.00); the local model adds meaning and cross-language (crosslingual 0.25 → 0.95). The [full breakdown in BENCHMARKS.md](./BENCHMARKS.md) has 95% CIs, pool sizes, and per-class scores — rerun it in a minute: `python3 eval/ygg_eval.py --report`.\n\n## 🆚 Yggdrasil vs the rest\n\nEveryone else either auto-captures transcripts or sells you a cloud. Yggdrasil's bet: keep the **few things that matter**, curated and de-duped, in plain rows you own — and share them across **every** tool and project.\n\n| | **Yggdrasil** | Built-in memory <sub>(Claude Code · Codex)</sub> | [claude-mem](https://github.com/thedotmack/claude-mem) | [mem0](https://github.com/mem0ai/mem0) / OpenMemory | [basic-memory](https://github.com/basicmachines-co/basic-memory) |\n| --- | --- | --- | --- | --- | --- |\n| Curated decisions / lessons / status (not transcripts) | ✅ | ⚠️ auto-notes | ❌ captures everything | ⚠️ | ⚠️ free-form notes |\n| One memory **across tools** | ✅ | ❌ vendor-siloed | ✅ | ✅ | ✅ |\n| **Cross-project** recall (\"solved this in project B\") | ✅ | ❌ repo-scoped | ⚠️ | ⚠️ | ⚠️ |\n| **100% local** by default | ✅ | ✅ | ⚠️ cloud sync add-on | ❌ hosted-first | ✅ |\n| **Zero dependencies** (stdlib + SQLite) | ✅ | — | ❌ Node + Bun + worker daemon | ❌ Docker + Qdrant + LLM key | ❌ |\n| Works with **no LLM & no API key** | ✅ | ✅ | ❌ AI-compresses | ❌ | ✅ |\n| **Semantic search, fully local** | ✅ opt-in Ollama | ❌ grep-only | ⚠️ optional Chroma | ⚠️ needs API key or Docker stack | ❌ |\n| Plain **Markdown you own** (Obsidian-ready) | ✅ | ✅ | ❌ | ❌ | ✅ |\n\n**Closest neighbor — claude-mem:** capture-everything memory that records and AI-compresses every session (Node 20+ *and* Bun, a persistent worker daemon; Chroma optional). Yggdrasil is the opposite bet: a small, high-signal store instead of a growing firehose. **mem0** is an SDK plus a hosted platform for building *apps* that remember *their users* — even self-hosted it needs an LLM API key. **Built-in memories** are genuinely useful — and structurally siloed: one vendor, one repo, one machine, literal grep. Yggdrasil is the layer above them (and `ygg seed` can bootstrap itself from those same transcripts). Different layer entirely: [context-mode](https://github.com/mksglu/context-mode) (live context window) and [Context7](https://github.com/upstash/context7) (fresh library docs) — both pair fine with Yggdrasil.\n\n## 🧰 Commands\n\nAgents see six MCP tools: `ygg_health`, `ygg_bootstrap`, `ygg_search`, `ygg_recall`, `ygg_remember`, `ygg_materialize` — auto-registered by the plugin or `ygg install`.\n\n<details>\n<summary>Full <code>ygg</code> CLI reference</summary>\n\n**Memory ops**\n\n| Command | What it does |\n| --- | --- |\n| `ygg recall --query \"…\"` | **Cross-project** search — \"have I done this anywhere?\" |\n| `ygg search --project P --query \"…\"` | Project-scoped search (`--type`, `--tag`, `--limit`, `--json`) |\n| `ygg remember --project P --type lesson --content \"…\"` | Save a durable memory (secret-guarded, deduped) |\n| `ygg bootstrap --project P` | Pull a project's memory before starting work |\n| `ygg pin --id ID` · `ygg unpin --id ID` | Pin a memory so it reliably surfaces |\n| `ygg relate --from A --rel solves --to B` · `ygg relations --id ID` | Link memories (`solves`/`supersedes`/`contradicts`) · see why a memory exists / what replaced it |\n| `ygg supersede --id OLD --by NEW` | Archive an outdated memory — `--by` records what replaced it |\n| `ygg materialize --id ID --project P` | Export one memory to an Obsidian note |\n| `ygg export-native --project P` | Write a curated digest into `AGENTS.md`/`MEMORY.md` — feed Claude Code & Codex's native memory |\n| `ygg import --from TOOL --path P` | Migrate another memory tool's store into Yggdrasil (`mcp-memory`, `basic-memory`; `--dry-run` first) |\n| `ygg review [--apply]` | Work the governance queue — consolidate duplicates, flag stale/conflicting memories (archive-only, reversible) |\n| `ygg delete --id ID` · `ygg reset …` | Hard-delete one memory · bulk-undo a bad seed (confirms first) |\n\n**Cold start**\n\n| Command | What it does |\n| --- | --- |\n| `ygg seed` | Distill Claude Code + Codex transcripts, Obsidian vaults, `CLAUDE.md` repos — incremental, deduped, fully local |\n| `ygg seed --dry-run` · `--force` | Discover + estimate only · re-distill everything |\n| `ygg seed --schedule 03:30` | Nightly auto-distill (launchd) — memory keeps itself fresh; `off` / `status` |\n| `ygg sync --repo <your-git-repo>` | Sync memory across machines through **your own** git repo — plain JSON files, no cloud in the loop |\n| `ygg distill --source PATH` | Distill one dir/file into lessons |\n| `ygg reindex` | Backfill missing embeddings (restores dense recall) |\n\n**Service & setup**\n\n| Command | What it does |\n| --- | --- |\n| `ygg install` · `ygg doctor` · `ygg update` | Guided setup · diagnose with actionable fixes · upgrade |\n| `ygg config` | Show/set persistent settings (`list` · `get` · `set` · `unset`) |\n| `ygg status` · `start` · `stop` · `restart` · `logs` | Manage the always-on daemon |\n| `ygg hooks` · `unhooks` · `register` | SessionStart hook on/off · (re)register MCP |\n| `ygg recommend` · `token` · `uninstall` | Model catalog · print auth token · remove everything |\n\nGive it a personality — edit `~/.yggdrasil/identity.json`:\n\n```json\n{ \"name\": \"Jarvis\", \"persona\": \"concise, proactive, dry wit\", \"user_facts\": [\"prefers TypeScript\", \"ships small PRs\"] }\n```\n\nHeavy seeding, weak laptop? Point distillation at *any* box on your LAN — a desktop with Ollama, LM Studio, llama.cpp, **even an iPhone running a local-LLM server app**: `ygg config set distill_url http://<box>:11434`. Yggdrasil auto-detects the API dialect (Ollama or OpenAI-compatible); your data still never leaves your network — details in [docs/ygg-cli.md](./docs/ygg-cli.md).\n\n</details>\n\n## ❓ FAQ\n\n<details>\n<summary><b>Claude Code already has built-in memory — why Yggdrasil?</b></summary>\n\nBuilt-in memories are per-vendor, per-repo, per-machine, and retrieved by literal text match. Yggdrasil is the layer above: the *same* memory in Claude Code, Codex, and any MCP host, recall *across* projects, optional semantic search — still 100% local. It bridges them **both ways**: `ygg seed` distills your existing native memory + transcripts into the shared brain, and `ygg export-native` writes a curated digest back into `AGENTS.md`/`MEMORY.md` — so even a fresh clone or a tool without Yggdrasil still gets your curated memory.\n</details>\n\n<details>\n<summary><b>Does it send my code or memory to the cloud?</b></summary>\n\nNo. The engine, the database, and the optional models all run locally. No account, no telemetry. The only outbound call is a version check against PyPI.\n</details>\n\n<details>\n<summary><b>Does it automatically remember everything?</b></summary>\n\nNo — by design. Retrieval is automatic; *writing* is deliberate (the agent calls `ygg_remember` for durable lessons). Capture-everything pollutes memory and burns tokens, so we don't. The optional background model consolidates what's already saved (propose-only).\n</details>\n\n<details>\n<summary><b>Do I need a GPU or an API key?</b></summary>\n\nNo. The default is pure lexical search — zero dependencies, instant. Semantic search is opt-in and uses a *local* model via Ollama. The installer recommends one that fits your hardware.\n</details>\n\n<details>\n<summary><b>How heavy is it, and what does it cost in tokens?</b></summary>\n\nThe engine idles at **~21 MB RAM** (lexical default) with ~0% CPU; disk is tens of KB per memory. Session start injects ~300 tokens; each tool call returns a small snippet. All heavy work (indexing, embeddings, consolidation) runs off-LLM on your machine.\n</details>\n\n<details>\n<summary><b>Can I edit or delete memories by hand?</b></summary>\n\nYes. Memories materialize to Markdown notes in an Obsidian vault — read, edit, or remove them like any file. The engine never hard-deletes; it archives (reversible).\n</details>\n\n## 🚦 Status & roadmap\n\n**Alpha.** The happy path and the governance loop are gate-tested (`scripts/run_gates.sh`); not yet hardened for multi-user or production use. macOS today; Linux/Windows service installers are built and in final on-device testing.\n\nNext: 🛰️ cross-surface sync (one memory across CLI, web, and phone) · 🔗 relation graph (`SOLVES` / `SUPERSEDES` / `CONTRADICTS`) · 🐧 Linux/Windows GA.\n\n## 🤝 Contributing\n\nIssues and PRs welcome. Run `scripts/run_gates.sh` and `python3 -m unittest discover -s tests` before submitting — all gates must stay green.\n\n## 📜 License\n\n**GNU AGPL v3.0** — see [LICENSE](./LICENSE). Free and open source: use, modify, self-host, redistribute. If you modify it or offer it as a network service, you must release your source under the same license.\n",
  "bytes": 24343,
  "sha": "ffefdb57cbb8e986e2b9487bafb7c5e4e5d0d560c504671cc40e157c0eb67512",
  "repo_slug": "vondervuflya/yggdrasil",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_vondervuflya_yggdrasil_a1591d50/readme"
}