Skip to main content

One shared, local-first persistent memory for every AI coding agent you use (Codex, Claude Code, Cursor, and more).

Project description

SecondBrain

One shared, local-first memory for every AI coding agent you use.

Codex forgets what Claude Code learned. Cursor starts from zero on a project Antigravity has worked on for weeks. Each tool keeps its own history in its own private store, so you re-explain the same context over and over.

SecondBrain fixes that. Your memory is a plain Markdown vault plus a tiny MCP server. Every MCP-capable agent reads and writes the same notes, so context follows you across tools and machines.

        Codex ─┐
  Claude Code ─┤
       Cursor ─┼──▶  SecondBrain MCP  ──▶  ~/SecondBrain  (Markdown + local index)
  Antigravity ─┘        (memory_search,        AI_CONTEXT/  10_Projects/  30_Knowledge/
   your agent ─┘         memory_capture, ...)   40_Decisions/  50_Conversations/ ...
  • Local-first. Human-readable Markdown on your disk. No account required.
  • Zero heavy deps. Core tools use only the Python standard library. Semantic search is optional and runs locally via Ollama.
  • Shared by protocol. Any agent that speaks MCP joins automatically.
  • Governed. A curated ontology plus audit and eval commands keep a long-lived memory from rotting.

Why this exists

AI coding agents are getting genuinely useful, but their memory is siloed:

  • Switch from one agent to another and you lose all accumulated context.
  • The same preferences, decisions, and project state get re-typed constantly.
  • There is no single place you own and can read, edit, and back up.

SecondBrain makes memory a file format + a protocol instead of a feature locked inside one app. See docs/comparison.md for how this differs from hosted memory services like Mem0 and Zep.


5-minute install

1. Install

Not on PyPI yet — install straight from GitHub for now:

pip install git+https://github.com/no-carve-only-pizza/secondbrain-oss.git

Once a PyPI release exists, this collapses to:

pip install secondbrain-memory

(Optional) local semantic search:

# https://ollama.com  — then:
ollama pull bge-m3

If you skip Ollama, set retrieval.semantic.enabled: false in your config and SecondBrain runs keyword-only.

2. Create your vault

secondbrain init ~/SecondBrain
secondbrain index

This scaffolds the vault (with example notes you can delete) and writes a config to ~/.config/secondbrain/secondbrain.yaml.

3. Connect your agents

# macOS / Linux
python3 install/install_macos.py

# Windows (PowerShell)
powershell -ExecutionPolicy Bypass -File install\install_windows.ps1

The installer registers the MCP server with each agent in your config and drops a shared-memory rule into each agent's global instructions. Restart your AI apps.

Prefer to wire one agent by hand? Point any MCP client at:

{
  "mcpServers": {
    "secondbrain": {
      "command": "python3",
      "args": ["-m", "secondbrain.mcp_server"],
      "env": { "SECONDBRAIN_CONFIG": "/absolute/path/to/secondbrain.yaml" }
    }
  }
}

Or launch it with npx secondbrain-memory (the npm package is a thin launcher for the Python server).

4. Verify

secondbrain health
secondbrain search "hybrid search" --top 3

What your agents can do

The MCP server exposes ten tools:

Tool Purpose
memory_search Hybrid keyword + semantic search over notes and history
memory_get Read a note or a historical catalog entry
memory_related Traverse 1-2 ontology hops around a note
memory_capture Save durable user/decision/project/knowledge/inbox memory
memory_update Append a dated section to an existing note
memory_recent Recent per-tool session logs
memory_status Index and harvester status
memory_rebuild Rebuild the index
memory_audit Flag stale/duplicate/conflicting/unresolved memory
memory_eval Report retrieval recall@k and MRR

The same actions are available on the CLI: secondbrain search|index|audit|eval| harvest|backup|health|config.


How it works

  • Vault (source of truth). Markdown notes under a PARA-style layout. Notes carry lightweight frontmatter (type, status, relations).
  • Index (derived, disposable). SQLite FTS5 for keywords + optional local embeddings, fused with reciprocal rank fusion. Delete it any time; rebuild with secondbrain index.
  • Ontology. A small relation vocabulary connects canonical notes; search results get a light boost from directly linked notes.
  • Harvester. Optionally scans your local agent histories, redacts secrets, and builds a searchable, summary-only catalog — never full transcripts.
  • Config. One secondbrain.yaml drives everything: point vault_root anywhere and the whole toolchain follows.

Why it is worth a star — three differentiators

  1. Cross-agent by default. Memory lives in files + MCP, so Codex, Claude Code, Cursor, and Antigravity share one brain. Hosted memory services center on an SDK/backend your app calls; here, sharing is the starting point.
  2. Local-first and inspectable. The whole memory is Markdown you can git diff, grep, and edit. Embeddings run on your machine. No service to run, no data leaving your laptop.
  3. Governed, measurable memory. A curated ontology plus audit (health) and eval (recall@k / MRR) treat memory quality as something you can verify — not just an ever-growing store.

Full detail: docs/comparison.md.


Screenshots & demo

Scripts to reproduce the README media live in docs/screenshots.md.


Privacy & safety

  • Ordinary personal info is stored only if you opt in (privacy.ordinary_personal_information: allowed).
  • The MCP server and harvester refuse to store values that look like passwords, API keys, tokens, or private keys.
  • Backups are AES-256 encrypted (secondbrain backup).
  • The MCP server refuses to read or write outside your configured vault.

Repository layout

secondbrain-oss/
├── secondbrain.yaml            # config (points at ./vault by default)
├── src/secondbrain/            # config-driven Python package
│   ├── config.py               # the one place paths are resolved
│   ├── memory_index.py         # FTS5 + embeddings + ontology
│   ├── memory_search.py  memory_audit.py  retrieval_eval.py
│   ├── harvest.py  catalog.py  backup.py  health_check.py
│   ├── mcp_server.py           # stdio MCP server (secondbrain-mcp)
│   ├── cli.py                  # the `secondbrain` command
│   └── template_vault/         # packaged copy used by `secondbrain init`
├── vault/                      # the reference/demo vault (same as template)
├── install/                    # macOS/Linux + Windows installers, adapters
├── bin/secondbrain-mcp.js      # npx launcher
└── docs/                       # comparison, screenshot script

Contributing

Issues and PRs welcome. Keep the core dependency-free, keep personal data out of the repo, and run secondbrain eval before changing retrieval.

License

MIT.


Maintainer self-check: no personal data leaked

Run through this before every publish or release. This repository is a template; it must contain zero real personal or private information.

Automated scan (portable, no non-ASCII literals in the command itself)

# 1. ASCII personal tokens and absolute home paths. Expect NO matches.
grep -rInE "your-name|/Users/[a-z]|C:\\\\Users\\\\" \
  --exclude-dir=.git --exclude-dir=node_modules --exclude-dir='*.egg-info' . \
  || echo "clean: no personal tokens"

# 2. Any CJK / non-Latin text (catches leaked non-English personal data).
#    Reports files with runs of Hangul/Han/Hiragana/Katakana. Review each hit;
#    only Unicode-range regex boundaries in *.py are expected.
python3 - <<'PY'
import os, re
pat = re.compile(r"[\uac00-\ud7a3\u3040-\u30ff\u4e00-\u9fff]{2,}")
for dp, dn, fn in os.walk("."):
    dn[:] = [d for d in dn if d not in {".git", "node_modules"} and not d.endswith(".egg-info")]
    for f in fn:
        p = os.path.join(dp, f)
        try:
            for i, line in enumerate(open(p, encoding="utf-8"), 1):
                if pat.search(line):
                    print(f"{p}:{i}: {line.strip()[:100]}")
        except Exception:
            pass
PY

Replace your-name with your actual name/handle when running this locally.

Manual checklist

  • Does any file contain a real name (mine or anyone else's)?
  • Does any file contain a real project, client, employer, or school name?
  • Any CVE numbers, vulnerability research, or security-target details?
  • Any absolute home paths (/Users/<me>, C:\Users\<me>) or machine names?
  • Any real emails, phone numbers, student/employee IDs, or birthdays?
  • Any API keys, tokens, passwords, cookies, or private keys (even fake-looking)?
  • Are all example notes clearly fictional (Widget Store, Homelab, etc.)?
  • Do config files point at generic paths (./vault, ~/SecondBrain)?
  • Are vault/50_Conversations, 00_Inbox, 60_Imports, 90_Archive empty except for templates/.gitkeep, and ignored by .gitignore?
  • Do screenshots/GIFs show only the demo vault, no personal windows?

If any box is unchecked, do not publish until it is resolved.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

secondbrain_memory-0.1.0.tar.gz (49.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

secondbrain_memory-0.1.0-py3-none-any.whl (60.6 kB view details)

Uploaded Python 3

File details

Details for the file secondbrain_memory-0.1.0.tar.gz.

File metadata

  • Download URL: secondbrain_memory-0.1.0.tar.gz
  • Upload date:
  • Size: 49.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for secondbrain_memory-0.1.0.tar.gz
Algorithm Hash digest
SHA256 9992ecb5ad6a867c21c3a2272ac13f1480989ad467c7fdce430a6a7401d01c12
MD5 672479ddab5c80fde05c5f48dd122ea1
BLAKE2b-256 988cfd45903ad777de5f8193377e9ec700aead462eb3a010a09ef88dbad4d694

See more details on using hashes here.

File details

Details for the file secondbrain_memory-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for secondbrain_memory-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c66031e112933a23f48f6b151aac79ea84bac6a8a4f1973dc1e120d7356ff7ab
MD5 9e79a097f15c9f2984558f9b63dfb372
BLAKE2b-256 d6f6cdde145a8c2eef45386d1f548d89f42b467c219e6043c5bfca73bf6cca40

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page