Your conversations
Load the sample, upload a conversations.json export (Claude or ChatGPT), or paste a transcript. Nothing leaves your browser unless you choose to send it.
Highlights to keep
0Send straight to my Readwise
If your browser blocks the request, use the CLI in the repo: node cli/learning-loop.mjs export.json --push
What are you working on this week?
Daily Review today asks one question: which highlights are due? This adds a second: which due highlights matter to what I'm doing now?
Today: spaced repetition only
With this week's context
How it works
Capture
- Parse. Claude's and ChatGPT's
conversations.jsonexports, or a pasted transcript, are normalized into turns. For ChatGPT, only the branch you kept (walking up fromcurrent_node) is used — regenerated answers you abandoned are ignored. - Score sentences. Each sentence of each answer gets transparent signals: definitions, contrasts ("not X but Y"), rules of thumb, causal claims, bold emphasis, whether it answered your question, and — the strongest signal — whether your next message reacted ("oh interesting", "didn't know that", "原来如此"). Filler ("Great question!") and sentences that depend on context ("It matters most when…") are dropped.
- Pick a few. At most two per answer and four per conversation, with near-duplicates suppressed. Your question becomes the highlight's note, so the review card has context.
- Send. Highlights go to Readwise via
POST /api/v2/highlights/(or a CSV import) withsource_type=learning_loopand.ai-chattags.
Context-aware review
final = w · relevance(context) + (1 − w) · dueness, where relevance is BM25 over highlight text, title and tags, and dueness is days since last review ÷ current interval (capped at 1). The list is then re-ranked with Maximal Marginal Relevance so one book can't take over the session. Chinese text is tokenized with character bigrams, so it works without a segmenter.
This is the same shape as an ad or feed ranking stack — a relevance model, a business constraint (spacing), and a diversity pass — scaled down to one reader.
What a production version would change
- Embeddings instead of BM25 for relevance (Readwise already built hybrid search for MCP).
- Context inferred, not typed: what's in your Reader inbox this week, your recent tags, your calendar.
- An evaluation loop: does context-aware review raise "Keep" / "Mastery" rates and 30-day retention versus control?