A tiny MCP server over a plain folder of markdown. One static Go binary with an embedded web UI, one ~24 MB Docker image, ~5 MB idle RAM. No database, no embeddings, no lock-in.
The embedded three-pane workspace (tree, list, split editor) in the same 24 MB binary.
Pre-built multi-arch images (amd64 + arm64) ship to GitHub Container Registry on every release. Point it at any folder and open your browser.
$ mkdir -p vault $ docker run --rm -p 8080:8080 -v "$PWD/vault:/vault" ghcr.io/freema/vellum
Open http://localhost:8080. That's your vault, served straight from ./vault. Auth is off on localhost; flip on OAuth before you expose anything.
The embedded UI stays in sync with the vault on its own. An MCP write lands in the editor without a reload, a deleted note switches to a designed 410 state, and a deploy restart shows a reconnect overlay instead of a dead page.
Your data is portable files, readable in any editor, git or Obsidian. No database, no embeddings, no lock-in.
vellum prepares context; the agent on your side decides. The optional curator tools stay deterministic, no API keys.
Everything is a file; config is environment variables. Nothing to corrupt, nothing to warm up.
Real folders: inbox/, projects/, archive/. Unfiled notes land in the inbox, never a pile of files.
15 MCP tools means less agent context burned on definitions. Each carries read-only, destructive and idempotent hints.
Every note is a first-class MCP resource at vellum://note/{path}. Attach one as context with no tool call, and subscribe for live updates.
Notes are exposed as vellum://note/{path} serving raw markdown. Clients with a resource picker attach one straight from the list. Subscribe to a URI and you get notifications/resources/updated the moment it changes, whether the edit came through MCP or the web editor.
A ranked in-RAM scan with nothing to corrupt and no warm-up. Case-, diacritics- and typo-insensitive, so a search for preklapy still finds překlepy. About 0.4 ms across a 2,000-note vault.
The connector URL must end with /mcp. Claude runs the flow, a browser opens vellum's consent screen, you approve. vellum is its own OAuth issuer, so there is no external identity provider and no calls out.
$ claude mcp add --transport http vellum https://your-host/mcp
Local, no Docker? vellum -mcp-stdio serves MCP over stdio for local clients. The same works as a claude.ai custom connector.
vellum happily serves the same vault folder to your agent while you keep editing anywhere. No sync, no plugin sandbox, no Electron on the server.
Those apps own your notes. vellum's "database" is ls and grep-able markdown you can read in any editor.
One 24 MB image, no vector DB, no API keys, minimal agent context. The whole index rebuilds in ~50 ms at startup.
vellum honours the PORT the platform injects and stores every note on a volume mounted at /vault. Pin a version, add a persistent disk, set a secret, done.
Full guide, hardening notes and a smoke-test checklist live in the deployment docs and threat model.