Launching on Product Hunt · 21 July
Self-hosted MCP server · MIT

Self-hosted memory your agent can read & write.

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.

Get started View on GitHub
Open source · MIT One 24 MB container ~5 MB idle RAM 15 MCP tools docker compose up -d
vellum three-pane workspace: vault tree, note list, split markdown editor

The embedded three-pane workspace (tree, list, split editor) in the same 24 MB binary.

Quick start

Try it in one command.

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.


Live workspace

Your agent writes markdown. You watch it appear.

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.

No reload. MCP writes and web edits reconcile live. Shareable views. Folder, tag and status filters live in the URL. Conflict-safe. Every write is guarded by a content hash.
An MCP write appearing live in the vellum workspace
Why vellum

Deliberately light. The smallest stack that just works.

md

Flat markdown

Your data is portable files, readable in any editor, git or Obsidian. No database, no embeddings, no lock-in.

Never calls an LLM

vellum prepares context; the agent on your side decides. The optional curator tools stay deterministic, no API keys.

fs

Dumb & deterministic

Everything is a file; config is environment variables. Nothing to corrupt, nothing to warm up.

/

Structure is a feature

Real folders: inbox/, projects/, archive/. Unfiled notes land in the inbox, never a pile of files.

15

Small tool surface

15 MCP tools means less agent context burned on definitions. Each carries read-only, destructive and idempotent hints.

://

Notes as resources

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.


MCP resources

Attach a note as context, no tool call.

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.

vellum notes surfaced in an MCP client's resource picker
Search & command palette

Instant. Forgiving. Zero index.

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.

Ranked. Title beats tag beats path beats body; word-starts win. No bleve, no vectors. The metadata index narrows, RAM matches the rest. ⌘K everywhere. Jump to any note or run a command.
vellum command palette open over the workspace

Connect Claude

One line, then OAuth 2.1.

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.


Why vellum and not…

It doesn't replace your editor. It serves the same folder.

vs. Obsidian + plugins

Keep your editor

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.

vs. Notion / Anytype

You own the data

Those apps own your notes. vellum's "database" is ls and grep-able markdown you can read in any editor.

vs. heavier MCP servers

One tiny container

One 24 MB image, no vector DB, no API keys, minimal agent context. The whole index rebuilds in ~50 ms at startup.


Deploy anywhere

Your reverse proxy is the only thing exposed.

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.

Docker Compose Railway Render Fly.io Coolify / Traefik Caddy

Full guide, hardening notes and a smoke-test checklist live in the deployment docs and threat model.

a calm window into a folder of markdown

Give your agent a memory
you can actually read.