Skip to content

Local memory tiers and custom stores

Mono-agent ships one first-party memory engine, selected with memory.backend: "bujo" (the default). Its memory.mode chooses one of three local capability tiers: lite, journal, or bujo. The tiers share the same durable completed-turn admission contract and local root; they differ in provider requirements and curation.

DimensionLiteJournalBuJo
Local durable rootSQLite + canonical daily MarkdownSQLite + canonical daily MarkdownSQLite + raw audit, curated daily Markdown, graph, projections
RecallBM25 FTSBM25 + vector RRFBM25 + vector RRF + one-hop graph expansion
Embeddingsnonerequiredrequired
Capture chat modelnonenonerequired
Completed-turn projectiondeterministic host summarydeterministic host summary; vector work is restartabledurable raw observation followed by strict bounded curation
MemoryJournal chronologyyesyesyes; raw audit stays excluded
Consolidationnonenoneprojection-only, scheduled in app
Best fitminimal dependenciessemantic recall without a capture LLMcurated durable facts and entity relationships

All tiers are local in the sense that canonical memory is rooted at memory.path. That does not make the whole application network-isolated: model providers, channels, web tools, embeddings providers, and operator-configured MCP servers may still use the network.

Use Lite when lexical recall and a human-readable chronological record are enough. It requires no embeddings or chat model.

Use Journal when you want semantic ranking but do not want an LLM deciding what to retain. The successful turn is admitted before vector indexing; an unavailable embedding service therefore leaves restartable work instead of discarding the turn.

Use BuJo when you need strict model-guided extraction, reconciliation, relationships, and projection-only consolidation. It requires both embeddings and a capture LLM. Invalid or partial model output fails closed and remains retryable.

The tier matrix is strict. Mono-agent does not silently downgrade Journal or BuJo when a required provider is missing.

Lite:

{
"memory": {
"backend": "bujo",
"mode": "lite",
"path": "./.mono-agent/memory",
"writeMode": "append-host-summary"
}
}

Journal adds an embeddings block:

{
"memory": {
"backend": "bujo",
"mode": "journal",
"path": "./.mono-agent/memory",
"writeMode": "append-host-summary",
"embeddings": {
"provider": "ollama",
"model": "nomic-embed-text:v1.5",
"endpoint": "http://localhost:11434",
"dim": 768
}
}
}

BuJo adds a capture LLM and uses capture:

{
"memory": {
"backend": "bujo",
"mode": "bujo",
"path": "./.mono-agent/memory",
"writeMode": "capture",
"embeddings": {
"provider": "ollama",
"model": "nomic-embed-text:v1.5",
"endpoint": "http://localhost:11434",
"dim": 768
},
"llm": {
"provider": "ollama",
"model": "qwen3.6:latest",
"endpoint": "http://localhost:11434"
}
}
}

See Memory for the full tier contract and Capture and recall for admission, persistence, and tool behavior.

Framework embedders can inject any structural MemoryStore into createConfiguredAgentResponder. This neutral contract remains supported and may be implemented by a local or remote service. Injection is a code-level composition choice; mono-agent does not infer a service from retired configuration and does not silently reinterpret one backend as another.

A read-only store implements load. A writable store used with append-host-summary or capture must also implement persistCompletedTurn and honor stable runId admission. See Programmatic composition.

Generic MCP configuration is independent of memory selection. An operator-authored server remains untouched even if its name or URL resembles a retired integration.

Migrating retired first-party Supermemory support

Section titled “Migrating retired first-party Supermemory support”

First-party Supermemory config, automatic official MCP injection, and the optional package have been removed. Active legacy selectors, blocks, or environment variables fail closed with migration guidance; they are never converted to a local tier. An exact empty memory.supermemory: {} object and blank retired environment assignments are tolerated only as inert upgrade tombstones and enable nothing.

The upgrade performs no automatic replacement, export, local import, remote data migration, or remote cleanup. Existing remote data remains untouched. If export or cleanup is required, perform it separately with the known-good version and service workflow you already operate before upgrading; this repository does not establish a new package pin.

See Framework simplification migration for the exact removal checklist.