session-indexer: giving Claude Code a memory that doesn't die with the project next door A developer built session-indexer, a Go tool that indexes Claude Code session transcripts into a per-project SQLite database for semantic memory retrieval. The tool avoids centralized memory stores by keeping an append-only database inside each project's .claude/ directory, using bge-m3 embeddings via Ollama with automatic fallback to FTS5 keyword search. It injects relevant context from past sessions into new sessions based on git branch and commit messages. I come back to a project after a week off, and the first ten minutes always go the same way: scrolling through old sessions, trying to remember what we actually decided about X . A simple rolling log — "here's what we did yesterday" — solves half of that. It doesn't solve "what have we discussed about this topic, across every session, ever?" session-indexer is my attempt at the second half. It's a small Go tool that indexes Claude Code session transcripts for each project into a local SQLite database and retrieves relevant chunks by semantic similarity when a new session starts. Tools like mempalace or agentmemory keep one shared store across every project and every agent. That architecture has one fatal flaw: if the central store dies, everything dies. A corrupted vector index or a crashed MCP server takes down memory for every project you have, simultaneously, and recovery is not trivial. session-indexer does the opposite. .claude/sessions.db lives inside the project's own .claude/ directory. Append-only. If one project's DB gets corrupted, the fix is to delete it and rerun mine on the JSONL transcripts already on disk. Nothing else is affected. Two hooks, wired into Claude Code's lifecycle: session-index.sh — when a session ends, mines the JSONL transcript into .claude/sessions.db , embedding each chunk via bge-m3 Ollama if it's available. session-recall.sh — when a new session opens, derives a search query from the current git branch name and recent commit messages, searches the index, and injects the top matching chunks as context. No manual query needed — it just knows roughly what you're about to work on.Manual search works too, any time: session-indexer search "config validation approach" --db .claude/sessions.db or from inside Claude Code: /recall config validation approach session-indexer mine