Claude Code has no memory between sessions. Every time you start a new conversation, Claude forgets your project's stack, architecture decisions, gotchas, and what you worked on yesterday.
FAQ
claude-recall is a Claude Code plugin with 1 hand-picked skill for documentation work, indexed on Flowy. Install it with the command on its page. It includes claude-recall. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
$ npx -y skills add senapati484/claude-recall --agent claude-code
Repo: senapati484/claude-recall
Claude Code has no memory between sessions. Every time you start a new conversation, Claude forgets your project's stack, architecture decisions, gotchas, and what you worked on yesterday.
You end up repeating the same context over and over.
claude-recall hooks into Claude Code and bridges it with your Obsidian vault β completely automatically.
| Hook | What happens | |
|---|---|---|
| π΅ | Before your first message | Loads your project context from Obsidian |
| π | When you exit | Saves a structured session note back to the vault |
No manual invocation. No config beyond your vault path. No files created in your project directory.
curl -fsSL https://raw.githubusercontent.com/senapati484/claude-recall/main/install.sh | bash
UserPromptSubmit hookcontext.md from your vaultClaude starts every session already knowing your project. Context is loaded once per terminal session β not on every prompt.
Stop hookcontext.md auto-sections with session learningsYour work is automatically documented in Obsidian. Uses claude CLI under the hood β no API keys required.
Project slug is derived from your working directory:
| Path | Slug |
|---|---|
~/projects/setu | setu |
~/client/acme/dashboard | acme-dashboard |
~/Desktop/Dev/Innovation/setu | innovation-setu |
your-vault/
βββ claude-recall/
βββ _index.md β auto-updated project log
βββ projects/
βββ setu/
βββ context.md β βοΈ you edit this in Obsidian
βββ sessions/
βββ 2026-04-10_14-30.md β auto-written
βββ 2026-04-11_09-15.md β auto-written
context.md β auto-generated project memorycontext.md is auto-generated from project scan + optionally AI-enhanced via claude CLI on first load and updated after each session.
You can edit it in Obsidian β your content outside <!-- auto:* --> markers is never overwritten:
## What this is
<!-- auto:what_this_is:start -->
Project: setu β blood donation platform
<!-- auto:what_this_is:end -->
## Stack
<!-- auto:stack:start -->
Flutter Β· Express.js Β· MongoDB Atlas Β· Railway
<!-- auto:stack:end -->
## Key files
<!-- auto:key_files:start -->
- `lib/auth/jwt_handler.dart`
- `server/routes/auth.ts`
- `lib/screens/donor_screen.dart`
<!-- auto:key_files:end -->
## Architecture decisions
<!-- auto:architecture:start -->
- JWT auth with refresh tokens stored in secure storage
- Image uploads compressed client-side before S3
<!-- auto:architecture:end -->
## Gotchas
<!-- auto:gotchas:start -->
- Railway free tier has 500MB memory limit
- MongoDB Atlas M0 caps at 500 connections
<!-- auto:gotchas:end -->
Each session note includes YAML frontmatter, making them searchable with Obsidian Dataview:
---
date: 2026-04-11
project: setu
turns: 8
tags: [claude-recall, session]
---
# Session 2026-04-11 14:30
## Started with
> Add JWT auth to the Express routes
## Stats
8 user turns Β· 12 total messages Β· 5 tool calls
## Summary
Started with: Add JWT auth... Β· 3 file(s) modified Β· Tools used: Readx2, Editx2, Bashx1
## Files touched
- server/auth.js
- routes/api.js
- lib/screens/home_screen.dart
## Tools used
- `Read`: 2x
- `Edit`: 2x
- `Bash`: 1x
## Git changes
server/auth.js | 25 +++++++++ routes/api.js | 10 ++++ 2 files changed, 35 insertions(+)
## Next steps
- [ ] _(edit in Obsidian or ask Claude to summarise)_
Requirements: Python 3.8+ Β· Claude Code Β· Obsidian
curl -fsSL https://raw.githubusercontent.com/senapati484/claude-recall/main/install.sh | bash
What the installer does:
~/.claude/claude-recall.json~/.claude/skills/claude-recall/anthropic and fastmcp via pip~/.claude/settings.jsonβ οΈ Restart Claude Code after install.
git clone https://github.com/senapati484/claude-recall ~/.claude/skills/claude-recall
bash ~/.claude/skills/claude-recall/install.sh
Edit ~/.claude/claude-recall.json to override defaults:
{
"vault_path": "/path/to/your/vault",
"vault_folder": "claude-recall",
"max_context_tokens": 400,
"include_recent_sessions": 2,
"save_sessions": true,
"load_on_every_prompt": true,
"use_claude_api": true
}
| Key | Default | What it does |
|---|---|---|
vault_path | (required) | Absolute path to your Obsidian vault |
vault_folder | claude-recall | Folder inside the vault for all notes |
max_context_tokens | 400 | Token budget for injected context (~1.6K chars) |
include_recent_sessions | 2 | How many past session notes to load |
save_sessions | true | Write session notes on exit |
load_on_every_prompt | true | Reload relevant context on every prompt |
use_claude_api | true | Use Claude API for summarization |
claude-recall supports multiple AI backends for session summarization and context generation. It checks them in a specific fallback order and defaults to a zero-config local regex fallback if no backend is configured or available.
Claude CLI (Primary)
claude executable is found in your system's PATH.claude -p.Anthropic API (Fallback 1)
claude CLI is not found or fails to run, and the ANTHROPIC_API_KEY environment variable is defined.claude-haiku-4-5-20251001 (or haiku-4-5) model.anthropic Python package (pip install anthropic).NVIDIA NIM / OpenAI-Compatible API (Fallback 2)
claude CLI and ANTHROPIC_API_KEY are unavailable, and the OPENAI_API_KEY and NVIDIA_NIM_BASE_URL environment variables are defined.claude-3-5-haiku-20241022 model name (mapped appropriately by the target provider).openai Python package (pip install openai).Regex-based Fallback (Fallback 3)
An example configuration file is provided in the project root as .env.example. You can copy this file to .env in your project folder or export these variables directly in your terminal profile:
# Copy example env file
cp .env.example .env
To use NVIDIA NIM (or another OpenAI-compatible inference endpoint) as your fallback provider, configure your .env as follows:
# Use build.nvidia.com or your local/private NIM endpoint
NVIDIA_NIM_BASE_URL="https://integrate.api.nvidia.com/v1"
OPENAI_API_KEY="nvapi-your-nvidia-api-key-here"
curl -fsSL https://raw.githubusercontent.com/senapati484/claude-recall/main/install.sh | bash
Re-running the installer detects an existing install and runs git pull.
# 1. Remove hooks from settings
# Edit ~/.claude/settings.json β delete the two "claude-recall" entries
# 2. Remove skill files
rm -rf ~/.claude/skills/claude-recall
# 3. Remove config
rm ~/.claude/claude-recall.json
Your Obsidian notes under
<vault>/claude-recall/are never touched by uninstall.
ββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββ
β Claude Code β β claude-recall β β Obsidian Vault β
β β β β β β
β Prompt ββββββββΊβ load_context.py βββββββββ€ mindmap.json β
β (every msg) β β + get_relevant() β β context.md β
β β β β β sessions/*.md β
β Exit ββββββββΊβ save_context.py ββββββββΊβ β
β (stop hook) β β + update_mindmap β ββββββββββββββββββ
β β β β
β Tool use ββββββββΊβ post_tool_use.py β ββββββββββββββββββ
β (edit) β β + mark_stale() β β MCP Server β
ββββββββββββββββ ββββββββββ¬ββββββββββ β recall_get() β
β β recall_update()β
ββββββββββββββ΄βββββββββββββ β recall_session_β
β claude CLI (primary) β β recall_mindmap β
β or API key (fallback) β ββββββββββββββββββ
βββββββββββββββββββββββββββ
~/.claude/claude-recall.json
~/.claude/claude-recall-slug.env
claude-recall stores project context as a JSON graph at <vault>/claude-recall/projects/<slug>/mindmap.json:
{
"_meta": {"version": 2, "updated": "2026-04-18"},
"nodes": {
"project_overview": {
"content": "Blood donation platform with donor/recipient matching",
"keywords": ["flutter", "express", "mongodb", "setu"],
"parent": null,
"files": [],
"created": "2026-04-10",
"last_updated": "2026-04-18",
"stale": false
},
"stack": {
"content": "Tech stack: Flutter, Express.js, MongoDB Atlas, Railway",
"keywords": ["flutter", "express", "mongodb", "railway"],
"parent": "project_overview",
"files": ["package.json", "pubspec.yaml"],
"stale": false
},
"auth_system": {
"content": "JWT auth with refresh tokens stored in secure storage",
"keywords": ["jwt", "auth", "security"],
"parent": "project_overview",
"files": ["lib/auth/jwt_handler.dart"],
"stale": true
}
},
"file_node_map": {
"lib/auth/jwt_handler.dart": ["auth_system"]
},
"sessions": [
{"date": "2026-04-18", "summary": "Added JWT auth...", "nodes_updated": ["auth_system"]}
]
}
Why JSON? Enables fast keyword lookups, parent/child relationships, and fileβnode mapping. The context.md in your vault is auto-generated from this JSON for Obsidian viewing.
claude-recall registers an MCP server that exposes 4 tools Claude can call during a session:
| Tool | When used | What it returns |
|---|---|---|
recall_get(query) | You ask about past decisions/architecture | Relevant context nodes |
recall_update_node(node_id, content, keywords) | You explicitly update context | Confirmation |
recall_session_history(count) | You ask "what did I work on before?" | Last N session summaries |
recall_mindmap() | You ask for full project overview | Full mindmap tree |
These tools let Claude fetch deeper context mid-session β not just what was injected at prompt time.
| File | Purpose |
|---|---|
install.sh | One-command GitHub installer |
SKILL.md | Claude skill metadata and instructions |
scripts/load_context.py | UserPromptSubmit hook β injects relevant context nodes |
scripts/save_context.py | Stop hook β writes session note, updates mindmap |
scripts/summarize.py | LLM summarizer using claude CLI or fallback API |
scripts/mindmap.py | Mindmap storage + keyword search + node management |
scripts/mcp_server.py | FastMCP server exposing recall tools to Claude |
scripts/post_tool_use.py | PostToolUse hook β marks nodes stale on file edits |
scripts/recall_update.py | /recall command for manual context updates |
scripts/utils.py | Shared helpers (config, slugs, truncation, stack detection) |
references/hook-api.md | Claude Code hook I/O specification |
references/context-structure.md | Vault note formats and examples |
Test the load hook manually:
echo '{"cwd":"'$(pwd)'","session_id":"test"}' | python3 ~/.claude/skills/claude-recall/scripts/load_context.py
If output is empty, check:
context.md exist in your vault for this project?vault_path correct in ~/.claude/claude-recall.json?Check that save_sessions is true in ~/.claude/claude-recall.json and that Claude Code is passing a transcript_path to the Stop hook.
The slug strips noise segments (projects, repos, code, src, workspace, dev, work, home) and keeps the last 2 meaningful parts. Verify with:
python3 -c "
from pathlib import Path
import sys; sys.path.insert(0, '\$HOME/.claude/skills/claude-recall/scripts')
from utils import cwd_to_slug
print(cwd_to_slug(Path('\$(pwd)')))
"
.env.example
.gitignore
commands/
claude-recall/
claude-recall.md
reset.md
status.md
update.md
data/
claude.svg
obsidian.png
plus.svg
install.sh
LICENSE
README.md
references/
context-structure.md
hook-api.md
requirements.txt
scripts/
context_builder.py
load_context.py
mcp_server.py
mindmap.py
post_tool_use.py
recall_update.py
save_context.py
scan_project.py
session_manager.py
session_start.py
statusline_wrapper.py
summarize.py
utils.py
SKILL.md
tests/
test_utils.py
uninstall.shΒ© 2026 Flowy Β· Free and open source
Built for Claude Code Β· Not affiliated with Anthropic