Architecture Overview
System Components
Claude-Mem operates as a Claude Code plugin with the following core components:- Plugin Hooks - Lifecycle events (Setup version-check + 5 lifecycle hooks: SessionStart, UserPromptSubmit, PreToolUse for
Read, PostToolUse, Stop) - Worker Service - Express HTTP API on a per-user port; processes observations via the Claude Agent SDK (or Gemini / OpenRouter)
- Database Layer - SQLite + FTS5 (and optional Chroma for semantic search)
- Search Tools - HTTP API + the
mem-searchskill / MCP server for progressive disclosure search - Viewer UI - React-based real-time memory stream served by the worker
Technology Stack
| Layer | Technology |
|---|---|
| Language | TypeScript (ES2022, ESNext modules) |
| Runtime | Node.js 20+ and Bun ≥ 1.0 |
| Database | SQLite 3 with bun:sqlite driver |
| Vector Store | Chroma (optional, for semantic search) |
| HTTP Server | Express.js 5 |
| Real-time | Server-Sent Events (SSE) |
| UI Framework | React + TypeScript |
| AI SDK | @anthropic-ai/claude-agent-sdk (or Gemini / OpenRouter) |
| Build Tool | esbuild (bundles TypeScript) |
| Process Manager | Bun |
| Testing | bun test |
Data Flow
Memory Pipeline
- Input: Claude Code sends tool execution data via stdin to hooks
- Storage: Hooks write observations to SQLite database
- Processing: Worker service reads observations, processes via SDK
- Output: Processed summaries written back to database
- Retrieval: Next session’s context hook reads summaries from database
Search Pipeline
- User Query: User asks naturally: “What bugs did we fix?”
- MCP Tools Invoked: Claude recognizes intent and invokes MCP search tools
- HTTP API: MCP tools call HTTP endpoint (e.g.,
/api/search/observations) - SessionSearch: Worker service queries FTS5 virtual tables
- Format: Results formatted and returned via MCP
- Return: Claude presents formatted results to user
Session Lifecycle
Directory Structure
Component Details
1. Plugin Hooks
The plugin registers a Setup-phaseversion-check.js plus five lifecycle hooks. Each lifecycle event invokes bun-runner.js to spawn worker-service.cjs with a hook claude-code <event> argument; the worker process is the single dispatcher for all hook logic. Events:
- Setup →
version-check.js(sub-100ms marker check; never installs anything) - SessionStart → start worker, then
hook claude-code context(context injection) - UserPromptSubmit →
hook claude-code session-init - PreToolUse (matcher
Read) →hook claude-code file-context - PostToolUse (matcher
*) →hook claude-code observation - Stop →
hook claude-code summarize(summary generation)
bun install) is performed by npx claude-mem install / npx claude-mem repair with a visible installer spinner; the Setup hook itself only reads the .install-version marker.
See Plugin Hooks for detailed hook documentation.
2. Worker Service
Express.js HTTP server on a per-user port (default37700 + (uid % 100), override via CLAUDE_MEM_WORKER_PORT) with:
- Search HTTP API endpoints
- Viewer UI HTTP/SSE endpoints
- Async observation processing via the Claude Agent SDK (or Gemini / OpenRouter)
- Real-time updates via Server-Sent Events
- Auto-managed by Bun
3. Database Layer
SQLite3 with bun:sqlite driver featuring:- FTS5 virtual tables for full-text search
- SessionStore for CRUD operations
- SessionSearch for FTS5 queries
- Location:
~/.claude-mem/claude-mem.db
4. mem-search Skill (v5.4.0+)
Skill-based search with progressive disclosure providing 10 search operations:- Search observations, sessions, prompts (full-text FTS5)
- Filter by type, concept, file
- Get recent context, timeline, timeline by query
- API help documentation
- Skill frontmatter: ~250 tokens (loaded at session start)
- Full instructions: ~2,500 tokens (loaded on-demand when invoked)
- HTTP API endpoints instead of MCP tools
5. Viewer UI
React + TypeScript web interface served by the worker on its configured port (defaulthttp://127.0.0.1:<worker-port>) featuring:
- Real-time memory stream via Server-Sent Events
- Infinite scroll pagination with automatic deduplication
- Project filtering and settings persistence
- GPU-accelerated animations
- Self-contained HTML bundle (viewer.html)

