capture · distill · recall
recall captures every Claude Code session, distills them overnight into a cross-linked knowledge vault, and feeds that context back at the start of the next one. Each session begins with everything the last one learned — not a blank slate.
— the maintainer's own vault, today. All of it distilled automatically.
01 · on session end
A Stop hook writes a raw dump to the vault. Shell + jq, no model call.
02 · nightly, 7pm
A headless Claude pass folds the day into cross-linked notes.
03 · on session start
A SessionStart hook injects the index as background context.
04 · on a pattern
Proposes an automation to an inbox. You approve — nothing auto-promotes.
The problem
You explain the same gotchas, conventions, and dead-ends day after day. The model re-derives what it already figured out last Tuesday. recall closes that gap.
Without recall
Every session starts cold.
Fresh context window, zero recall of the last one. The hard-won detail from yesterday — the signing quirk, the deploy order, the API that returns null — is gone.
With recall
Every session starts warm.
The index of what you've learned is already in context before you type a word. It survives /clear and auto-compact, and grows a little smarter each night.
How it works
recall runs as two Claude Code hooks and one nightly job. Once installed, the loop turns on its own — the only thing it ever asks of you is a yes or no on the automations it proposes.
01 — CAPTURE
hooks/capture-session.sh · Stop hook
When a session ends, a Stop hook writes a raw dump — working directory, project, git diff stat, transcript pointer — straight to the vault. Pure shell and jq: no model call, roughly zero tokens, and it never blocks your work.
02 — DISTILL
distill/run-distill.sh · launchd, 7pm
Each night a headless Claude pass reads the new sessions and folds what's durable into markdown notes — cross-linked with [[wiki-links]] and filed by project. If nothing's new, it skips entirely and costs $0.
03 — RETRIEVE
hooks/inject-knowledge.sh · SessionStart hook
At the start of each session, a SessionStart hook injects the knowledge index as background context, so it persists through /clear and auto-compact. A tiny always-on index; full notes read only on demand.
04 — SURFACE
inbox/proposals.md · human approval
When distill sees a pattern worth automating, it writes a proposal into an inbox — never a live skill. You review and approve on your terms. Your tooling stays yours, and nothing promotes itself.
knowledge / global
Craft / Yii signs response cookies by default. JavaScript can't read the value of a signed cookie — use a raw header() when the value needs to be readable client-side.
2 linked notes
The vault
Every note is plain markdown — a single fact, cross-referenced to its neighbors, filed at the narrowest scope that fits. It reads like a zettelkasten because it is one; the tedious bookkeeping is just left to the model.
The design bet
The vault can grow to hundreds of notes without slowing a session or inflating its cost. recall injects a small always-on index and reads full notes only when they're relevant — so per-session context stays flat as knowledge accumulates.
Yours, and only yours
recall is machinery, not a service. The vault is a folder of markdown on your Mac that you own outright.
Obsidian-native
Point it at an existing vault and the notes sync right alongside yours.
Read-only in sessions
Sessions consult the vault; only the nightly distill ever writes to it.
Local by default
Everything runs on your machine. The one network call is the nightly pass.
Never in the repo
The code ships open; your captured knowledge stays out of it entirely.
Install
One interactive installer wires up both hooks and the nightly job — and it never clobbers settings you already have.
$ git clone https://github.com/maxdmyers/recall.git ~/Sites/recall # or wherever $ cd ~/Sites/recall $ ./install/install.sh # interactive
What it does for you
Asks where the vault lives, when to distill, and whether to touch git.
Merges two hooks into ~/.claude/settings.json — your existing ones untouched, a backup written first.
Scaffolds the vault and loads the nightly launchd job.
Re-run any time to pick up changes. It's idempotent.
Scripted install
./install/install.sh -y --vault ~/notes/recall --time 22:30