해커뉴스에 공유된 'Recall'은 Claude Code 사용자를 위한 완전한 로컬 프로젝트 메모리 관리 도구입니다. 매 세션마다 프로젝트를 다시 설명해야 하는 콜드 스타트(Cold-start) 문제를 해결하면서도, 외부 LLM을 호출하지 않아 구독 토큰을 소모하지 않고 비용을 크게 절약할 수 있습니다. 작업 기록을 자동으로 추적해 압축된 요약본으로 저장하므로 개발자는 이전 세션의 맥락을 빠르게 파악하고 업무를 이어갈 수 있습니다.
번역된 본문
🔁 Recall — Claude Code를 위한 완전한 로컬 프로젝트 메모리
Claude Code는 매 세션을 콜드 스타트(Cold-start, 이전 맥락 없이 시작)로 시작합니다. Recall은 여러분의 세션 로그를 로컬에 기록하고, 이를 바로 이어서 작업할 수 있는 요약본으로 압축해 줍니다. 이 모든 과정이 오직 여러분의 컴퓨터 안에서 이루어집니다. API 키도, 외부 모델도 필요 없으며 데이터는 어디에도 전송되지 않습니다.
이 도구는 로컬에서 구독제 Claude Code를 실행하는 사용자를 위해 제작되었습니다. 관여하는 AI는 Claude Code 자체뿐이며, 요약 작업은 전통적인 방식의 Python 요약기가 담당합니다.
왜 Recall을 써야 할까요?
구독 비용 무료: 콜드 스타트 문제를 해결해 줍니다. 이제 매 세션마다 프로젝트를 다시 설명할 필요가 없습니다. 토큰을 소모해서 요금이 청구되는 요약기를 쓰지 않아도 됩니다. 요약은 로컬 알고리즘으로 처리되며 LLM을 호출하지 않기 때문에, 기존 구독료 외에 추가 비용이 발생하지 않습니다.
사용 크레딧(토큰) 절약: 두 가지 방면으로 절약됩니다. (1) 요약본이 로컬에서 생성되므로 메모리를 캡처하고 업데이트하는 과정에서 모델의 토큰을 단 1개도 소모하지 않습니다. (2) 매 세션 처음부터 프로젝트를 다시 설명하는 대신, 압축된 context.md(약 1~2천 토큰)에서 바로 작업을 재개할 수 있습니다. 이는 세션당 토큰 소모를 획기적으로 줄여 구독 사용 한도를 늘려주며(API 사용 시 청구 비용을 낮춰줍니다).
기기 밖으로 나가는 데이터 없음: 귀하의 기록(코드, 파일 경로, 때로는 보안 정보)은 그 어떤 API로도 전송되지 않습니다. 대부분의 '메모리' 도구들은 문맥을 모델 엔드포인트로 전송하지만, Recall은 이들이 보장할 수 없는 강력한 개인정보 보호를 보장합니다.
마찰 없는 사용 경험:pip install도 필요 없고, 실행할 로컬 모델도, 설정할 키도 없으며 오프라인으로 작동합니다. 플러그인이 로드되는 순간 바로 작동을 시작합니다.
작동 방식
프로젝트 하위의 .recall/ 폴더에 기록되는 두 개의 파일이 있습니다:
history.md — 로그 파일입니다. 덮어쓰기가 아닌 추가(Append-only) 방식입니다. 모든 세션이 발생할 때마다 여기에 실시간으로 캡처됩니다 (사용자의 프롬프트, Claude의 응답, 수정된 파일 및 실행한 명령어 등).
context.md — 요약본입니다. 로컬 요약기에 의해 덮어쓰기 되는 압축된 '현재 우리가 어디까지 했는지'에 대한 내용입니다. 다음 세션에 로드할 내용으로, 목표, 요약, 다음 단계/진행 중인 스레드, 수정된 파일, 마지막으로 멈춘 지점 등을 포함합니다.
"Claude Code는 이미 메모리 기능이 있지 않나요?"
있습니다. 하지만 Recall은 그것을 대체하는 것이 아니라 상호 보완합니다. 기본 제공 옵션들은 각기 다른 문제를 해결합니다.
CLAUDE.md (및 # 단축키): 사용자가 직접 작성하는 수동 메모리입니다. Claude가 따라야 할 지침과 규칙을 적어두는 곳입니다. "내가 너희가 일하는 방식"을 지정하는 데 훌륭하지만, 수동으로 관리해야 하며 세션에서 실제로 일어난 일을 기록하지는 않습니다.
--continue / --resume: 이전 대화를 재생합니다. 완벽한 내용을 담고 있지만, 전체 대화 내역을 다시 로드(토큰 소모량이 많음)하며 컴퓨터의 로컬 세션 기록에 묶여 있습니다. 쉽게 읽거나 공유할 수 있는 요약본이 아닙니다.
Context compaction (문맥 압축): 단일 세션 내에서의 대화를 압축합니다. 며칠 뒤에 다시 열어볼 수 있는 영구적인 기록이 아닙니다.
Recall은 이들 사이의 빈틈을 채워줍니다: 각 세션에서 수행한 작업의 자동적이고 결정론적인 기록을 만들고, 이를 쉽게 이어서 작업할 수 있는 간결한 형태로 압축합니다.
항목
CLAUDE.md / #
--continue / --resume
Recall
정체
직접 작성한 메모 및 규칙
이전 대화를 다시 로드
자동 캡처된 세션 로그 + 로컬 요약본
유지 관리
수동
없음 (세션을 직접 선택)
없음 — 작업하는 대로 자동 기록
담고 있는 내용
따라야 할 지침
이전 대화 내역 전체
목표, 파일, 명령어, 마지막 위치, 다음 단계
재개 비용
적음
큼 (전체 대화 내역 재생)
약 1~2천 토큰 (압축된 요약본)
형식
편집 가능한 마크다운
로컬 세션 상태
.recall/ 내의 일반 텍스트 — 비교(diff) 및 공유 용이
Claude 처리 방식
지침으로 인식
대화 내용으로 인식
신뢰할 수 없는 참조용 데이터로 취급
요약하자면: CLAUDE.md는 "내가 너에게 어떻게 일하기를 원하는가"를 위한 것이며, Recall은 오프라인에서 모델 토큰 소비 없이 생성되는 "우리가 지난번에 무엇을 했고 어디서 멈췄는가"를 위한 것입니다.
어떻게 작동하나요?
세션 도중:Stop / SessionEnd 훅(hook)이 새로운 활동을 .recall/history.md에 추가합니다. 기록은 증분 방식(새로운 턴만)이며 완전히 로컬에서 이루어집니다.
세션 시작 시:SessionStart 훅이 context.md를 표시하고 Claude에게 두 가지를 물어봅니다: 저장된 문맥에서 작업을 재개할 것인가? 그리고 이번 세션도 계속 기록할 것인가?
마무리하기 전: 사용자가 /recall:save를 실행합니다. 그러면 로컬 요약기가 history.md를 읽고 context.md를 덮어씁니다.
…또는 자동으로:auto_save_context: "on_end" 설정을 통해 자동으로 저장되게 할 수도 있습니다.
🔁 Recall — fully-local project memory for Claude Code Claude Code starts every session cold. Recall keeps a local log of your sessions and condenses it into a resume-ready summary — entirely on your machine . No API key, no external model, nothing sent anywhere. It's built for people running Claude Code locally on a subscription: the only AI in the loop is Claude Code itself; the summarization is done by a classical Python summarizer. Why Recall Free on your subscription. It solves the cold-start problem — no more re-explaining the project each session — without a metered summarizer running up a bill. The summary is a local algorithm, not an LLM call, so persistent memory costs you nothing beyond the subscription you already pay for. Saves your usage credits. Two ways: (1) the summary is built locally, so capturing and updating your memory spends zero model tokens; and (2) resuming from a compact context.md (~1–2K tokens) instead of re-explaining the project from scratch each session means far fewer tokens spent per session — stretching your subscription's usage limits (or, on the API, lowering billed credits). Nothing leaves your machine. Your transcripts (code, paths, sometimes secrets) are never sent to any API. Most "memory" tools pipe your context to a model endpoint; Recall makes a privacy guarantee they can't. Zero-friction. No pip install , no local model to run, no key to configure, works offline. It starts working the moment the plugin loads. Two files, written into your project under .recall/ : history.md — the log. Append-only. Every session is captured here as it happens (your prompts, Claude's replies, the files touched and commands run). context.md — the summary. Overwritten by the local summarizer — the condensed "where are we right now" you load into the next session: goal, summary, next steps / open threads , files touched, and where you left off. "Doesn't Claude Code already have memory?" It does — and Recall is complementary, not a replacement. The built-in options solve different problems: CLAUDE.md (and the # shortcut) is hand-written memory: rules and notes you curate, loaded as instructions Claude follows . Great for "how I want you to work," but it's manual upkeep and it doesn't record what actually happened in a session. --continue / --resume replays a prior conversation — full fidelity, but it reloads the whole transcript (token-heavy) and is tied to your local session history on one machine, not a portable, readable digest. Context compaction condenses a conversation within a session; it isn't a durable record you reopen days later. Recall fills the gap between these: an automatic, deterministic record of what each session did , condensed into a compact resume point. CLAUDE.md / # --continue / --resume Recall What it is Hand-written notes & rules Reloads a prior conversation Auto-captured session log + local summary Upkeep Manual None (you pick the session) None — written as you work Holds Instructions to follow The full prior transcript Goal, files, commands, where you left off, next steps Cost to resume Small Large (replays full transcript) ~1–2K tokens (compact digest) Form Markdown you edit Local session state Plaintext in .recall/ — diffable & shareable How Claude treats it As instructions As the conversation Fenced as untrusted reference data In short: CLAUDE.md is how I want you to work ; Recall is here's what we did last time and where we stopped — produced offline, with no model tokens spent. How it works Moment What happens During the session The Stop / SessionEnd hooks append new activity to .recall/history.md . Capture is incremental (only new turns) and fully local. At session start The SessionStart hook surfaces context.md and has Claude ask you two things: resume from the saved context? and keep logging this session? Before you wrap up You run /recall:save . The local summarizer reads history.md and (over)writes context.md . …or automatically Set auto_save_context: "on_end" and context.md regenerates every time a session ends — no /recall:save needed. There is no LLM call anywhere — the summary is produced by TF-IDF + TextRank (extractive summarization) running locally. The summarizer scripts/summarizer.py ranks the most central sentences of your session: TF-IDF sentence vectors a cosine-similarity graph between sentences TextRank — PageRank power iteration over that graph — to score sentences the top N are kept in original order context.md wraps that summary with deterministic facts pulled straight from the transcript and git: the goal (your first ask), files touched, commands run, where you left off, and git diff --stat . No installs required. The whole TF-IDF + TextRank implementation is vendored in summarizer.py . If numpy happens to be importable it's used to vectorize the math (faster on big sessions); if not, an identical pure-Python TextRank runs instead. Same algorithm, same result — numpy is an optional accelerator, never a requirement. The save output tells you which path ran. Commands /recall:save — run the local summarizer → (over)write context.md . /recall:show — print context.md . /recall:log — tail history.md . Configuration — recall.config.json Drop this in your project root to override defaults: Key Default Purpose output_dir ".recall" Where history.md / context.md live. capture_history true Append session activity to history.md . auto_save_context "off" Regenerate context.md when a session ends: "off" or "on_end" . summary_sentences 8 How many sentences the summary keeps. redact true Strip obvious secrets before writing the md files. include_git true Add git diff --stat + recent commits to context.md . max_input_chars 200000 Cap on text fed to the summarizer (oldest dropped). Pause logging for a project without editing config: create .recall/.capture-paused . Delete it to resume. Privacy & security Recall makes no network calls, uses no API key, and loads no third-party model. The summarizer is local Python; the hooks are stdlib-only (numpy is an optional accelerator). It reads your session transcript and writes only under output_dir . Concretely: No credentials, ever. The plugin has zero references to API keys, auth, ANTHROPIC_* , or HTTP. If claude itself shows "Invalid API key" , that's the CLI's own auth — usually a stale ANTHROPIC_API_KEY env var shadowing your subscription login. unset ANTHROPIC_API_KEY (or run env -u ANTHROPIC_API_KEY claude … ). It has nothing to do with Recall. Redaction. A best-effort pass strips common secret shapes (API keys, tokens, .env assignments, PEM keys) before writing, since context.md / history.md may be committed. Best-effort, not a guarantee — review before committing. Hardened git. git diff / log are run with core.fsmonitor , diff.external , hooks, and the pager disabled, so an untrusted cloned repo can't use its own git config to execute code when Recall reads ground-truth. Set include_git: false to skip git entirely. Confined writes. output_dir is forced to stay inside the project; a project-shipped config can't redirect writes to an absolute path or ../.. . Scoped transcript. Recall only reads the transcript for the current project (matched by cwd); it never falls back to another project's sessions. Trust boundary for shared memory. context.md is injected into the model at session start. If you commit .recall/ as shared team memory , treat it like any other shared input: a teammate (or a bad actor with repo write access) could craft a context.md to attempt prompt-injection. SessionStart fences the content and labels it untrusted data, and Claude asks before relying on it — but if you don't fully trust who can write the repo, keep .recall/ git-ignored (the default). Committing .recall/ Both are fine. Commit it for shared team memory, or git-ignore it for personal memory ( .gitignore ships ignoring it by default — flip the comment to commit). Install From the marketplace (this repo is its own marketplace): /plugin marketplace add raiyanyahya/rec