diff --git a/docs/assets/code-recall-activity.svg b/docs/assets/code-recall-activity.svg
index a84e584..dd22b4e 100644
--- a/docs/assets/code-recall-activity.svg
+++ b/docs/assets/code-recall-activity.svg
@@ -19,220 +19,220 @@
font-weight: 700;
}
- .terminal-1617617326-matrix {
+ .terminal-974709168-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1617617326-title {
+ .terminal-974709168-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1617617326-r1 { fill: #c5c8c6 }
-.terminal-1617617326-r2 { fill: #a0a0a0;font-weight: bold }
-.terminal-1617617326-r3 { fill: #a0a0a0 }
-.terminal-1617617326-r4 { fill: #121212 }
-.terminal-1617617326-r5 { fill: #656565 }
-.terminal-1617617326-r6 { fill: #e0e0e0 }
-.terminal-1617617326-r7 { fill: #c9c9c9 }
-.terminal-1617617326-r8 { fill: #494949 }
-.terminal-1617617326-r9 { fill: #6f6f6f }
-.terminal-1617617326-r10 { fill: #e0e0e0;font-weight: bold }
-.terminal-1617617326-r11 { fill: #b9b9b9 }
-.terminal-1617617326-r12 { fill: #acacac }
-.terminal-1617617326-r13 { fill: #c3c3c3 }
-.terminal-1617617326-r14 { fill: #3b3b3b }
-.terminal-1617617326-r15 { fill: #9e9e9e }
-.terminal-1617617326-r16 { fill: #a4a4a4 }
-.terminal-1617617326-r17 { fill: #b0b0b0;font-weight: bold }
-.terminal-1617617326-r18 { fill: #515151 }
+ .terminal-974709168-r1 { fill: #c5c8c6 }
+.terminal-974709168-r2 { fill: #a0a0a0;font-weight: bold }
+.terminal-974709168-r3 { fill: #a0a0a0 }
+.terminal-974709168-r4 { fill: #121212 }
+.terminal-974709168-r5 { fill: #656565 }
+.terminal-974709168-r6 { fill: #e0e0e0 }
+.terminal-974709168-r7 { fill: #c9c9c9 }
+.terminal-974709168-r8 { fill: #494949 }
+.terminal-974709168-r9 { fill: #6f6f6f }
+.terminal-974709168-r10 { fill: #e0e0e0;font-weight: bold }
+.terminal-974709168-r11 { fill: #b9b9b9 }
+.terminal-974709168-r12 { fill: #acacac }
+.terminal-974709168-r13 { fill: #c3c3c3 }
+.terminal-974709168-r14 { fill: #3b3b3b }
+.terminal-974709168-r15 { fill: #9e9e9e }
+.terminal-974709168-r16 { fill: #a4a4a4 }
+.terminal-974709168-r17 { fill: #b0b0b0;font-weight: bold }
+.terminal-974709168-r18 { fill: #515151 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- code-recall v0.2.4
+ code-recall v0.2.5
-
+
-
- code-recall v0.2.4 8 sessions indexed | Claude 4, Codex 4 | latest 2026-05-18
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊stripe webhook signature▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-Scope: All providers Mode: hybrid Visible:Claude 1Codex 1p provider f filters ? help Ctrl+K commands
-
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-2 of 2 results for "stripe webhook signature" in all providers▎
-▎Fix Stripe webhook signature verification
- 1ClaudeFix Stripe webhook signature verification▎Session: Claude Code · Project:
-strong 100%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎/Users/demo/Projects/payments-api · Activity: 2026-05-18
-2026-05-18 · 23 msgs · 535.2KB · claude-sonnet-4▎1 Overview 2 Why 3 Activity 4 Related 5 Ai
-why: matched text: Fix **Stripe** **webhook** **signature** verification 3 files ·▎
-2 cmds▎Files touched
-▎- src/webhooks/stripe.ts
- 2CodexDebug checkout webhook retry handling▎- src/routes/webhooks.ts
-weak 0%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎- tests/webhooks/stripe-signature.test.ts
-2026-05-18 · 23 msgs · 523.4KB · gpt-5.1-codex▎
-why: matched text: Debug checkout **webhook** retry handling 3 files · 2 cmds▎Commands run
-▎- pnpm test tests/webhooks/stripe-signature.test.ts
-▎- stripe listen --forward-to localhost:3000/api/webhooks/stripe
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
- esc Close/Quit ^o Settings ▏^k palette
+
+ code-recall v0.2.5 8 sessions indexed | Claude 4, Codex 4 | latest 2026-05-18
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊stripe webhook signature▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+Scope: All providers Mode: hybrid Visible:Claude 1Codex 1p provider f filters ? help Ctrl+K commands
+
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+2 of 2 results for "stripe webhook signature" in all providers▎
+▎Fix Stripe webhook signature verification
+ 1ClaudeFix Stripe webhook signature verification▎Session: Claude Code · Project:
+strong 100%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎/Users/demo/Projects/payments-api · Activity: 2026-05-18
+2026-05-18 · 23 msgs · 535.2KB · claude-sonnet-4▎1 Overview 2 Why 3 Activity 4 Related 5 Ai
+why: matched text: Fix **Stripe** **webhook** **signature** verification 3 files ·▎
+2 cmds▎Files touched
+▎- src/webhooks/stripe.ts
+ 2CodexDebug checkout webhook retry handling▎- src/routes/webhooks.ts
+weak 0%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎- tests/webhooks/stripe-signature.test.ts
+2026-05-18 · 23 msgs · 523.4KB · gpt-5.1-codex▎
+why: matched text: Debug checkout **webhook** retry handling 3 files · 2 cmds▎Commands run
+▎- pnpm test tests/webhooks/stripe-signature.test.ts
+▎- stripe listen --forward-to localhost:3000/api/webhooks/stripe
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+ esc Close/Quit ^o Settings ▏^k palette
diff --git a/docs/assets/code-recall-ai-chat.svg b/docs/assets/code-recall-ai-chat.svg
index ec83adc..024cc8b 100644
--- a/docs/assets/code-recall-ai-chat.svg
+++ b/docs/assets/code-recall-ai-chat.svg
@@ -19,222 +19,222 @@
font-weight: 700;
}
- .terminal-2453408022-matrix {
+ .terminal-2194147608-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2453408022-title {
+ .terminal-2194147608-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2453408022-r1 { fill: #c5c8c6 }
-.terminal-2453408022-r2 { fill: #a0a0a0;font-weight: bold }
-.terminal-2453408022-r3 { fill: #a0a0a0 }
-.terminal-2453408022-r4 { fill: #121212 }
-.terminal-2453408022-r5 { fill: #191919 }
-.terminal-2453408022-r6 { fill: #e0e0e0 }
-.terminal-2453408022-r7 { fill: #c9c9c9 }
-.terminal-2453408022-r8 { fill: #494949 }
-.terminal-2453408022-r9 { fill: #6f6f6f }
-.terminal-2453408022-r10 { fill: #656565 }
-.terminal-2453408022-r11 { fill: #e0e0e0;font-weight: bold }
-.terminal-2453408022-r12 { fill: #b9b9b9 }
-.terminal-2453408022-r13 { fill: #acacac }
-.terminal-2453408022-r14 { fill: #c3c3c3 }
-.terminal-2453408022-r15 { fill: #999999 }
-.terminal-2453408022-r16 { fill: #3b3b3b }
-.terminal-2453408022-r17 { fill: #9e9e9e }
-.terminal-2453408022-r18 { fill: #797979 }
-.terminal-2453408022-r19 { fill: #b0b0b0;font-weight: bold }
-.terminal-2453408022-r20 { fill: #515151 }
+ .terminal-2194147608-r1 { fill: #c5c8c6 }
+.terminal-2194147608-r2 { fill: #a0a0a0;font-weight: bold }
+.terminal-2194147608-r3 { fill: #a0a0a0 }
+.terminal-2194147608-r4 { fill: #121212 }
+.terminal-2194147608-r5 { fill: #191919 }
+.terminal-2194147608-r6 { fill: #e0e0e0 }
+.terminal-2194147608-r7 { fill: #c9c9c9 }
+.terminal-2194147608-r8 { fill: #494949 }
+.terminal-2194147608-r9 { fill: #6f6f6f }
+.terminal-2194147608-r10 { fill: #656565 }
+.terminal-2194147608-r11 { fill: #e0e0e0;font-weight: bold }
+.terminal-2194147608-r12 { fill: #b9b9b9 }
+.terminal-2194147608-r13 { fill: #acacac }
+.terminal-2194147608-r14 { fill: #c3c3c3 }
+.terminal-2194147608-r15 { fill: #999999 }
+.terminal-2194147608-r16 { fill: #3b3b3b }
+.terminal-2194147608-r17 { fill: #9e9e9e }
+.terminal-2194147608-r18 { fill: #797979 }
+.terminal-2194147608-r19 { fill: #b0b0b0;font-weight: bold }
+.terminal-2194147608-r20 { fill: #515151 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- code-recall v0.2.4
+ code-recall v0.2.5
-
+
-
- code-recall v0.2.4 8 sessions indexed | Claude 4, Codex 4 | latest 2026-05-18
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊stripe webhook signature▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-Scope: All providers Mode: hybrid Visible:Claude 1Codex 1p provider f filters ? help Ctrl+K commands
-
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-2 of 2 results for "stripe webhook signature" in all providers▎
-▎Fix Stripe webhook signature verification
- 1ClaudeFix Stripe webhook signature verification▎Session: Claude Code · Project:
-strong 100%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎/Users/demo/Projects/payments-api · Activity: 2026-05-18
-2026-05-18 · 23 msgs · 535.2KB · claude-sonnet-4▎1 Overview 2 Why 3 Activity 4 Related 5 Ai
-why: matched text: Fix **Stripe** **webhook** **signature** verification 3 files ·▎
-2 cmds▎Transcript chat
-▎Assistant provider: Claude Code
- 2CodexDebug checkout webhook retry handling▎
-weak 0%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎You: What changed and what should I verify before resuming?
-2026-05-18 · 23 msgs · 523.4KB · gpt-5.1-codex▎
-why: matched text: Debug checkout **webhook** retry handling 3 files · 2 cmds▎Claude Code: Session demo-claude-001 switched Stripe
-▎verification to the raw request body, added timestamp
-▎tolerance, and covered valid, tampered, and replayed
-▎signatures. Resume with `claude --resume
-▎claude-demo-claude-001`, then run `pnpm test
-▎tests/webhooks/stripe-signature.test.ts` and the Stripe CLI
-▎forwarding command.
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▎▊Ask this transcript... e.g. what did we conclude about cost▎
-▎▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-▎
- esc Close/Quit ^o Settings ▏^k palette
+
+ code-recall v0.2.5 8 sessions indexed | Claude 4, Codex 4 | latest 2026-05-18
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊stripe webhook signature▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+Scope: All providers Mode: hybrid Visible:Claude 1Codex 1p provider f filters ? help Ctrl+K commands
+
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+2 of 2 results for "stripe webhook signature" in all providers▎
+▎Fix Stripe webhook signature verification
+ 1ClaudeFix Stripe webhook signature verification▎Session: Claude Code · Project:
+strong 100%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎/Users/demo/Projects/payments-api · Activity: 2026-05-18
+2026-05-18 · 23 msgs · 535.2KB · claude-sonnet-4▎1 Overview 2 Why 3 Activity 4 Related 5 Ai
+why: matched text: Fix **Stripe** **webhook** **signature** verification 3 files ·▎
+2 cmds▎Transcript chat
+▎Assistant provider: Claude Code
+ 2CodexDebug checkout webhook retry handling▎
+weak 0%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎You: What changed and what should I verify before resuming?
+2026-05-18 · 23 msgs · 523.4KB · gpt-5.1-codex▎
+why: matched text: Debug checkout **webhook** retry handling 3 files · 2 cmds▎Claude Code: Session demo-claude-001 switched Stripe
+▎verification to the raw request body, added timestamp
+▎tolerance, and covered valid, tampered, and replayed
+▎signatures. Resume with `claude --resume
+▎claude-demo-claude-001`, then run `pnpm test
+▎tests/webhooks/stripe-signature.test.ts` and the Stripe CLI
+▎forwarding command.
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▎▊Ask this transcript... e.g. what did we conclude about cost▎
+▎▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+▎
+ esc Close/Quit ^o Settings ▏^k palette
diff --git a/docs/assets/code-recall-demo.gif b/docs/assets/code-recall-demo.gif
index b2cb9cb..75cc257 100644
Binary files a/docs/assets/code-recall-demo.gif and b/docs/assets/code-recall-demo.gif differ
diff --git a/docs/assets/code-recall-related.svg b/docs/assets/code-recall-related.svg
index e9fab79..c3f65f4 100644
--- a/docs/assets/code-recall-related.svg
+++ b/docs/assets/code-recall-related.svg
@@ -19,220 +19,220 @@
font-weight: 700;
}
- .terminal-3877256817-matrix {
+ .terminal-3102359155-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3877256817-title {
+ .terminal-3102359155-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3877256817-r1 { fill: #c5c8c6 }
-.terminal-3877256817-r2 { fill: #a0a0a0;font-weight: bold }
-.terminal-3877256817-r3 { fill: #a0a0a0 }
-.terminal-3877256817-r4 { fill: #121212 }
-.terminal-3877256817-r5 { fill: #656565 }
-.terminal-3877256817-r6 { fill: #e0e0e0 }
-.terminal-3877256817-r7 { fill: #c9c9c9 }
-.terminal-3877256817-r8 { fill: #494949 }
-.terminal-3877256817-r9 { fill: #6f6f6f }
-.terminal-3877256817-r10 { fill: #e0e0e0;font-weight: bold }
-.terminal-3877256817-r11 { fill: #b9b9b9 }
-.terminal-3877256817-r12 { fill: #acacac }
-.terminal-3877256817-r13 { fill: #c3c3c3 }
-.terminal-3877256817-r14 { fill: #999999 }
-.terminal-3877256817-r15 { fill: #3b3b3b }
-.terminal-3877256817-r16 { fill: #9e9e9e }
-.terminal-3877256817-r17 { fill: #b0b0b0;font-weight: bold }
-.terminal-3877256817-r18 { fill: #515151 }
+ .terminal-3102359155-r1 { fill: #c5c8c6 }
+.terminal-3102359155-r2 { fill: #a0a0a0;font-weight: bold }
+.terminal-3102359155-r3 { fill: #a0a0a0 }
+.terminal-3102359155-r4 { fill: #121212 }
+.terminal-3102359155-r5 { fill: #656565 }
+.terminal-3102359155-r6 { fill: #e0e0e0 }
+.terminal-3102359155-r7 { fill: #c9c9c9 }
+.terminal-3102359155-r8 { fill: #494949 }
+.terminal-3102359155-r9 { fill: #6f6f6f }
+.terminal-3102359155-r10 { fill: #e0e0e0;font-weight: bold }
+.terminal-3102359155-r11 { fill: #b9b9b9 }
+.terminal-3102359155-r12 { fill: #acacac }
+.terminal-3102359155-r13 { fill: #c3c3c3 }
+.terminal-3102359155-r14 { fill: #999999 }
+.terminal-3102359155-r15 { fill: #3b3b3b }
+.terminal-3102359155-r16 { fill: #9e9e9e }
+.terminal-3102359155-r17 { fill: #b0b0b0;font-weight: bold }
+.terminal-3102359155-r18 { fill: #515151 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- code-recall v0.2.4
+ code-recall v0.2.5
-
+
-
- code-recall v0.2.4 8 sessions indexed | Claude 4, Codex 4 | latest 2026-05-18
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊stripe webhook signature▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-Scope: All providers Mode: hybrid Visible:Claude 1Codex 1p provider f filters ? help Ctrl+K commands
-
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-2 of 2 results for "stripe webhook signature" in all providers▎
-▎Fix Stripe webhook signature verification
- 1ClaudeFix Stripe webhook signature verification▎Session: Claude Code · Project:
-strong 100%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎/Users/demo/Projects/payments-api · Activity: 2026-05-18
-2026-05-18 · 23 msgs · 535.2KB · claude-sonnet-4▎1 Overview 2 Why 3 Activity 4 Related 5 Ai
-why: matched text: Fix **Stripe** **webhook** **signature** verification 3 files ·▎
-2 cmds▎Related sessions
-▎- Debug checkout webhook retry handling shared files: 1
- 2CodexDebug checkout webhook retry handling▎
-weak 0%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎
-2026-05-18 · 23 msgs · 523.4KB · gpt-5.1-codex▎
-why: matched text: Debug checkout **webhook** retry handling 3 files · 2 cmds▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
- esc Close/Quit ^o Settings ▏^k palette
+
+ code-recall v0.2.5 8 sessions indexed | Claude 4, Codex 4 | latest 2026-05-18
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊stripe webhook signature▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+Scope: All providers Mode: hybrid Visible:Claude 1Codex 1p provider f filters ? help Ctrl+K commands
+
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+2 of 2 results for "stripe webhook signature" in all providers▎
+▎Fix Stripe webhook signature verification
+ 1ClaudeFix Stripe webhook signature verification▎Session: Claude Code · Project:
+strong 100%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎/Users/demo/Projects/payments-api · Activity: 2026-05-18
+2026-05-18 · 23 msgs · 535.2KB · claude-sonnet-4▎1 Overview 2 Why 3 Activity 4 Related 5 Ai
+why: matched text: Fix **Stripe** **webhook** **signature** verification 3 files ·▎
+2 cmds▎Related sessions
+▎- Debug checkout webhook retry handling shared files: 1
+ 2CodexDebug checkout webhook retry handling▎
+weak 0%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎
+2026-05-18 · 23 msgs · 523.4KB · gpt-5.1-codex▎
+why: matched text: Debug checkout **webhook** retry handling 3 files · 2 cmds▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+ esc Close/Quit ^o Settings ▏^k palette
diff --git a/docs/assets/code-recall-search.svg b/docs/assets/code-recall-search.svg
index fe277d6..6d63004 100644
--- a/docs/assets/code-recall-search.svg
+++ b/docs/assets/code-recall-search.svg
@@ -19,220 +19,220 @@
font-weight: 700;
}
- .terminal-2006882672-matrix {
+ .terminal-1550293362-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2006882672-title {
+ .terminal-1550293362-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2006882672-r1 { fill: #c5c8c6 }
-.terminal-2006882672-r2 { fill: #a0a0a0;font-weight: bold }
-.terminal-2006882672-r3 { fill: #a0a0a0 }
-.terminal-2006882672-r4 { fill: #121212 }
-.terminal-2006882672-r5 { fill: #656565 }
-.terminal-2006882672-r6 { fill: #e0e0e0 }
-.terminal-2006882672-r7 { fill: #c9c9c9 }
-.terminal-2006882672-r8 { fill: #494949 }
-.terminal-2006882672-r9 { fill: #6f6f6f }
-.terminal-2006882672-r10 { fill: #e0e0e0;font-weight: bold }
-.terminal-2006882672-r11 { fill: #b9b9b9 }
-.terminal-2006882672-r12 { fill: #acacac }
-.terminal-2006882672-r13 { fill: #c3c3c3 }
-.terminal-2006882672-r14 { fill: #3b3b3b }
-.terminal-2006882672-r15 { fill: #9e9e9e }
-.terminal-2006882672-r16 { fill: #999999 }
-.terminal-2006882672-r17 { fill: #b0b0b0;font-weight: bold }
-.terminal-2006882672-r18 { fill: #515151 }
+ .terminal-1550293362-r1 { fill: #c5c8c6 }
+.terminal-1550293362-r2 { fill: #a0a0a0;font-weight: bold }
+.terminal-1550293362-r3 { fill: #a0a0a0 }
+.terminal-1550293362-r4 { fill: #121212 }
+.terminal-1550293362-r5 { fill: #656565 }
+.terminal-1550293362-r6 { fill: #e0e0e0 }
+.terminal-1550293362-r7 { fill: #c9c9c9 }
+.terminal-1550293362-r8 { fill: #494949 }
+.terminal-1550293362-r9 { fill: #6f6f6f }
+.terminal-1550293362-r10 { fill: #e0e0e0;font-weight: bold }
+.terminal-1550293362-r11 { fill: #b9b9b9 }
+.terminal-1550293362-r12 { fill: #acacac }
+.terminal-1550293362-r13 { fill: #c3c3c3 }
+.terminal-1550293362-r14 { fill: #3b3b3b }
+.terminal-1550293362-r15 { fill: #9e9e9e }
+.terminal-1550293362-r16 { fill: #999999 }
+.terminal-1550293362-r17 { fill: #b0b0b0;font-weight: bold }
+.terminal-1550293362-r18 { fill: #515151 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- code-recall v0.2.4
+ code-recall v0.2.5
-
+
-
- code-recall v0.2.4 8 sessions indexed | Claude 4, Codex 4 | latest 2026-05-18
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊stripe webhook signature▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-Scope: All providers Mode: hybrid Visible:Claude 1Codex 1p provider f filters ? help Ctrl+K commands
-
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-2 of 2 results for "stripe webhook signature" in all providers▎
-▎Fix Stripe webhook signature verification
- 1ClaudeFix Stripe webhook signature verification▎Session: Claude Code · Project:
-strong 100%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎/Users/demo/Projects/payments-api · Activity: 2026-05-18
-2026-05-18 · 23 msgs · 535.2KB · claude-sonnet-4▎1 Overview 2 Why 3 Activity 4 Related 5 Ai
-why: matched text: Fix **Stripe** **webhook** **signature** verification 3 files ·▎
-2 cmds▎Score: strong (100%)
-▎Resume:claude --resume claude-demo-claude-001
- 2CodexDebug checkout webhook retry handling▎Provider capabilities: resume, model, branch, files, commands,
-weak 0%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎transcript
-2026-05-18 · 23 msgs · 523.4KB · gpt-5.1-codex▎Model: claude-sonnet-4
-why: matched text: Debug checkout **webhook** retry handling 3 files · 2 cmds▎Branch: fix/stripe-webhook-signature
-▎Messages: 23
-▎Source: Claude transcript ·
-▎/Users/demo/.code-agent-history/demo-claude-001.jsonl
-▎
-▎Started
-▎Production webhooks are failing signature verification after a
-▎framework upgrade.
-▎
-▎Left off
-▎Added raw body parsing and replay tests for Stripe webhook
-▎signature checks.
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
- esc Close/Quit ^o Settings ▏^k palette
+
+ code-recall v0.2.5 8 sessions indexed | Claude 4, Codex 4 | latest 2026-05-18
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊stripe webhook signature▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+Scope: All providers Mode: hybrid Visible:Claude 1Codex 1p provider f filters ? help Ctrl+K commands
+
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+2 of 2 results for "stripe webhook signature" in all providers▎
+▎Fix Stripe webhook signature verification
+ 1ClaudeFix Stripe webhook signature verification▎Session: Claude Code · Project:
+strong 100%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎/Users/demo/Projects/payments-api · Activity: 2026-05-18
+2026-05-18 · 23 msgs · 535.2KB · claude-sonnet-4▎1 Overview 2 Why 3 Activity 4 Related 5 Ai
+why: matched text: Fix **Stripe** **webhook** **signature** verification 3 files ·▎
+2 cmds▎Score: strong (100%)
+▎Resume:claude --resume claude-demo-claude-001
+ 2CodexDebug checkout webhook retry handling▎Provider capabilities: resume, model, branch, files, commands,
+weak 0%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎transcript
+2026-05-18 · 23 msgs · 523.4KB · gpt-5.1-codex▎Model: claude-sonnet-4
+why: matched text: Debug checkout **webhook** retry handling 3 files · 2 cmds▎Branch: fix/stripe-webhook-signature
+▎Messages: 23
+▎Source: Claude transcript ·
+▎/Users/demo/.code-agent-history/demo-claude-001.jsonl
+▎
+▎Started
+▎Production webhooks are failing signature verification after a
+▎framework upgrade.
+▎
+▎Left off
+▎Added raw body parsing and replay tests for Stripe webhook
+▎signature checks.
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+ esc Close/Quit ^o Settings ▏^k palette
diff --git a/docs/assets/code-recall-why.svg b/docs/assets/code-recall-why.svg
index 21794ae..c4dbbf6 100644
--- a/docs/assets/code-recall-why.svg
+++ b/docs/assets/code-recall-why.svg
@@ -19,220 +19,220 @@
font-weight: 700;
}
- .terminal-527427427-matrix {
+ .terminal-31254373-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-527427427-title {
+ .terminal-31254373-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-527427427-r1 { fill: #c5c8c6 }
-.terminal-527427427-r2 { fill: #a0a0a0;font-weight: bold }
-.terminal-527427427-r3 { fill: #a0a0a0 }
-.terminal-527427427-r4 { fill: #121212 }
-.terminal-527427427-r5 { fill: #656565 }
-.terminal-527427427-r6 { fill: #e0e0e0 }
-.terminal-527427427-r7 { fill: #c9c9c9 }
-.terminal-527427427-r8 { fill: #494949 }
-.terminal-527427427-r9 { fill: #6f6f6f }
-.terminal-527427427-r10 { fill: #e0e0e0;font-weight: bold }
-.terminal-527427427-r11 { fill: #b9b9b9 }
-.terminal-527427427-r12 { fill: #acacac }
-.terminal-527427427-r13 { fill: #c3c3c3 }
-.terminal-527427427-r14 { fill: #3b3b3b }
-.terminal-527427427-r15 { fill: #9e9e9e }
-.terminal-527427427-r16 { fill: #999999 }
-.terminal-527427427-r17 { fill: #b0b0b0;font-weight: bold }
-.terminal-527427427-r18 { fill: #515151 }
+ .terminal-31254373-r1 { fill: #c5c8c6 }
+.terminal-31254373-r2 { fill: #a0a0a0;font-weight: bold }
+.terminal-31254373-r3 { fill: #a0a0a0 }
+.terminal-31254373-r4 { fill: #121212 }
+.terminal-31254373-r5 { fill: #656565 }
+.terminal-31254373-r6 { fill: #e0e0e0 }
+.terminal-31254373-r7 { fill: #c9c9c9 }
+.terminal-31254373-r8 { fill: #494949 }
+.terminal-31254373-r9 { fill: #6f6f6f }
+.terminal-31254373-r10 { fill: #e0e0e0;font-weight: bold }
+.terminal-31254373-r11 { fill: #b9b9b9 }
+.terminal-31254373-r12 { fill: #acacac }
+.terminal-31254373-r13 { fill: #c3c3c3 }
+.terminal-31254373-r14 { fill: #3b3b3b }
+.terminal-31254373-r15 { fill: #9e9e9e }
+.terminal-31254373-r16 { fill: #999999 }
+.terminal-31254373-r17 { fill: #b0b0b0;font-weight: bold }
+.terminal-31254373-r18 { fill: #515151 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- code-recall v0.2.4
+ code-recall v0.2.5
-
+
-
- code-recall v0.2.4 8 sessions indexed | Claude 4, Codex 4 | latest 2026-05-18
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊stripe webhook signature▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-Scope: All providers Mode: hybrid Visible:Claude 1Codex 1p provider f filters ? help Ctrl+K commands
-
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-2 of 2 results for "stripe webhook signature" in all providers▎
-▎Fix Stripe webhook signature verification
- 1ClaudeFix Stripe webhook signature verification▎Session: Claude Code · Project:
-strong 100%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎/Users/demo/Projects/payments-api · Activity: 2026-05-18
-2026-05-18 · 23 msgs · 535.2KB · claude-sonnet-4▎1 Overview 2 Why 3 Activity 4 Related 5 Ai
-why: matched text: Fix **Stripe** **webhook** **signature** verification 3 files ·▎
-2 cmds▎Why this result matched
-▎Primary reason: matched text: Fix **Stripe** **webhook**
- 2CodexDebug checkout webhook retry handling▎**signature** verification
-weak 0%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎Keyword signal: rank 0.000
-2026-05-18 · 23 msgs · 523.4KB · gpt-5.1-codex▎
-why: matched text: Debug checkout **webhook** retry handling 3 files · 2 cmds▎Matched evidence
-▎- Fix **Stripe** **webhook** **signature** verification
-▎- Production **webhooks** are failing **signature**
-▎verification after a framework upgrade.
-▎- Added raw body parsing and replay tests for **Stripe**
-▎**webhook** **signature** checks.
-▎- Debugged **Stripe** **webhook** **signature** validation. The
-▎middleware parsed JSON before constructing the event, so the
-▎signed payload bytes no longer...
-▎- Edited: src/webhooks/stripe.ts
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
-▎
- esc Close/Quit ^o Settings ▏^k palette
+
+ code-recall v0.2.5 8 sessions indexed | Claude 4, Codex 4 | latest 2026-05-18
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊stripe webhook signature▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+Scope: All providers Mode: hybrid Visible:Claude 1Codex 1p provider f filters ? help Ctrl+K commands
+
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+2 of 2 results for "stripe webhook signature" in all providers▎
+▎Fix Stripe webhook signature verification
+ 1ClaudeFix Stripe webhook signature verification▎Session: Claude Code · Project:
+strong 100%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎/Users/demo/Projects/payments-api · Activity: 2026-05-18
+2026-05-18 · 23 msgs · 535.2KB · claude-sonnet-4▎1 Overview 2 Why 3 Activity 4 Related 5 Ai
+why: matched text: Fix **Stripe** **webhook** **signature** verification 3 files ·▎
+2 cmds▎Why this result matched
+▎Primary reason: matched text: Fix **Stripe** **webhook**
+ 2CodexDebug checkout webhook retry handling▎**signature** verification
+weak 0%/Users/demo/Projects/payments-api · fix/stripe-webhook-signature ·▎Keyword signal: rank 0.000
+2026-05-18 · 23 msgs · 523.4KB · gpt-5.1-codex▎
+why: matched text: Debug checkout **webhook** retry handling 3 files · 2 cmds▎Matched evidence
+▎- Fix **Stripe** **webhook** **signature** verification
+▎- Production **webhooks** are failing **signature**
+▎verification after a framework upgrade.
+▎- Added raw body parsing and replay tests for **Stripe**
+▎**webhook** **signature** checks.
+▎- Debugged **Stripe** **webhook** **signature** validation. The
+▎middleware parsed JSON before constructing the event, so the
+▎signed payload bytes no longer...
+▎- Edited: src/webhooks/stripe.ts
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+▎
+ esc Close/Quit ^o Settings ▏^k palette
diff --git a/pyproject.toml b/pyproject.toml
index ea49818..ab279c5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "code-recall"
-version = "0.2.4"
+version = "0.2.5"
description = "Semantic search across local coding-agent sessions. Find past conversations by intent, not just keywords."
readme = "README.md"
license = "MIT"
diff --git a/src/code_recall/__init__.py b/src/code_recall/__init__.py
index c9faf10..ed7cdbb 100644
--- a/src/code_recall/__init__.py
+++ b/src/code_recall/__init__.py
@@ -1,6 +1,6 @@
"""code-recall: Semantic search across local coding-agent sessions."""
-__version__ = "0.2.4"
+__version__ = "0.2.5"
def has_semantic() -> bool:
diff --git a/src/code_recall/db.py b/src/code_recall/db.py
index 2c4febb..9336a5a 100644
--- a/src/code_recall/db.py
+++ b/src/code_recall/db.py
@@ -448,13 +448,24 @@ def setup_vec_table(conn: sqlite3.Connection) -> None:
"""Create the vector table for semantic search. Requires sqlite-vec."""
if not load_vec_extension(conn):
return
+
+ # Dim is sourced from the active embedder so the table and embeddings
+ # stay in lockstep when the model changes. If an existing chunks_vec
+ # table has the wrong dim, drop it — the indexer will re-embed all
+ # chunks on the next run.
+ row = conn.execute(
+ "SELECT sql FROM sqlite_master WHERE type='table' AND name='chunks_vec'"
+ ).fetchone()
+ if row and not _chunks_vec_uses_current_dim(row["sql"]):
+ conn.execute("DROP TABLE chunks_vec")
+
+ dim = _current_embedding_dim()
conn.execute(
- """CREATE VIRTUAL TABLE IF NOT EXISTS chunks_vec USING vec0(
+ f"""CREATE VIRTUAL TABLE IF NOT EXISTS chunks_vec USING vec0(
chunk_rowid INTEGER PRIMARY KEY,
- embedding float[384] distance_metric=cosine
+ embedding float[{dim}] distance_metric=cosine
)"""
)
- # Drop old sessions_vec if migrating from v1
try:
conn.execute("DROP TABLE IF EXISTS sessions_vec")
except Exception:
@@ -462,9 +473,23 @@ def setup_vec_table(conn: sqlite3.Connection) -> None:
conn.commit()
+def _current_embedding_dim() -> int:
+ """Return the active embedding dimension without loading model weights."""
+ from code_recall.embedder import Embedder
+
+ return Embedder.DIM
+
+
+def _chunks_vec_uses_current_dim(sql: str | None) -> bool:
+ """Return whether an existing chunks_vec table matches the active embedder."""
+ if not sql:
+ return False
+ return f"float[{_current_embedding_dim()}]" in sql
+
+
def has_vec_table(conn: sqlite3.Connection) -> bool:
- """Check if the vector table exists."""
+ """Check if the vector table exists and matches the active embedder."""
row = conn.execute(
- "SELECT name FROM sqlite_master WHERE type='table' AND name='chunks_vec'"
+ "SELECT sql FROM sqlite_master WHERE type='table' AND name='chunks_vec'"
).fetchone()
- return row is not None
+ return row is not None and _chunks_vec_uses_current_dim(row["sql"])
diff --git a/src/code_recall/embedder.py b/src/code_recall/embedder.py
index 421f0de..503be92 100644
--- a/src/code_recall/embedder.py
+++ b/src/code_recall/embedder.py
@@ -14,7 +14,8 @@
class Embedder:
"""Wrapper around FastEmbed for generating text embeddings."""
- MODEL = "BAAI/bge-small-en-v1.5" # 33MB, 384 dimensions, ONNX
+ MODEL = "nomic-ai/nomic-embed-text-v1.5-Q" # 130MB, 768d, 8K context, ONNX
+ DIM = 768
def __init__(self):
from fastembed import TextEmbedding
@@ -22,12 +23,14 @@ def __init__(self):
self._model = TextEmbedding(model_name=self.MODEL)
def embed(self, texts: list[str]) -> list["np.ndarray"]:
- """Embed a batch of texts. Returns list of numpy arrays."""
- return list(self._model.embed(texts))
+ """Embed a batch of documents (uses model's passage prefix)."""
+ # Cast to float32 — nomic returns float64, sqlite-vec stores float32.
+ return [arr.astype("float32", copy=False) for arr in self._model.passage_embed(texts)]
def embed_single(self, text: str) -> "np.ndarray":
- """Embed a single text string."""
- return list(self._model.embed([text]))[0]
+ """Embed a single query (uses model's query prefix)."""
+ arr = list(self._model.query_embed([text]))[0]
+ return arr.astype("float32", copy=False)
class Reranker:
@@ -37,7 +40,7 @@ class Reranker:
cross-attention — much more accurate than bi-encoder similarity.
"""
- MODEL = "Xenova/ms-marco-MiniLM-L-6-v2" # 80MB, 18ms for 20 docs
+ MODEL = "jinaai/jina-reranker-v1-tiny-en" # 130MB, 8K context, ONNX
def __init__(self):
from fastembed.rerank.cross_encoder import TextCrossEncoder
@@ -52,7 +55,6 @@ def rerank(
Returns list of (original_index, score) sorted by score descending.
"""
scores = list(self._model.rerank(query, documents))
- # scores is a list of floats, one per document in original order
indexed_scores = list(enumerate(scores))
indexed_scores.sort(key=lambda x: x[1], reverse=True)
return indexed_scores
@@ -85,15 +87,13 @@ def get_reranker(allow_download: bool = False) -> Reranker | None:
return _reranker_instance
if not allow_download:
- # Check if model is already cached before loading
try:
from fastembed.common.utils import define_cache_dir
cache = define_cache_dir()
- # Look for the model in cache
- model_dirs = list(cache.glob("*ms-marco*MiniLM*"))
+ model_dirs = list(cache.glob("*jina-reranker*tiny*"))
if not model_dirs:
- return None # Not downloaded yet — skip reranking
+ return None
except Exception:
pass
diff --git a/src/code_recall/indexer.py b/src/code_recall/indexer.py
index dfba8bb..ab291ef 100644
--- a/src/code_recall/indexer.py
+++ b/src/code_recall/indexer.py
@@ -445,9 +445,6 @@ def _generate_embeddings(
if not rows:
return 0
- if verbose:
- print(f"\n Generating embeddings for {len(rows)} chunks...", file=sys.stderr)
-
# Prepare texts and IDs
texts = [row["chunk_text"] for row in rows if row["chunk_text"].strip()]
chunk_ids = [row["chunk_id"] for row in rows if row["chunk_text"].strip()]
@@ -455,23 +452,51 @@ def _generate_embeddings(
if not texts:
return 0
- # Batch embed
- embeddings = embedder.embed(texts)
+ # Embed in mini-batches so the user sees steady progress; one giant
+ # batched call produces a long silent stretch on heavier models.
+ batch_size = 64
+ use_tqdm = verbose and sys.stderr.isatty()
+ progress = None
+ if use_tqdm:
+ try:
+ from tqdm import tqdm
- # Store in vec table with periodic commits
- for i, (chunk_id, embedding) in enumerate(zip(chunk_ids, embeddings)):
- conn.execute(
- "INSERT OR REPLACE INTO chunks_vec (chunk_rowid, embedding) VALUES (?, ?)",
- (chunk_id, embedding.tobytes()),
- )
- if (i + 1) % 50 == 0:
- conn.commit()
- if verbose:
- print(
- f"\r Embedded {i + 1}/{len(chunk_ids)} chunks...",
- end="",
- file=sys.stderr,
- )
+ progress = tqdm(
+ total=len(texts),
+ unit="chunk",
+ desc=" Embedding",
+ file=sys.stderr,
+ leave=True,
+ )
+ except ImportError:
+ progress = None
+ elif verbose:
+ print(f"\n Generating embeddings for {len(texts)} chunks...", file=sys.stderr)
+
+ embedded = 0
+ for start in range(0, len(texts), batch_size):
+ batch_texts = texts[start : start + batch_size]
+ batch_ids = chunk_ids[start : start + batch_size]
+ batch_embeddings = embedder.embed(batch_texts)
+ for chunk_id, embedding in zip(batch_ids, batch_embeddings):
+ conn.execute(
+ "INSERT OR REPLACE INTO chunks_vec (chunk_rowid, embedding) VALUES (?, ?)",
+ (chunk_id, embedding.tobytes()),
+ )
+ embedded += 1
+ conn.commit()
+ if progress is not None:
+ progress.update(len(batch_texts))
+ elif verbose:
+ print(
+ f"\r Embedded {embedded}/{len(texts)} chunks...",
+ end="",
+ file=sys.stderr,
+ )
+
+ if progress is not None:
+ progress.close()
+ elif verbose:
+ print(file=sys.stderr)
- conn.commit()
return len(chunk_ids)
diff --git a/src/code_recall/utils.py b/src/code_recall/utils.py
index ad4b463..ac150c7 100644
--- a/src/code_recall/utils.py
+++ b/src/code_recall/utils.py
@@ -805,7 +805,7 @@ def _dedupe(values: list[str]) -> list[str]:
# Chunk configuration
CHUNK_SIZE = 5 # messages per chunk
CHUNK_OVERLAP = 1 # overlapping messages between chunks
-MAX_CHUNK_CHARS = 2000 # max chars per chunk text
+MAX_CHUNK_CHARS = 8000 # max chars per chunk (~2K tokens, well under embedder's 8K limit)
def _build_fts_text(
diff --git a/tests/test_db.py b/tests/test_db.py
index f38c482..30da551 100644
--- a/tests/test_db.py
+++ b/tests/test_db.py
@@ -15,6 +15,7 @@
get_related_sessions,
get_session_mtime,
get_stats,
+ has_vec_table,
upsert_chunks,
upsert_graph_edges,
upsert_session,
@@ -164,6 +165,19 @@ def test_migrates_v3_database_before_provider_index(self, tmp_path):
assert index_row is not None
assert version == "4"
+ def test_has_vec_table_rejects_old_embedding_dimension(self, db_conn):
+ """Search should not use stale vector tables from older embedder dims."""
+ db_conn.execute(
+ "CREATE TABLE chunks_vec (chunk_rowid INTEGER PRIMARY KEY, embedding float[384])"
+ )
+ assert not has_vec_table(db_conn)
+
+ db_conn.execute("DROP TABLE chunks_vec")
+ db_conn.execute(
+ "CREATE TABLE chunks_vec (chunk_rowid INTEGER PRIMARY KEY, embedding float[768])"
+ )
+ assert has_vec_table(db_conn)
+
def test_chunks_columns(self, db_conn):
cols = {
row[1]
diff --git a/uv.lock b/uv.lock
index bbbb8cb..63001f5 100644
--- a/uv.lock
+++ b/uv.lock
@@ -160,7 +160,7 @@ wheels = [
[[package]]
name = "code-recall"
-version = "0.2.4"
+version = "0.2.5"
source = { editable = "." }
[package.optional-dependencies]