diff --git a/README.md b/README.md index 510f568..f913062 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,6 @@ Search, inspect, chat with, and resume your local Claude Code and Codex history [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-3776AB.svg)](https://python.org) -[![Tests](https://img.shields.io/badge/tests-331%20passing-34D058.svg)](#development) [![Local first](https://img.shields.io/badge/local--first-no%20API%20keys-34D058.svg)](#privacy) [![Providers](https://img.shields.io/badge/providers-Claude%20Code%20%2B%20Codex-8B5CF6.svg)](#providers) @@ -32,7 +31,7 @@ Coding agents leave behind useful local transcripts, but built-in resume pickers - "the Docker healthcheck that broke deploys" - "the branch where the OAuth callback tests were added" -**code-recall turns those transcripts into a searchable memory layer.** It indexes Claude Code and Codex sessions, ranks results with keyword search, semantic search, reranking, and graph signals, then lets you jump back into the right project with the right provider command. +code-recall indexes Claude Code and Codex sessions, ranks results with keyword search, semantic search, reranking, and graph signals, then lets you jump back into the right project with the right provider command. ## What It Does @@ -46,19 +45,15 @@ Coding agents leave behind useful local transcripts, but built-in resume pickers ## Screenshots -All README media is generated from synthetic demo data using [scripts/generate_demo_assets.py](scripts/generate_demo_assets.py). It does not come from a real work index. +Generated from synthetic demo data via [scripts/generate_demo_assets.py](scripts/generate_demo_assets.py) — not from a real index. -| Search across providers | Understand why it matched | +| Search across providers | Why this matched | |---|---| -| Search results with Claude Code and Codex provider badges | Why tab showing matched evidence for a result | +| Search results across Claude Code and Codex | Why panel showing matched evidence | -| Inspect activity | Find related sessions | -|---|---| -| Activity tab showing files touched and commands run | Related tab showing sessions connected through shared files | - -| Chat with a transcript | -|---| -| AI transcript chat for a selected coding-agent session | +

+ Chat with a selected transcript +

## Install @@ -195,17 +190,16 @@ code-recall keeps the index fresh in two ways: - Every search/TUI startup runs a quick incremental index over Claude Code and Codex sources before searching. - On first run or `code-recall install-hooks`, code-recall installs a Claude Code `SessionEnd` hook that runs `code-recall index --quiet` when Claude Code sessions end. -Codex sessions are indexed on the next incremental index/search run. There is no Codex session-end hook installed today because Codex does not expose the same `SessionEnd` hook surface in this repo's integration path. +Codex doesn't currently expose a session-end hook, so Codex sessions are picked up on the next incremental index or search. ## Privacy -code-recall is designed for local developer recall: +code-recall runs locally: - The index is a local SQLite database under your app data directory. - Keyword and graph search do not require network calls. - Semantic search uses local embeddings. - AI investigation and transcript chat are explicit actions, not automatic background calls. -- README screenshots are synthetic and reproducible from [scripts/generate_demo_assets.py](scripts/generate_demo_assets.py). ## Architecture @@ -300,27 +294,7 @@ uv run pytest tests/test_search_quality.py -v ## Release -Releases are tag driven. CI verifies the version declarations match before publishing. The release workflow builds distributions, publishes to PyPI through Trusted Publishing, and creates or updates the matching GitHub release. - -Trusted Publisher fields: - -| Field | Value | -|-------|-------| -| PyPI project name | `code-recall` | -| Owner | `lupuletic` | -| Repository name | `code-recall` | -| Workflow name | `release.yml` | -| Environment name | `pypi` | - -```bash -uv run python scripts/check_version.py -uv run pytest -q -uv run python -m compileall -q src tests -uv build --no-sources - -git tag v0.2.2 -git push origin main --tags -``` +Release workflow and Trusted Publisher details: [docs/RELEASE.md](docs/RELEASE.md). ## License diff --git a/docs/RELEASE.md b/docs/RELEASE.md new file mode 100644 index 0000000..d0c6e77 --- /dev/null +++ b/docs/RELEASE.md @@ -0,0 +1,25 @@ +# Releasing code-recall + +Releases are tag driven. CI verifies the version declarations match before publishing. The release workflow builds distributions, publishes to PyPI through Trusted Publishing, and creates or updates the matching GitHub release. + +## Trusted Publisher fields + +| Field | Value | +|-------|-------| +| PyPI project name | `code-recall` | +| Owner | `lupuletic` | +| Repository name | `code-recall` | +| Workflow name | `release.yml` | +| Environment name | `pypi` | + +## Cutting a release + +```bash +uv run python scripts/check_version.py +uv run pytest -q +uv run python -m compileall -q src tests +uv build --no-sources + +git tag v0.2.2 +git push origin main --tags +``` diff --git a/docs/assets/code-recall-activity.svg b/docs/assets/code-recall-activity.svg index 2472ba7..389856e 100644 --- a/docs/assets/code-recall-activity.svg +++ b/docs/assets/code-recall-activity.svg @@ -19,226 +19,226 @@ font-weight: 700; } - .terminal-964672681-matrix { + .terminal-2635179419-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-964672681-title { + .terminal-2635179419-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-964672681-r1 { fill: #c5c8c6 } -.terminal-964672681-r2 { fill: #a0a0a0;font-weight: bold } -.terminal-964672681-r3 { fill: #a0a0a0 } -.terminal-964672681-r4 { fill: #121212 } -.terminal-964672681-r5 { fill: #656565 } -.terminal-964672681-r6 { fill: #e0e0e0 } -.terminal-964672681-r7 { fill: #c9c9c9 } -.terminal-964672681-r8 { fill: #494949 } -.terminal-964672681-r9 { fill: #6f6f6f } -.terminal-964672681-r10 { fill: #e0e0e0;font-weight: bold } -.terminal-964672681-r11 { fill: #7d7d7d;font-weight: bold } -.terminal-964672681-r12 { fill: #7d7d7d } -.terminal-964672681-r13 { fill: #737373 } -.terminal-964672681-r14 { fill: #616161 } -.terminal-964672681-r15 { fill: #424242 } -.terminal-964672681-r16 { fill: #5c5c5c } -.terminal-964672681-r17 { fill: #717171;font-weight: bold } -.terminal-964672681-r18 { fill: #717171 } -.terminal-964672681-r19 { fill: #2d2d2d } -.terminal-964672681-r20 { fill: #525252 } -.terminal-964672681-r21 { fill: #353535 } -.terminal-964672681-r22 { fill: #ededed } -.terminal-964672681-r23 { fill: #b0b0b0;font-weight: bold } -.terminal-964672681-r24 { fill: #515151 } + .terminal-2635179419-r1 { fill: #c5c8c6 } +.terminal-2635179419-r2 { fill: #a0a0a0;font-weight: bold } +.terminal-2635179419-r3 { fill: #a0a0a0 } +.terminal-2635179419-r4 { fill: #121212 } +.terminal-2635179419-r5 { fill: #0178d4 } +.terminal-2635179419-r6 { fill: #e0e0e0 } +.terminal-2635179419-r7 { fill: #398280 } +.terminal-2635179419-r8 { fill: #ff2c7a } +.terminal-2635179419-r9 { fill: #6f6f6f } +.terminal-2635179419-r10 { fill: #e0e0e0;font-weight: bold } +.terminal-2635179419-r11 { fill: #6b8095;font-weight: bold } +.terminal-2635179419-r12 { fill: #6b8095 } +.terminal-2635179419-r13 { fill: #068ea3 } +.terminal-2635179419-r14 { fill: #4a6580 } +.terminal-2635179419-r15 { fill: #065530 } +.terminal-2635179419-r16 { fill: #98a84b } +.terminal-2635179419-r17 { fill: #717171;font-weight: bold } +.terminal-2635179419-r18 { fill: #717171 } +.terminal-2635179419-r19 { fill: #7f0c7f } +.terminal-2635179419-r20 { fill: #525252 } +.terminal-2635179419-r21 { fill: #0c460c } +.terminal-2635179419-r22 { fill: #d08442 } +.terminal-2635179419-r23 { fill: #ffa62b;font-weight: bold } +.terminal-2635179419-r24 { fill: #495259 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - code-recall v0.2.2 + code-recall v0.2.2 - - - - code-recall v0.2.2  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 verificationSession: 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-41 Overview   2 Why   3 Activity   4 Related   5 Ai -why: matched text: Fix **Stripe** **webhook** **signature** verification   3 files · -2 cmdsFiles touched -src/webhooks/stripe.ts - 2CodexDebug checkout webhook retry handlingsrc/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 cmdsCommands 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.2  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 verificationSession: 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-41 Overview   2 Why   3 Activity   4 Related   5 Ai +why: matched text: Fix **Stripe** **webhook** **signature** verification   3 files · +2 cmdsFiles touched +src/webhooks/stripe.ts + 2CodexDebug checkout webhook retry handlingsrc/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 cmdsCommands 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 eaaa771..ec42802 100644 --- a/docs/assets/code-recall-ai-chat.svg +++ b/docs/assets/code-recall-ai-chat.svg @@ -19,228 +19,228 @@ font-weight: 700; } - .terminal-2132318520-matrix { + .terminal-741049693-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2132318520-title { + .terminal-741049693-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2132318520-r1 { fill: #c5c8c6 } -.terminal-2132318520-r2 { fill: #a0a0a0;font-weight: bold } -.terminal-2132318520-r3 { fill: #a0a0a0 } -.terminal-2132318520-r4 { fill: #121212 } -.terminal-2132318520-r5 { fill: #191919 } -.terminal-2132318520-r6 { fill: #e0e0e0 } -.terminal-2132318520-r7 { fill: #c9c9c9 } -.terminal-2132318520-r8 { fill: #494949 } -.terminal-2132318520-r9 { fill: #6f6f6f } -.terminal-2132318520-r10 { fill: #656565 } -.terminal-2132318520-r11 { fill: #e0e0e0;font-weight: bold } -.terminal-2132318520-r12 { fill: #7d7d7d;font-weight: bold } -.terminal-2132318520-r13 { fill: #7d7d7d } -.terminal-2132318520-r14 { fill: #737373 } -.terminal-2132318520-r15 { fill: #616161 } -.terminal-2132318520-r16 { fill: #424242 } -.terminal-2132318520-r17 { fill: #999999 } -.terminal-2132318520-r18 { fill: #717171;font-weight: bold } -.terminal-2132318520-r19 { fill: #717171 } -.terminal-2132318520-r20 { fill: #2d2d2d } -.terminal-2132318520-r21 { fill: #525252 } -.terminal-2132318520-r22 { fill: #353535 } -.terminal-2132318520-r23 { fill: #5c5c5c } -.terminal-2132318520-r24 { fill: #797979 } -.terminal-2132318520-r25 { fill: #b0b0b0;font-weight: bold } -.terminal-2132318520-r26 { fill: #515151 } + .terminal-741049693-r1 { fill: #c5c8c6 } +.terminal-741049693-r2 { fill: #a0a0a0;font-weight: bold } +.terminal-741049693-r3 { fill: #a0a0a0 } +.terminal-741049693-r4 { fill: #121212 } +.terminal-741049693-r5 { fill: #191919 } +.terminal-741049693-r6 { fill: #e0e0e0 } +.terminal-741049693-r7 { fill: #398280 } +.terminal-741049693-r8 { fill: #ff2c7a } +.terminal-741049693-r9 { fill: #6f6f6f } +.terminal-741049693-r10 { fill: #0178d4 } +.terminal-741049693-r11 { fill: #e0e0e0;font-weight: bold } +.terminal-741049693-r12 { fill: #6b8095;font-weight: bold } +.terminal-741049693-r13 { fill: #6b8095 } +.terminal-741049693-r14 { fill: #068ea3 } +.terminal-741049693-r15 { fill: #4a6580 } +.terminal-741049693-r16 { fill: #065530 } +.terminal-741049693-r17 { fill: #999999 } +.terminal-741049693-r18 { fill: #717171;font-weight: bold } +.terminal-741049693-r19 { fill: #717171 } +.terminal-741049693-r20 { fill: #7f0c7f } +.terminal-741049693-r21 { fill: #525252 } +.terminal-741049693-r22 { fill: #0c460c } +.terminal-741049693-r23 { fill: #98a84b } +.terminal-741049693-r24 { fill: #797979 } +.terminal-741049693-r25 { fill: #ffa62b;font-weight: bold } +.terminal-741049693-r26 { fill: #495259 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - code-recall v0.2.2 + code-recall v0.2.2 - - - - code-recall v0.2.2  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 verificationSession: 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-41 Overview   2 Why   3 Activity   4 Related   5 Ai -why: matched text: Fix **Stripe** **webhook** **signature** verification   3 files · -2 cmdsTranscript 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 cmdsClaude 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.2  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 verificationSession: 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-41 Overview   2 Why   3 Activity   4 Related   5 Ai +why: matched text: Fix **Stripe** **webhook** **signature** verification   3 files · +2 cmdsTranscript 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 cmdsClaude 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 743e4a1..6adf921 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 bb2af70..a421009 100644 --- a/docs/assets/code-recall-related.svg +++ b/docs/assets/code-recall-related.svg @@ -19,225 +19,225 @@ font-weight: 700; } - .terminal-3830932642-matrix { + .terminal-3534508471-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3830932642-title { + .terminal-3534508471-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3830932642-r1 { fill: #c5c8c6 } -.terminal-3830932642-r2 { fill: #a0a0a0;font-weight: bold } -.terminal-3830932642-r3 { fill: #a0a0a0 } -.terminal-3830932642-r4 { fill: #121212 } -.terminal-3830932642-r5 { fill: #656565 } -.terminal-3830932642-r6 { fill: #e0e0e0 } -.terminal-3830932642-r7 { fill: #c9c9c9 } -.terminal-3830932642-r8 { fill: #494949 } -.terminal-3830932642-r9 { fill: #6f6f6f } -.terminal-3830932642-r10 { fill: #e0e0e0;font-weight: bold } -.terminal-3830932642-r11 { fill: #7d7d7d;font-weight: bold } -.terminal-3830932642-r12 { fill: #7d7d7d } -.terminal-3830932642-r13 { fill: #737373 } -.terminal-3830932642-r14 { fill: #616161 } -.terminal-3830932642-r15 { fill: #424242 } -.terminal-3830932642-r16 { fill: #999999 } -.terminal-3830932642-r17 { fill: #717171;font-weight: bold } -.terminal-3830932642-r18 { fill: #717171 } -.terminal-3830932642-r19 { fill: #2d2d2d } -.terminal-3830932642-r20 { fill: #525252 } -.terminal-3830932642-r21 { fill: #353535 } -.terminal-3830932642-r22 { fill: #b0b0b0;font-weight: bold } -.terminal-3830932642-r23 { fill: #515151 } + .terminal-3534508471-r1 { fill: #c5c8c6 } +.terminal-3534508471-r2 { fill: #a0a0a0;font-weight: bold } +.terminal-3534508471-r3 { fill: #a0a0a0 } +.terminal-3534508471-r4 { fill: #121212 } +.terminal-3534508471-r5 { fill: #0178d4 } +.terminal-3534508471-r6 { fill: #e0e0e0 } +.terminal-3534508471-r7 { fill: #398280 } +.terminal-3534508471-r8 { fill: #ff2c7a } +.terminal-3534508471-r9 { fill: #6f6f6f } +.terminal-3534508471-r10 { fill: #e0e0e0;font-weight: bold } +.terminal-3534508471-r11 { fill: #6b8095;font-weight: bold } +.terminal-3534508471-r12 { fill: #6b8095 } +.terminal-3534508471-r13 { fill: #068ea3 } +.terminal-3534508471-r14 { fill: #4a6580 } +.terminal-3534508471-r15 { fill: #065530 } +.terminal-3534508471-r16 { fill: #999999 } +.terminal-3534508471-r17 { fill: #717171;font-weight: bold } +.terminal-3534508471-r18 { fill: #717171 } +.terminal-3534508471-r19 { fill: #7f0c7f } +.terminal-3534508471-r20 { fill: #525252 } +.terminal-3534508471-r21 { fill: #0c460c } +.terminal-3534508471-r22 { fill: #ffa62b;font-weight: bold } +.terminal-3534508471-r23 { fill: #495259 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - code-recall v0.2.2 + code-recall v0.2.2 - - - - code-recall v0.2.2  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 verificationSession: 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-41 Overview   2 Why   3 Activity   4 Related   5 Ai -why: matched text: Fix **Stripe** **webhook** **signature** verification   3 files · -2 cmdsRelated sessions -Debug checkout webhook retry handlingshared 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.2  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 verificationSession: 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-41 Overview   2 Why   3 Activity   4 Related   5 Ai +why: matched text: Fix **Stripe** **webhook** **signature** verification   3 files · +2 cmdsRelated sessions +Debug checkout webhook retry handlingshared 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 dfcaba3..831c474 100644 --- a/docs/assets/code-recall-search.svg +++ b/docs/assets/code-recall-search.svg @@ -19,226 +19,226 @@ font-weight: 700; } - .terminal-3799872596-matrix { + .terminal-3903611056-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3799872596-title { + .terminal-3903611056-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3799872596-r1 { fill: #c5c8c6 } -.terminal-3799872596-r2 { fill: #a0a0a0;font-weight: bold } -.terminal-3799872596-r3 { fill: #a0a0a0 } -.terminal-3799872596-r4 { fill: #121212 } -.terminal-3799872596-r5 { fill: #656565 } -.terminal-3799872596-r6 { fill: #e0e0e0 } -.terminal-3799872596-r7 { fill: #c9c9c9 } -.terminal-3799872596-r8 { fill: #494949 } -.terminal-3799872596-r9 { fill: #6f6f6f } -.terminal-3799872596-r10 { fill: #e0e0e0;font-weight: bold } -.terminal-3799872596-r11 { fill: #7d7d7d;font-weight: bold } -.terminal-3799872596-r12 { fill: #7d7d7d } -.terminal-3799872596-r13 { fill: #737373 } -.terminal-3799872596-r14 { fill: #616161 } -.terminal-3799872596-r15 { fill: #424242 } -.terminal-3799872596-r16 { fill: #5c5c5c } -.terminal-3799872596-r17 { fill: #717171;font-weight: bold } -.terminal-3799872596-r18 { fill: #717171 } -.terminal-3799872596-r19 { fill: #2d2d2d } -.terminal-3799872596-r20 { fill: #525252 } -.terminal-3799872596-r21 { fill: #353535 } -.terminal-3799872596-r22 { fill: #999999 } -.terminal-3799872596-r23 { fill: #b0b0b0;font-weight: bold } -.terminal-3799872596-r24 { fill: #515151 } + .terminal-3903611056-r1 { fill: #c5c8c6 } +.terminal-3903611056-r2 { fill: #a0a0a0;font-weight: bold } +.terminal-3903611056-r3 { fill: #a0a0a0 } +.terminal-3903611056-r4 { fill: #121212 } +.terminal-3903611056-r5 { fill: #0178d4 } +.terminal-3903611056-r6 { fill: #e0e0e0 } +.terminal-3903611056-r7 { fill: #398280 } +.terminal-3903611056-r8 { fill: #ff2c7a } +.terminal-3903611056-r9 { fill: #6f6f6f } +.terminal-3903611056-r10 { fill: #e0e0e0;font-weight: bold } +.terminal-3903611056-r11 { fill: #6b8095;font-weight: bold } +.terminal-3903611056-r12 { fill: #6b8095 } +.terminal-3903611056-r13 { fill: #068ea3 } +.terminal-3903611056-r14 { fill: #4a6580 } +.terminal-3903611056-r15 { fill: #065530 } +.terminal-3903611056-r16 { fill: #98a84b } +.terminal-3903611056-r17 { fill: #717171;font-weight: bold } +.terminal-3903611056-r18 { fill: #717171 } +.terminal-3903611056-r19 { fill: #7f0c7f } +.terminal-3903611056-r20 { fill: #525252 } +.terminal-3903611056-r21 { fill: #0c460c } +.terminal-3903611056-r22 { fill: #999999 } +.terminal-3903611056-r23 { fill: #ffa62b;font-weight: bold } +.terminal-3903611056-r24 { fill: #495259 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - code-recall v0.2.2 + code-recall v0.2.2 - - - - code-recall v0.2.2  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 verificationSession: 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-41 Overview   2 Why   3 Activity   4 Related   5 Ai -why: matched text: Fix **Stripe** **webhook** **signature** verification   3 files · -2 cmdsScore: strong (100%) -Resume:claude --resume claude-demo-claude-001 - 2CodexDebug checkout webhook retry handlingProvider 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-codexModel: claude-sonnet-4 -why: matched text: Debug checkout **webhook** retry handling   3 files · 2 cmdsBranch: 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.2  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 verificationSession: 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-41 Overview   2 Why   3 Activity   4 Related   5 Ai +why: matched text: Fix **Stripe** **webhook** **signature** verification   3 files · +2 cmdsScore: strong (100%) +Resume:claude --resume claude-demo-claude-001 + 2CodexDebug checkout webhook retry handlingProvider 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-codexModel: claude-sonnet-4 +why: matched text: Debug checkout **webhook** retry handling   3 files · 2 cmdsBranch: 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 38bfd20..f5c165a 100644 --- a/docs/assets/code-recall-why.svg +++ b/docs/assets/code-recall-why.svg @@ -19,226 +19,226 @@ font-weight: 700; } - .terminal-2897396268-matrix { + .terminal-3176050267-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2897396268-title { + .terminal-3176050267-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2897396268-r1 { fill: #c5c8c6 } -.terminal-2897396268-r2 { fill: #a0a0a0;font-weight: bold } -.terminal-2897396268-r3 { fill: #a0a0a0 } -.terminal-2897396268-r4 { fill: #121212 } -.terminal-2897396268-r5 { fill: #656565 } -.terminal-2897396268-r6 { fill: #e0e0e0 } -.terminal-2897396268-r7 { fill: #c9c9c9 } -.terminal-2897396268-r8 { fill: #494949 } -.terminal-2897396268-r9 { fill: #6f6f6f } -.terminal-2897396268-r10 { fill: #e0e0e0;font-weight: bold } -.terminal-2897396268-r11 { fill: #7d7d7d;font-weight: bold } -.terminal-2897396268-r12 { fill: #7d7d7d } -.terminal-2897396268-r13 { fill: #737373 } -.terminal-2897396268-r14 { fill: #616161 } -.terminal-2897396268-r15 { fill: #424242 } -.terminal-2897396268-r16 { fill: #5c5c5c } -.terminal-2897396268-r17 { fill: #717171;font-weight: bold } -.terminal-2897396268-r18 { fill: #717171 } -.terminal-2897396268-r19 { fill: #2d2d2d } -.terminal-2897396268-r20 { fill: #525252 } -.terminal-2897396268-r21 { fill: #353535 } -.terminal-2897396268-r22 { fill: #999999 } -.terminal-2897396268-r23 { fill: #b0b0b0;font-weight: bold } -.terminal-2897396268-r24 { fill: #515151 } + .terminal-3176050267-r1 { fill: #c5c8c6 } +.terminal-3176050267-r2 { fill: #a0a0a0;font-weight: bold } +.terminal-3176050267-r3 { fill: #a0a0a0 } +.terminal-3176050267-r4 { fill: #121212 } +.terminal-3176050267-r5 { fill: #0178d4 } +.terminal-3176050267-r6 { fill: #e0e0e0 } +.terminal-3176050267-r7 { fill: #398280 } +.terminal-3176050267-r8 { fill: #ff2c7a } +.terminal-3176050267-r9 { fill: #6f6f6f } +.terminal-3176050267-r10 { fill: #e0e0e0;font-weight: bold } +.terminal-3176050267-r11 { fill: #6b8095;font-weight: bold } +.terminal-3176050267-r12 { fill: #6b8095 } +.terminal-3176050267-r13 { fill: #068ea3 } +.terminal-3176050267-r14 { fill: #4a6580 } +.terminal-3176050267-r15 { fill: #065530 } +.terminal-3176050267-r16 { fill: #98a84b } +.terminal-3176050267-r17 { fill: #717171;font-weight: bold } +.terminal-3176050267-r18 { fill: #717171 } +.terminal-3176050267-r19 { fill: #7f0c7f } +.terminal-3176050267-r20 { fill: #525252 } +.terminal-3176050267-r21 { fill: #0c460c } +.terminal-3176050267-r22 { fill: #999999 } +.terminal-3176050267-r23 { fill: #ffa62b;font-weight: bold } +.terminal-3176050267-r24 { fill: #495259 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - code-recall v0.2.2 + code-recall v0.2.2 - - - - code-recall v0.2.2  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 verificationSession: 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-41 Overview   2 Why   3 Activity   4 Related   5 Ai -why: matched text: Fix **Stripe** **webhook** **signature** verification   3 files · -2 cmdsWhy 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 cmdsMatched 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.2  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 verificationSession: 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-41 Overview   2 Why   3 Activity   4 Related   5 Ai +why: matched text: Fix **Stripe** **webhook** **signature** verification   3 files · +2 cmdsWhy 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 cmdsMatched 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/scripts/generate_demo_assets.py b/scripts/generate_demo_assets.py index e3ff2d0..0f1d053 100644 --- a/scripts/generate_demo_assets.py +++ b/scripts/generate_demo_assets.py @@ -9,6 +9,7 @@ import argparse import asyncio +import io import json import shutil import subprocess @@ -16,6 +17,9 @@ from dataclasses import dataclass from pathlib import Path +from rich.console import Console +from rich.terminal_theme import SVG_EXPORT_THEME + from code_recall.db import ( build_session_chains, get_connection, @@ -337,7 +341,44 @@ async def _render_screenshot( assistant_label="Claude Code", ) await pilot.pause() - app.save_screenshot(filename=filename, path=str(asset_dir)) + _export_svg_with_theme(app, asset_dir / filename) + + +# Remap from Rich's DEFAULT_TERMINAL_THEME palette (pure ANSI: harsh #00ffff +# cyan, #ff00ff magenta) to SVG_EXPORT_THEME palette (softer monokai-style) +# so README screenshots look like a real iTerm/Ghostty rendering. We post- +# process because Textual's compositor resolves ANSI->RGB before Rich's SVG +# theme parameter would take effect. +_ANSI_TO_SVG_THEME_MAP = { + "#000000": "#4b4e55", "#800000": "#cc555a", "#008000": "#98a84b", + "#808000": "#d0b344", "#000080": "#608ab1", "#800080": "#98729f", + "#008080": "#68a0b3", "#c0c0c0": "#c5c8c6", "#808080": "#9a9b99", + "#ff0000": "#ff2627", "#00ff00": "#00823d", "#ffff00": "#d08442", + "#0000ff": "#1984e9", "#ff00ff": "#ff2c7a", "#00ffff": "#398280", + "#ffffff": "#fdfdc5", +} + + +def _export_svg_with_theme(app: RecallApp, svg_path: Path) -> None: + width, height = app.size + console = Console( + width=width, + height=height, + file=io.StringIO(), + force_terminal=True, + color_system="truecolor", + record=True, + legacy_windows=False, + safe_box=False, + ) + screen_render = app.screen._compositor.render_update( + full=True, screen_stack=app._background_screens, simplify=False, + ) + console.print(screen_render) + svg = console.export_svg(title=app.title, theme=SVG_EXPORT_THEME) + for harsh, soft in _ANSI_TO_SVG_THEME_MAP.items(): + svg = svg.replace(harsh, soft) + svg_path.write_text(svg, encoding="utf-8") async def render_assets(asset_dir: Path) -> None: