{"slug": "i-gave-my-ai-a-memory-that-s-just-a-folder-of-markdown-i-own", "title": "I gave my AI a memory that's just a folder of markdown I own", "summary": "A developer built Vellum, an open-source MCP server that gives AI agents memory as a folder of markdown files the user owns. The project avoids databases and embeddings, using a plain directory of .md files that agents can read and write via MCP, and it is available on GitHub under the MIT license.", "body_md": "🚀\n\nIt's live on Product Hunt today.If this resonates, an upvote genuinely helps:[Vellum on Product Hunt]\n\nEvery time I gave my AI assistant \"memory,\" I ended up in the same place: the memory lived in **someone else's database**, as **embeddings I couldn't read**, in a **cloud I didn't control**. Cancel the subscription and the memory goes with it. That felt backwards.\n\nSo I built the opposite. It's called **Vellum**, it's open source (MIT), and the whole idea fits in one sentence:\n\nPoint your agent at a folder of markdown. It reads and writes notes over MCP. The folder stays flat files\n\nyouown.\n\nVellum is a small, self-hosted **MCP server** over a plain directory of `.md`\n\nfiles. Any MCP client (Claude, Cursor, ChatGPT desktop, the MCP Inspector) connects to it and can list, read, write, patch, search, tag, and backlink your notes. Every note is also exposed as a first-class **MCP resource** (`vellum://note/{path}`\n\n), so your agent can attach a note as context straight from its resource picker, no tool call, no copy-paste.\n\nAnd because the \"database\" is just a folder, you keep editing the same vault in Obsidian, vim, or `git`\n\n. Nothing is trapped.\n\n```\n# try it in one command\ndocker run --rm -p 8080:8080 -v \"$PWD/vault:/vault\" ghcr.io/freema/vellum\n\n# point Claude at it\nclaude mcp add --transport http vellum https://your-host/mcp\n```\n\nThe whole project is an exercise in picking the smallest thing that just works.\n\n**No database. Ever (v1).** Tags, backlinks, and task states live in an in-RAM index rebuilt in ~50 ms at startup. There's nothing to migrate, corrupt, or back up separately. Your data *is* the files.\n\n**No embeddings.** Search is a ranked in-memory scan: the metadata index narrows by tag/dir, content is matched from a cache, results are ranked (title > tag > path > body). It's case-, diacritics-, and typo-insensitive (\"preklapy\" finds \"překlepy\") and runs in ~0.4 ms warm over a 2,000-note vault. No vector store, no warm-up, no index to rebuild. The `Searcher`\n\ninterface exists so I can slot in bleve *if it ever hurts*. It hasn't.\n\n**It never calls an LLM itself.** Vellum prepares context; your agent decides. The optional \"curator\" tools (folder suggestions by tag overlap, orphan/untagged/stale-inbox lists) are all deterministic, no API keys, no calls out.\n\n**It's its own OAuth 2.1 issuer.** One client secret, PKCE, opaque in-memory tokens that die with the process. No external identity provider, nothing phones home. Writes are conflict-safe: every read returns a content hash, and write tools reject a stale hash instead of clobbering.\n\n**Small on purpose.** One static Go binary with an embedded React UI, a 24 MB distroless image, ~5 MB idle RAM, a read-only container that only ever writes into the mounted vault. `docker compose up -d`\n\nand you're done, or one-click on Railway / Render / Fly.\n\n`ls`\n\nand `grep`\n\n.It also ships an embedded three-pane workspace (tree / list / editor) in the same binary. It stays in sync with the vault on its own: MCP writes appear without a reload, a split view puts raw markdown beside the rendered note, and tasks (`type: task`\n\n+ status) filter by state. It's the \"human\" window into the same folder your agent is working in.\n\nv1 is intentionally boring and solid. I'd love feedback on two things especially: the **MCP tool surface** (15 tools today: what's missing, what's noise?) and the **no-embeddings** bet (where does a pure scan stop being enough for you?).\n\nIf \"your agent's memory should be files you own\" resonates, the repo is here:\n\n👉 ** github.com/freema/vellum** (MIT)\n\n*Where does a pure scan stop being enough for you: at what vault size would you reach for embeddings? That's the bet I'm least sure about.*", "url": "https://wpnews.pro/news/i-gave-my-ai-a-memory-that-s-just-a-folder-of-markdown-i-own", "canonical_source": "https://dev.to/freema/i-gave-my-ai-a-memory-thats-just-a-folder-of-markdown-i-own-dgn", "published_at": "2026-07-21 11:00:00+00:00", "updated_at": "2026-07-21 11:02:22.524207+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents"], "entities": ["Vellum", "MCP", "Claude", "Cursor", "ChatGPT", "Obsidian", "GitHub", "Product Hunt"], "alternates": {"html": "https://wpnews.pro/news/i-gave-my-ai-a-memory-that-s-just-a-folder-of-markdown-i-own", "markdown": "https://wpnews.pro/news/i-gave-my-ai-a-memory-that-s-just-a-folder-of-markdown-i-own.md", "text": "https://wpnews.pro/news/i-gave-my-ai-a-memory-that-s-just-a-folder-of-markdown-i-own.txt", "jsonld": "https://wpnews.pro/news/i-gave-my-ai-a-memory-that-s-just-a-folder-of-markdown-i-own.jsonld"}}