BrainCTL

Persistent memory for AI agents. Single SQLite file, 192 MCP tools. FTS5 search, knowledge graph, session handoffs, write gate. No server, no API keys, no LLM calls.

brainctl

Forgetful agents, fixed by a SQLite file.

One brain.db gives your agent durable memory across sessions — facts learned, decisions made, entities tracked, and state handed off. No server. No API keys. No LLM calls required.

from agentmemory import Brain

brain = Brain(agent_id="my-agent")
ctx = brain.orient(project="api-v2")           # session start: handoff + events + triggers + memories
brain.remember("rate-limit: 100/15s", category="integration")
brain.decide("use Retry-After for backoff", "server controls timing", project="api-v2")
brain.wrap_up("auth module complete", project="api-v2")  # session end: logs + handoff for next run

Install

pip install brainctl

Requires Python 3.11+. SQLite is built-in. No other mandatory dependencies.

pip install brainctl[mcp]     # MCP server — 201 tools for Claude Desktop, Cursor, VS Code
pip install brainctl[vec]     # vector similarity search (sqlite-vec + Ollama)
pip install brainctl[signing] # Ed25519-signed memory exports + optional Solana on-chain pinning
pip install brainctl[all]     # everything

5-line example

from agentmemory import Brain

brain = Brain(agent_id="research-bot")
brain.remember("OpenAI rate-limits at 500k TPM on tier 3", category="integration")
results = brain.search("rate limit")          # FTS5 full-text, stemming, ranked
brain.entity("OpenAI", "service", observations=["500k TPM tier 3", "REST API"])
brain.relate("OpenAI", "provides", "GPT-4o")

Feature checklist

Memory types

  • convention, decision, environment, identity, integration, lesson, preference, project, user
  • Category controls natural half-life: identity decays over ~1 year; integration details over ~1 month
  • Hard cap: 10,000 memories per agent. Emergency compression retires lowest-confidence entries.

Retrieval modes

  • FTS5 full-text search with stemming (default, zero dependencies)
  • Vector similarity via sqlite-vec + Ollama nomic-embed-text (brainctl[vec])
  • Hybrid: Reciprocal Rank Fusion over FTS5 + vector results
  • Context profiles: named search presets scoped to task type (--profile ops, --profile research, etc.)
  • --benchmark preset: flattens recency/salience for synthetic evaluation runs

Reranker chain

  • Intent classifier (regex, 10 labels → 6 profiles) routes queries at cmd_search
  • Post-FTS reranking by recency, salience, Q-value utility, and Bayesian recall confidence
  • Cold-start: auto-detects available reranker backends (cross-encoder > sentence-transformers > fallback)
  • Retrieval regression-gated in CI: >2% drop on P@1/P@5/MRR/nDCG@5 fails the build

Knowledge graph

  • Typed entity nodes: agent, concept, document, event, location, organization, person, project, service, tool
  • Auto entity linking: memories mentioning a known entity create the edge automatically
  • Compiled truth synthesis per entity (brainctl entity compile <name>)
  • 3-level enrichment tier; canonical alias dedup (brainctl entity alias add)
  • Spreading-activation recall across the graph (brain.think(query))

Belief revision (AGM)

  • Belief set per agent with confidence weights
  • Conflict detection and resolution via brainctl belief conflicts and brainctl belief merge
  • Collapse mechanics: decoherent beliefs quarantined, recovery candidates surfaced
  • PII recency gate (Proactive Interference Index) on supersedes operations

Signed exports

  • brainctl export --sign produces a portable Ed25519-signed JSON bundle
  • brainctl verify <bundle.json> checks the signature offline — no brainctl required for verification
  • Optional: --pin-onchain writes the SHA-256 hash as a Solana memo transaction (~$0.001 per pin)
  • Managed wallet: brainctl wallet new creates a local keypair at ~/.brainctl/wallet.json for users without an existing Solana setup
  • Memories never leave the machine; only the hash goes on-chain (opt-in)

Plugins (16 first-party)

Agent frameworks:

PluginTarget
plugins/claude-code/Claude Code
plugins/codex/OpenAI Codex CLI
plugins/cursor/Cursor
plugins/gemini-cli/Gemini CLI
plugins/eliza/Eliza (TypeScript)
plugins/hermes/Hermes Agent
plugins/openclaw/OpenClaw
plugins/rig/Rig
plugins/virtuals-game/Virtuals Game
plugins/zerebro/Zerebro

Trading bots:

PluginTarget
plugins/freqtrade/Freqtrade
plugins/jesse/Jesse
plugins/hummingbird/Hummingbird
plugins/nautilustrader/NautilusTrader
plugins/octobot/OctoBot
plugins/coinbase-agentkit/Coinbase AgentKit

MCP server (201 tools)

{
  "mcpServers": {
    "brainctl": {
      "command": "brainctl-mcp"
    }
  }
}

Add to ~/.claude/claude_desktop_config.json, ~/.cursor/mcp.json, or equivalent. Full tool list and a decision tree: MCP_SERVER.md.

CLI reference

brainctl memory add "content" -c convention   # store a memory
brainctl search "query"                       # FTS5 search
brainctl vsearch "semantic query"             # vector search (requires [vec])
brainctl entity create "Alice" -t person      # create entity
brainctl entity relate Alice works_at Acme    # link entities
brainctl event add "deployed v3" -t result    # log an event
brainctl decide "title" -r "rationale"        # record a decision
brainctl export --sign -o bundle.json         # signed export
brainctl verify bundle.json                   # verify a bundle
brainctl wallet new                           # create managed signing wallet
brainctl stats                                # DB overview
brainctl doctor                               # health check
brainctl lint                                 # quality issues
brainctl gaps scan                            # coverage + orphan + broken-edge scans
brainctl consolidate cycle                    # full consolidation pass

Python API (22 methods)

MethodWhat it does
orient(project)One-call session start: handoff + events + triggers + memories
wrap_up(summary)One-call session end: logs event + creates handoff
remember(content, category)Store a durable fact through the W(m) write gate
search(query)FTS5 full-text search with stemming
vsearch(query)Vector similarity search (optional)
think(query)Spreading-activation recall across the knowledge graph
forget(memory_id)Soft-delete a memory
entity(name, type)Create or retrieve an entity
relate(from, rel, to)Link two entities
log(summary, type)Log a timestamped event
decide(title, rationale)Record a decision with reasoning
trigger(condition, keywords, action)Set a prospective reminder
check_triggers(query)Match triggers against text
handoff(goal, state, loops, next)Save session state explicitly
resume()Fetch and consume latest handoff
doctor()Diagnostic health check
consolidate()Promote high-importance memories
tier_stats()Write-tier distribution
stats()Database overview
affect(text)Classify emotional state
affect_log(text)Classify and store emotional state
close()Close the shared SQLite connection

Memory lifecycle

  • Write gate (W(m)): surprise scoring rejects redundant writes. Bypass with force=True.
  • Three-tier routing: high-value memories get full indexing; low-value get lightweight storage.
  • Duplicate suppression: near-duplicates reinforce existing memories instead of creating new rows.
  • Half-life decay: unused memories fade at a rate set by category. Recalled memories are reinforced.
  • Consolidation: Hebbian learning, temporal promotion, compression — runs on a cron schedule.

Retrieval benchmarks

Tested with default settings, no tuning for benchmark data. Two harnesses ship in the tree:

  • tests/bench/ — single-system retrieval baselines for Brain.search and cmd_search, gated against regression in CI.
  • tests/bench/competitor_runs/ — same-fixture head-to-head harness with adapters for Mem0, Letta, Zep, Cognee, MemPalace, OpenAI Memory. Skip-not-fabricate contract: missing SDK / API key raises CompetitorUnavailable instead of returning a fake 0. Each result row carries a provenance block recording retrieval_mode, vector_enabled, embedding_model, rerankers_active, and the full search_args so the JSON is self-describing.

brainctl-only baselines (Brain.search, FTS5)

LongMemEval (289-question retrieval-friendly subset of longmemeval_s):

metricoverallsingle-session-assistantsingle-session-usermulti-session
hit@10.8821.0000.9000.910
hit@50.9761.0001.0000.985
MRR0.9241.0000.9350.944

LOCOMO (1,982 questions, 5 categories, 10 conversations):

metricoveralladversarialtemporalopen-domainsingle-hopmulti-hop
hit@10.3410.3770.4050.3730.1670.174
hit@50.5720.6030.6480.6020.4290.315
MRR0.4450.4790.5100.4790.2820.232

LOCOMO single-hop and multi-hop hit@1 are weak (0.167 / 0.174). Root cause: recency and salience rerankers bias toward recent memories; LOCOMO uses uniform synthetic timestamps with gold evidence concentrated in early sessions, so the rerankers fight FTS ranking. A --benchmark preset that flattens recency/salience is available for evaluation runs.

Head-to-head vs MemPalace (measured 2026-04-18)

Same machine (Intel Core Ultra 7 258V / 33.9 GB RAM / Windows 10), same datasets, same scoring. Repro: python benchmarks/compare_memory_engines.py --label full_compare.

benchmarkscoringbrainctlmempalacedelta
LoCoMo (n=1,986)session-level avg recall0.92170.6028+0.319
LongMemEval (n=470)R@50.97020.9660+0.004
LongMemEval (n=470)R@100.98940.9830+0.006
MemBench FirstAgent (n=200)hit@50.9300.885+0.045
ConvoMemblockedblockedn/a

Honesty caveat (verbatim from the artifact bundle): the vector-on/off flag for the cmd_search run was not persisted in that specific bundle. Subsequent runs through tests/bench/competitor_runs/ record retrieval_mode + vector_enabled automatically (commit 40c1ed2), so the gap is closed for any future re-run. We will not cite the cmd_search numbers above as a clean vector-vs-FTS statement without rerunning that exact variant with the flag captured.

Upgrading

cp $BRAIN_DB $BRAIN_DB.pre-upgrade
brainctl doctor      # diagnose migration state
brainctl migrate     # apply pending migrations

For databases predating the migration tracker, see the full recovery workflow in the README's Upgrading section (below the install block in the full docs).

Multi-agent

researcher = Brain(agent_id="researcher")
writer     = Brain(agent_id="writer")

researcher.remember("API uses OAuth 2.0 PKCE", category="integration")
writer.search("OAuth")   # finds researcher's memory — same brain.db, shared graph

Every operation accepts agent_id for attribution. Agents share one brain.db. The knowledge graph connects insights across agents automatically.

Documentation

DocWhat it covers
docs/QUICKSTART.md60-second onboarding — install, remember, search, sign
docs/COMPARISON.mdFeature matrix vs Mem0, Letta, Zep, Cognee, OpenAI Memory
docs/AGENT_ONBOARDING.mdStep-by-step agent integration guide
docs/AGENT_INSTRUCTIONS.mdCopy-paste blocks for MCP, CLI, Python agents
docs/SIGNED_EXPORTS.mdBundle format, threat model, verify-without-brainctl recipe
MCP_SERVER.md201 tools with decision tree
ARCHITECTURE.mdTechnical deep-dive

License

MIT

Serveurs connexes

NotebookLM Web Importer

Importez des pages web et des vidéos YouTube dans NotebookLM en un clic. Utilisé par plus de 200 000 utilisateurs.

Installer l'extension Chrome