Show HN: Seahorse – an agent's memory that lives in your own notes Seahorse, a new open-source memory system for LLM agents, stores persistent, bi-temporal memory in local markdown files readable in Obsidian, addressing the problems of opaque, costly, and unreliable existing memory tools. The system, installable via `pip install seahorse-memory`, provides an MCP-native interface and CLI, allowing agents like Claude Code to recall and maintain context across sessions without vendor lock-in. Seahorse claims to overcome issues such as the LOCOMO benchmark's 6.4% wrong gold answers and Mem0's broken reproduction (issue #2800), offering a portable standard that humans can read and edit. Persistent, bi-temporal memory for LLM agents — local-first, MCP-native, Obsidian-readable. pip install seahorse-memory seahorse init myvault && seahorse remember "Sergio lives in Madrid" seahorse recall "where does Sergio live?" LLM agents start every session from zero. The context window is not memory: it is a scratchpad that resets, and it is too small to hold what an agent has learned across weeks of work. The tools that try to fix this have their own problems: They forget badly. Most memory systems accumulate facts forever and never resolve contradictions — an agent "remembers" that a user lives in Madrid and Barcelona at the same time, with no way to know which is current. They are opaque. Memory lives in a proprietary database the human cannot read, edit, or audit. If the agent is wrong, there is no way to correct it. They are expensive to feed. Every episode goes through an LLM, so writing thousands of small facts costs real money. They lock you in. Adopting a memory system often means adopting its runtime, its provider, or its ecosystem. Their benchmarks are not trustworthy. The field's own numbers are hard to reproduce: the LOCOMO benchmark has 6.4% wrong gold answers, Mem0's reproduction is broken issue 2800 https://github.com/mem0ai/mem0/issues/2800 , and MTEB embedding scores do not predict memory-retrieval performance LMEB, arXiv 2603.12572 https://arxiv.org/abs/2603.12572 . Seahorse is a different approach: an open, portable, bi-temporal memory standard that an agent writes to and reads from, that a human can read and correct, and that does not lock you into any runtime or provider. Developers building agents Claude Code, Cursor, Codex, or your own who want the agent to remember decisions and context across sessions. Obsidian power users who want their notes to be more than a static archive — a knowledge base an agent can query and maintain. Teams that want portable memory — a format they can migrate between vendors without replaying history. The fastest way to see Seahorse is to give Claude Code a memory that survives between sessions. Three steps: 1. Capture sessions. seahorse setup installs the observer hooks into ~/.claude/settings.json ; seahorse observe start runs the capture worker. Every session is recorded as episodes — skip-first near-zero cost , redacted, with a deterministic summary. seahorse setup seahorse observe start 2. Recall across sessions. The SessionStart hook injects seahorse context into the next session, so the agent starts with what it learned before. Ask directly with seahorse recall : seahorse context seahorse recall "what did we decide about the API design?" 3. Bring your existing memory. If you already use claude-mem, seahorse import migrates its observations into canonical episodes — no replay, no lock-in: seahorse import --mode commit The key difference: the agent writes into the same vault you edit in Obsidian . Every episode is a markdown file with YAML frontmatter — readable, editable, diffable in git, and auditable by a human. The agent's memory is not a black box; it is your notes. Seahorse is built for agents: the memory surface is a stdio MCP server io.seahorse.memory/v1 that any agent that speaks MCP can connect to. The CLI is for humans and scripts; agents talk to seahorse-mcp . Register the server in Claude Code local scope, default : claude mcp add seahorse-mcp -- uvx --from seahorse-memory seahorse-mcp --vault "${HOME}/myvault" The -- is required — it separates Claude's own flags from the server command. Use --scope project to share the server with a team via .mcp.json checked into git . Verify with claude mcp list should show ✔ Connected and claude mcp get seahorse-mcp . Or configure it in .mcp.json at the project root works with any MCP client : { "mcpServers": { "seahorse-mcp": { "type": "stdio", "command": "uvx", "args": "--from", "seahorse-memory", "seahorse-mcp", "--vault", "${HOME}/myvault" } } } Note: ~ is not expanded in .mcp.json — use ${HOME} or an absolute path. mcpServers in settings.json is silently ignored; MCP servers live in ~/.claude.json for user/local scope and in .mcp.json for project scope. Once connected, the agent sees the 14 memory tools — remember , recall , recall timeline , recall full , improve , forget , build pit , skill add , skill show , skill list , skill search , freshness view , audit log , follow supersedes chain see The agent surface the-agent-surface--7-memory-native-primitives--7-proceduralread-only-tools . The observer seahorse setup is a separate piece: it captures Claude Code sessions into episodes. The MCP server is how the agent reads and writes memory. Both work together — capture sessions, then recall across them. graph LR A Claude Code / any MCP agent -- stdio MCP io.seahorse.memory/v1 -- S seahorse-mcp S -- E Bi-temporal engine E -- DB sqlite3 + sqlite-vec + FTS5 E -- V Obsidian vault: markdown + F3.1 frontmatter H Human in Obsidian -- V An agent talks to seahorse-mcp over stdio MCP. The engine stores every episode twice: once in a single-file SQLite database sqlite-vec for vector search, FTS5 for full-text , and once as a markdown file with F3.1 frontmatter in the vault. The human edits the same markdown. The format is versioned and documented in docs/f3.1-format.md /ssanvi-builds/seahorse/blob/main/docs/f3.1-format.md . Install PyPI : pip install seahorse-memory …or with uv: uv tool install seahorse-memory For hybrid semantic retrieval FastEmbed ONNX, downloads mE5-small on first embed : pip install "seahorse-memory embeddings " For the multi-LLM extraction path LiteLLM : pip install "seahorse-memory llm " Create a vault and write your first episode: seahorse init myvault seahorse remember "Sergio lives in Madrid" --title home seahorse recall "madrid" Improve and forget append-only; history is preserved : seahorse improve