Recall — Local Project Memory for Claude Code

Durable, fully offline memory for Claude Code: capture every session locally and resume instantly without re-explaining your project or burning tokens.

Stars
★ 764
Last updated
1mo ago
License
MIT
Primary language
Python

At a glance

How it runs
Agent plugin / skillCLI
Works with
Portable with changesClaude CodeCodex (Unsupported)
Cost
Free, no paid service needed
Setup effort
Low · running in minutes
You'll need
Claude Code (primary harness)Python 3.9–3.13 for dev toolingnumpy optional acceleratorShell / CLILocal filesystem
Typical use
Developers on a Claude Code subscription who want to stop spending tokens re-explaining project context every session
Not a fit if
  • Teams wanting LLM-written, semantically compressed summaries
  • Developers on Codex or harnesses other than Claude Code and opencode
  • Teams committing .recall/ as shared memory with untrusted collaborators
Source review
66/100 · Some gaps

What does this agent do, and when should you use it?

Recall is a fully-local plugin that solves Claude Code's cold-start problem — having to re-explain your project every session. Through SessionStart, Stop and SessionEnd hooks it incrementally appends session activity to .recall/history.md inside your project, then a local TF-IDF + TextRank summarizer condenses it into a ~1–2K token context.md for the next session. There are no LLM calls, no network requests and no API keys anywhere; the summarizer (with an optional numpy accelerator and an equivalent pure-Python path) is vendored in scripts/summarizer.py. Beyond the Claude Code plugin, an installer script provides opt-in support for opencode, and both tools can share the same .recall/ memory files. The project also ships redaction, confined writes and hardened git invocation as security measures, under an MIT license.

During a session, Stop/SessionEnd hooks run capture.py to incrementally append your prompts, Claude's replies, files touched and commands run to .recall/history.md. At session start, session_start.py surfaces context.md and asks whether to resume and keep logging. When wrapping up, /recall:save triggers make_context.py, which calls scripts/summarizer.py (TF-IDF sentence vectors → cosine-similarity graph → TextRank PageRank power iteration → top-N sentences) and wraps the summary with deterministic facts from the transcript and git — first ask, files, commands, where you left off, git diff --stat — overwriting context.md. Alternatively set auto_save_context: "on_end" to regenerate automatically. Commands: /recall:save, /recall:show, /recall:log. For opencode projects, run python3 ~/recall/scripts/install.py --opencode --project <path> to generate a capture shim, a /recall-save command and an opencode.json instructions entry.

  1. Developers on a Claude Code subscription who want to stop spending tokens re-explaining project context every session
  2. Engineers working on the same project across multiple days and sessions who need to quickly recover last progress and open threads
  3. Privacy-sensitive individuals or teams whose code, paths and occasional secrets must never leave the machine
  4. Teams mixing Claude Code and opencode on one repo who want a shared session memory in .recall/
  5. Small teams who want to commit .recall/ as shared team memory so members can pick up each other's work (trusting repo writers)

How do you install or deploy this agent?

From the marketplace (inside Claude Code):

/plugin marketplace add raiyanyahya/recall
/plugin install recall@recall

Local dev (no install step):

claude --plugin-dir /path/to/recall

opencode (once per project):

git clone https://github.com/raiyanyahya/recall ~/recall
python3 ~/recall/scripts/install.py --opencode --project /path/to/your/project

No pip install needed — the summarizer is vendored and stdlib-only (numpy optional). Run under your subscription login; if claude reports "Invalid API key", clear a stale variable with unset ANTHROPIC_API_KEY.

How do you use this agent?

  1. Start a Claude Code session normally; Recall shows context.md and asks whether to resume and whether to keep logging.
  2. Work as usual — Stop/SessionEnd hooks automatically append session activity to .recall/history.md.
  3. Before wrapping up, run /recall:save to generate/overwrite context.md (or set auto_save_context: "on_end" in recall.config.json for automatic regeneration).
  4. Open a fresh session and resume from the compact summary without re-explaining.

Other commands: /recall:show prints context.md; /recall:log tails history.md. Optionally drop a recall.config.json in your project root to override defaults (output dir, summary length, redaction, git inclusion); create .recall/.capture-paused to pause logging.

What are this agent's strengths and limitations?

Pros
  • Fully offline with zero model-token cost: summaries come from local TF-IDF + TextRank, with no external model or API calls
  • Explicit privacy guarantees: no network calls, no API keys, plus best-effort redaction of API keys, tokens, .env assignments and PEM keys before writing
  • Cheap resumption: a ~1–2K token compact context.md versus replaying a full transcript with --resume
  • Cross-harness portability: .recall/ is plain markdown, shareable between Claude Code and opencode on the same repo
Limitations
  • Summaries are extractive (TF-IDF + TextRank), not LLM-written, limiting paraphrase quality and semantic compression
  • opencode support tracks its public CLI (session list, export, plugin events API); fast upstream changes could silently degrade capture
  • On opencode, context.md loads via instructions without Claude Code's untrusted-data fencing, requiring extra caution when committing shared memory
  • Codex and other harnesses are not supported yet; new adapters must be built on the provided seam
  • Redaction is best-effort, not a guarantee — review .recall/ files before committing

How does this agent compare with similar options?

The README directly compares against Claude Code's built-in options: CLAUDE.md (and the # shortcut) is hand-written rules and instructions that require manual upkeep and don't record what happened; --continue/--resume replays a full prior transcript (token-heavy, machine-bound); context compaction works only within a session. Recall fills the gap between them: an automatic, deterministic record of each session condensed into a compact resume point.

Key facts side by side with the most closely related agents.

Agent Source review Form / cost Stars Updated Language Full support on
Recall — Local Project Memory for Claude Code This agent 66 · Some gaps Agent plugin / skillFree ★ 764 1mo ago Python Claude Code
Compartment 76 · Good CLIFree ★ 577 4d ago Python Codex · Claude Code
Screenpipe 49 · Major gaps Desktop appFreemium ★ 22k 1d ago Rust ChatGPT · Claude Code
Claudexor 76 · Good CLIFree + model costs ★ 518 today TypeScript Codex · Claude Code

How does FollowAgents rate this agent?

FollowAgents source review · FARS-2.1
Some gaps
66/ 100 5-point scale 3.3 / 5
Trust 19/29
Reliability 8/14
Adaptability 12/18
Convention 14/18
Effectiveness 9/13
Verifiability 4/8
Why each dimension lost points
Trust19 / 29 · 3.3/5

README and SECURITY.md document least-privilege design (writes confined to output_dir, O_NOFOLLOW, hardened git subprocess, scoped transcript reads), with tests corroborating redaction and incremental capture; however, the core scripts (common.py, redact.py, etc.) are not in the provided evidence, so security claims rest on documentation plus partial tests — scored 2, not 3. User confirmation exists via SessionStart resume/logging questions, .capture-paused, and uninstall.

Reliability8 / 14 · 2.9/5

Files are self-consistent (README, SECURITY, pyproject, tests agree) and there are zero runtime deps with both numpy paths covered in the CI matrix, giving 2 for self-consistency and dependency availability; failure messaging is thin — hooks deliberately fail silent, and only the save output reports which path ran — hence 1.

Adaptability12 / 18 · 3.3/5

Audience (local subscription users), scenarios (Claude Code primary, opencode opt-in), and triggers (Stop/SessionEnd/SessionStart hooks) are clearly described; boundaries are honestly stated (no fencing on opencode, silent no-op degradation); environment coverage (Python 3.9–3.13, numpy optional) is good — but all documentation-asserted, so 2.

Convention14 / 18 · 3.9/5

Information architecture (Layout) and install notes (marketplace/local/opencode) are thorough: 3. Known limitations are candid (best-effort redaction, opencode drift): 3. MIT LICENSE present: 3. Deductions: no CHANGELOG and no visible plugin version (plugin. not in evidence), so versioning is 1; naming is consistent but stability unproven (2); maintenance has CONTRIBUTING/SECURITY templates but maintainer identity is unverified (2).

Effectiveness9 / 13 · 3.5/5

Output is diffable plaintext markdown with history/context separation: 2. Marginal value versus CLAUDE.md/--continue is argued clearly but not executed-verified: 2. Zero-token cost claims align with the local algorithm: 2 — all conservative pending any run.

Verifiability4 / 8 · 2.5/5

Claims trace to named files (common.py:git_info etc.), but the referenced scripts are absent from the evidence and cannot be checked: 1. README/SECURITY/tests corroborate each other: 2. Fact/inference separation is good (explicit 'best-effort, not a guarantee'): 2.

Risks and how to mitigate them
  • This is a static review; no code was executed. Security claims (redaction, confined writes, hardened git) rest on documentation and partial tests — core scripts were not in the evidence to verify.
  • Redaction is best-effort; manually inspect .recall/ files before committing.
  • Committing .recall/ as shared team memory carries prompt-injection risk; the opencode path has no untrusted-data fencing and deserves extra caution.
  • No CHANGELOG or visible version number makes upgrade tracking difficult; publisher is unverified — audit the scripts yourself before adoption.
  • Hooks fail silently by design; capture can stop without notice, so periodically confirm history.md is being updated.
Evidence confidence: Low Reviewed Sep 10, 2026 Reviewed revision e65cb1e406fe
See the full review method →

Recent releases

Latest entries from the project's GitHub Releases. Notes are quoted from upstream as written, not rewritten or tested by FollowAgents.

  1. v0.4.0 Recall 0.4.0 — OpenCode support (opt-in)
    Release notes excerpt
    Recall now works with [opencode](https://opencode.ai) — the same fully-local memory (.recall/history.md + context.md), captured from opencode sessions instead of (or alongside) Claude Code. Requested in #10. Claude Code users: nothing changes. Claude Code remains the first-class harness. The hooks, commands, and manifest are untouched, and the opencode path activates only if you explicitly run the installer. Update as usual via the marketplace. OpenCode support — one-time, per-project, reversible …
    View on GitHub ↗
  2. v0.3.6 Recall 0.3.6
    Release notes excerpt
    Recall now works on a standard Windows install. Previously the plugin would install and the slash commands would appear, but **nothing was ever captured or surfaced** — every failure was swallowed by the defensive handling that keeps Recall from crashing a Claude Code session. Three independent Windows-specific bugs were responsible, all reported in #6 by @driano1221. 🪟 Fixed - python3 not found. The hooks and /recall:save invoked python3, which a standard Windows install doesn't provide, so capture and the session recap …
    View on GitHub ↗
  3. v0.3.5 Recall 0.3.5
    Release notes excerpt
    Notes: Documentation release: adds a privacy policy. Added - Privacy policy (PRIVACY.md), linked from the README. Documents that Recall runs fully locally — no network access, telemetry, accounts, or third-party/model calls, and all output stays under .recall/ — and that the built-in secret redaction is a best-effort safety net, not a guarantee. No code changes — behavior is identical to 0.3.4. Full Changelog: https://github.com/raiyanyahya/recall/compare/v0.3.4...v0.3.5
    View on GitHub ↗

FAQ

Does using Recall cost anything extra?
No. The summary is produced by a local TF-IDF + TextRank algorithm — no LLM calls — so capturing and updating memory spends zero model tokens, and resuming from a ~1–2K token context.md actually reduces per-session token spend.
Will my code or transcripts be sent anywhere?
No. Recall makes no network calls, uses no API key and loads no third-party model. Everything is written under .recall/ inside your project, with best-effort redaction of common secret shapes before writing.
Is it safe to clone an untrusted repo while using Recall?
Recall hardens git invocations (external diff, hooks and pager disabled), confines output_dir inside the project, and injects context.md fenced as untrusted reference data. However, if you commit .recall/ as shared team memory, a repo writer could craft it for prompt injection — it is git-ignored by default.
Does it work without numpy?
Yes. numpy is an optional accelerator; if unavailable, an identical pure-Python TextRank runs instead, with the same algorithm and results. No installation is required either way.
Can I use it with opencode or Codex?
opencode is supported via an opt-in one-time installer that generates the plugin shim, /recall-save command and opencode.. Codex and other harnesses are not yet supported, though the code exposes an adapter seam (scripts/harness_opencode.py, --harness on make_context.py) for contributions.
View on GitHub ↗ Install ↓

Compare agents like this one

The same FARS review applied across the shortlist this agent qualifies for.

Related agents