A persistent, graph-structured second brain for Claude and any MCP client. Self-hosted on TriliumNext, inspectable, portable — yours to own, never locked in a vendor's black box.
Placement, naming, labels, deduplication, lifecycle, date stamping, HTML sanitisation — and structure itself — are deterministic server policy, never delegated to the model. It never chooses a parent note, never sets a label, never checks for duplicates, never stamps a date.
That division is what makes the memory reliable. A prompt-requested invariant holds until the model has a bad day. A server-enforced one holds.
Not one undifferentiated pile of embeddings. Five purpose-built areas, each with its own kinds, lifecycle and rules — created on first run and enforced on every write.
Biography, goals, preferences — three maintained singletons holding current-state truth, edited in place rather than appended to.
Its responsibilities, its operating protocols, and a daily diary it writes itself — unfiltered, first-person, edited by nobody.
One session note per day, plus titled multi-session threads that age from active to dormant to archived. Nothing is ever deleted.
Per-domain books, each born with a Sources note so every claim has a sourcing home from the first write.
An auto-generated change log for every day, and a live Mermaid render of the typed relation graph — maintained as a real note you can open.
Most memory systems ask the model to record its work. This one refuses to close the session until it has — checked by tool invocation, not by narration.
// every session opens with full orientation > start() today 2026-08-06 · Thursday master biography · goals · preferences threads 12 active, 0 dormant lastSession what changed since you were here // … the work happens … > close(summary) ✗ preclose_incomplete missing: remarks, diary // narrating that you did the steps doesn't count. // only tool calls do. > remarks() → diary(body) → close(summary) ✓ session logged · backup taken · daily log regenerated
Every kind has a canonical shape, served by template() and held on write. A new thread requires its goal. Duplicate headings are detected. Timestamps are server-maintained.
Sixteen relation verbs, closed vocabulary. Every read returns its outbound edges for free, because the attributes were already loaded.
Every write is duplicate-guarded or upserting, so a crash or a retry never double-writes. Content surgery survives the editor's own HTML rewriting.
A maintenance sweep ages threads, migrates legacy kinds, and reports orphans, duplicate subjects, stubs and structural drift — as conversation starters, never silent auto-fixes.
Everything lives in a real note app you can open and edit by hand. Fix what the model wrote and it reads your correction next session.
stdio for Claude Desktop and Claude Code, an HTTP connector for hosted deploys, and a full OAuth 2.1 server so claude.ai can connect at all.
Self-hosted, MIT-licensed, and running in production every day. The honest part: you'll need a Trilium instance and a token first — which is exactly why your data stays yours.