# claude-mem changelog > claude-mem release notes. - Vendor: claude-mem - Category: AI - License: Apache-2.0 - Language: JavaScript - Official site: https://claude-mem.ai/ - Tracked by: What's New (https://whatsnew.fyi/product/claude-mem) - Harvested from: GitHub (thedotmack/claude-mem) - Entries below: 25 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## Releases ### v13.35.0 - Date: 2026-10-09 - Version: v13.35.0 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.35.0 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.35.0 - **added** — Added the mem_search tool with guided and automatic progressive disclosure, returning a compact index, context around chosen anchors, and one batch of selected details - **added** — Added opaque 27-character search cursors that keep scope, options, and already-disclosed IDs in server-side state expiring after 15 minutes - **added** — Added save_memory MCP tool for recording explicit preferences, corrections, decisions, handoffs, and reusable lessons into the active project - **added** — Added a PreToolUse hook bridge that adds an automatic mem_search result as extra context when Claude Code or Codex performs native memory lookups - **added** — Added SessionStart memory-use instructions guiding agents to search before saving, keep notes concise, exclude credentials, and use work_state_write for to-do lists - **added** — Added an opt-in watcher that imports Markdown note folders - **changed** — MCP replies for search, context, selected records, corpus operations, server observations, events, and job lookups now return concise readable text instead of pretty-printed JSON envelopes - **changed** — Local and hosted MCP now share the same search engine and model-visible output for mem_search - **changed** — Under server runtime, local mem_search points callers to the hosted MCP connection instead of querying the local worker - **changed** — search, timeline, and get_observations descriptions now point agents to mem_search, which alone enforces the progressive disclosure sequence - **changed** — Worker and server errors are now short plain-language messages that do not echo raw transport payloads - **changed** — Calls to claude-mem's own search and context tools and native memory lookups are excluded from observation capture - **changed** — Explicit save_memory writes keep their receipt without generating a second observation of the same note - **changed** — The bundled mem-search skill was rewritten around mem_search guided and automatic modes - **changed** — Search bounds set: limit capped at 20 rows, maxDetails defaults to 3 with maximum 5, depth defaults to 2 with maximum 3, queries limited to 500 characters and 1 KiB UTF-8 - **changed** — Injected native memory lookup context is capped at 10,000 characters and framed as retrieved data that must not supply instructions ##### New: progressive memory search, curated tool replies, and native memory notes Claude-Mem 13.35.0 gives agents one memory search tool, `mem_search`, that discloses memory in bounded steps: a compact index, the context around chosen anchors, and then one batch of selected details. The local worker MCP and the hosted cmem.ai MCP run the same search engine and return the same model-facing text. Tool replies are now short, readable text written for the question being answered, so agents no longer receive raw JSON dumps. This release also adds `save_memory` for explicit notes, a hook bridge that supplements Claude Code and Codex native memory lookups, and an opt-in watcher that imports Markdown note folders. ###### `mem_search`: guided and automatic progressive disclosure - **Guided mode** (the default) labels each reply `mem-search step 1 of 3` (index), `step 2 of 3` (context around up to `maxDetails` chosen IDs), and `step 3 of 3` (one detail batch). Each reply ends with a readable next-call instruction and a short **Continue with:** cursor. Agents can stop early when the titles or context already answer the question. - **Automatic mode** (`mode: "auto"`) runs the same three bounded stages in one call using ranked lexical retrieval. It picks anchors by how many query terms appear in each index title, ignoring stop words and prompts. If no title matches, it retries once with the stop-word-stripped query. It makes no LLM calls. - **Opaque continuations.** A cursor is 27 characters (`ms_` plus 24 URL-safe characters). The search scope, the original options and the set of IDs already disclosed stay in bounded server-side state, which expires after 15 minutes. Agents no longer carry serialized search rows between calls. A cursor cannot be reused with changed options, and `selectedIds` must come from the previous reply. Expired or foreign cursors return a plain-language error that asks for a new query. - **Bounds.** `limit` is capped at 20 index rows, `maxDetails` defaults to 3 with a maximum of 5, and `depthBefore`/`depthAfter` default to 2 with a maximum of 3. Queries are limited to 500 characters and 1 KiB of UTF-8. - **One contract, local and hosted.** Local and hosted MCP share the same portable engine source and the same model-visible output in both modes. Under `CLAUDE_MEM_RUNTIME=server`, the local `mem_search` points callers to the hosted MCP connection and does not query the local worker. - `search`, `timeline` and `get_observations` remain available for older clients and advanced filters. Their descriptions now point agents to `mem_search`, and only `mem_search` enforces the progression. ###### Curated, purpose-specific tool replies - MCP replies for search, context, selected records, raw tool uses, corpus build/list/prime/query, server observations, events and job lookups now return concise readable text: indexes, selected evidence, write receipts and summaries. Internal HTTP data stays available to code. Model-facing replies no longer include pretty-printed JSON envelopes or duplicated `structuredContent`. - Authored JSON and code examples inside a memory's own prose are preserved when it is selected. Summary evidence keeps its edited-file references, and untitled server notes get useful labels plus a supported context follow-up. - Worker and server errors are short plain-language messages and do not echo raw transport payloads. - Retrieval no longer re-observes its own output. Calls to claude-mem's own search and context tools, plus native `memory_*` lookups, are excluded from observation capture, so searching memory does not create new memories about searching. An explicit `save_memory` write keeps its receipt without also generating a second observation of the same note. ###### `save_memory` and durable-note instructions - New `save_memory({ text, title?, project?, metadata? })` MCP tool for worker runtime. It records explicit preferences, corrections, decisions, handoffs and reusable lessons into the active _[Truncated at 4000 characters — full notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.35.0]_ ### v13.34.2 - Date: 2026-10-06 - Version: v13.34.2 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.34.2 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.34.2 - **fixed** — Remove worker regression that broke prompt-cache reuse for observer sessions on OpenAI-compatible HTTP providers like OpenRouter and Gemini by ceasing to prune observer conversation history before requests This patch removes a worker regression that broke prompt-cache reuse for observer sessions on the providers that share the OpenAI-compatible HTTP observer loop, such as OpenRouter and Gemini. ##### What was wrong Since v13.29.0 (PR #3151), the worker pruned the observer's conversation history before every request. Once a tool-use exchange fell out of the most recent eight messages, its payload was replaced in place with a short stub marked `pruned="true"`. That kept each request smaller, but it also rewrote messages the provider had already received. From the fifth observation of a session onward, every request changed an earlier message, so the conversation no longer started with the same bytes as the request before it. Providers that cache a prompt by its prefix could not reuse the cached conversation and had to read the rewritten part again as new input. ##### What changed The shared HTTP provider no longer prunes history. The import and both per-turn calls are gone: the one before each observation request and the one before each summary request. Within a generation, a message that has been sent is now sent again unchanged, so each request extends the previous one and the summary request still sees the original tool payloads. ##### What stays the same Requests are still bounded by the limits that were already in place: - The observer conversation is still recycled into a new generation when it reaches its size budget, which comes from the observer context window (`CLAUDE_MEM_OBSERVER_CONTEXT_WINDOW`) and the last reported context token count. - A context-overflow error from a provider still recycles the conversation and continues. - The output cap (`CLAUDE_MEM_OBSERVER_MAX_OUTPUT_TOKENS`) and the cleanup after a rejected request are unchanged. - Model routing, retries, and billing behavior are unchanged. Because old payloads are no longer shrunk, a generation reaches its size budget in fewer turns than it did in v13.29.0 through v13.34.1, and long sessions recycle more often. The effect on provider cost has not been measured in production, so this release makes no claim about savings. ##### Validation - `tests/history-pruning.test.ts` passes (9 tests). Its two new regression tests keep a deep copy of every request as it was sent. The first runs 40 observations and a summary and checks that each request begins with the previous request's messages, unchanged. The second drains 200 events across several bounded generations, checks the same thing within each generation, and confirms that request size stays under the bound. - 880 of the 881 tests in the 63 test files that cover the shared provider, the individual providers, and observer recycling pass. The one failure is a socket-timing assertion in `tests/worker/field-deadline-wire.test.ts`. It fails the same way on unmodified v13.34.1 and exercises the field-compression path, which this release does not change. - Root and viewer type checks, the postinstall allowlist guard, and the version-consistency and plugin-distribution tests on the built tree pass. `build-and-sync` succeeded, including a verified local worker restart on v13.34.2, and the built worker bundle no longer contains the pruning code. ### v13.34.1 - Date: 2026-10-06 - Version: v13.34.1 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.34.1 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.34.1 - **changed** — Update CMEM Pro installer and client promotions to display 30 Day Free Trial instead of up to 14 days across provider selection, installer completion, session and context banners, welcome hints, the viewer, and public documentation - **changed** — Restore public offer messaging to match the cloud's standard 30-day trial period The CMEM Pro installer and every client promotion now show **30 Day Free Trial**. This restores the public offer to match the cloud's standard 30-day trial and removes the shorter “up to 14 days” wording from provider selection, installer completion, session and context banners, welcome hints, the viewer, and public documentation. Trial URLs keep their existing source attribution, and the client still uses the trial expiration and account status returned by the cloud. Inference allowances, subscription and fallback behavior, paid billing disclosures, and provider settings are unchanged. The installer order remains the existing flow; the login-first web installation work is tracked separately. Validation: 58 existing installer OAuth, promotion, and gateway tests and 17 committed bundle/version and agent selection tests passed. Root and viewer typechecking, the postinstall allowlist guard, and build-and-sync passed, including a verified v13.34.1 local worker restart. Built CLI, worker, and viewer copy was checked before publication. ### v13.34.0 - Date: 2026-10-06 - Version: v13.34.0 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.34.0 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.34.0 - **added** — Add first-party memory integration for Pi with mem_search, mem_timeline, and mem_get_observations tools for progressive recall - **added** — Add first-party memory integration for DeepSeek Harness with mem_search, mem_timeline, mem_get_observations, mem_save, and mem_context tools - **added** — Add installation support for Pi and DeepSeek Harness through interactive installer that detects and preselects supported agents - **added** — Add native Pi extension install, status, and uninstall commands available from npx claude-mem pi - **changed** — Make installation follow the agents you actually use with interactive selection and agent detection - **changed** — Pi captures the persisted user prompt before tool results and summarizes once per turn, with only text captured and image payloads excluded from memory - **changed** — Pi automatic capture remains disarmed until the worker acknowledges the actual persisted user-entry ID for reliable recovery - **changed** — DeepSeek Harness uses one worker-managed transcript watch with plugin ingestion and summarization off by default - **changed** — Pi and DeepSeek Harness installation respects existing user configuration including DSH_HOME, transcript-watch paths, and CLAUDE_MEM_TRANSCRIPTS_ENABLED settings - **changed** — Pi and DSH use the configured worker address, including persisted settings and environment overrides - **fixed** — Give native user turns durable identities so a retry cannot create a second prompt or attach capture to the wrong turn - **fixed** — Reusing an entry ID for different cleaned prompt text is rejected to prevent conflicting retry bodies - **fixed** — Pi failed worker requests leave Pi usable with capture remaining disarmed until worker acknowledgment - **fixed** — Replaced transcript files in DeepSeek Harness cannot borrow the previous file's session ID, directory, or outstanding tool calls ##### New: Pi and DeepSeek Harness integrations Claude-Mem 13.34.0 adds first-party memory integrations for Pi and DeepSeek Harness, makes installation follow the agents you actually use, and gives native user turns durable identities so a retry cannot create a second prompt or attach capture to the wrong turn. ###### Pi - Install with `npx claude-mem install --ide pi`, then restart Pi. The self-contained ESM extension installs under `~/.pi/agent/extensions/claude-mem`; `PI_CODING_AGENT_DIR` is respected. - Use `mem_search`, `mem_timeline`, and `mem_get_observations` for progressive recall: search for useful IDs, inspect their surrounding timeline, and fetch only the records needed. - Compatible hosts capture the persisted user prompt before tool results, retain the real Pi session and tool-call identities, and summarize once per turn. Only text is captured; image payloads stay out of memory. - Failed worker requests leave Pi usable. Capture remains disarmed until the worker acknowledges the actual persisted user-entry ID. The extension can recover on that same entry after a temporary outage or unavailable branch data, without requiring a new user turn. - Private prompts and excluded projects suppress automatic context and capture. Switching sessions, forking, or changing the session tree clears the prior capture anchor. - Installation and `npx claude-mem pi status` confirm extension-file presence; they do not verify the Pi version or automatic capture. Pi 0.79.6 supports manual recall only. Automatic capture compatibility has been source-reviewed for Pi 1.0.2 and 1.0.4; other versions require a compatibility check and capture requires a compatible Claude-Mem worker. See [Pi capture compatibility and update guidance](https://github.com/thedotmack/claude-mem/blob/main/docs/pi-native-capture.md). ###### DeepSeek Harness - Install DSH and `pnpm`, then run `npx claude-mem install --ide dsh --dsh-profile web`. The default profile is `web`; `--dsh-profile` also supports an existing profile such as `tui` on an older host. - The bundled `@claude-mem/dsh` package installs through DSH's own profile and workspace commands. Restart DSH and start or restart the Claude-Mem worker after installation. - The native plugin injects checkout context before the first turn and provides `mem_search`, `mem_timeline`, `mem_get_observations`, `mem_save`, and `mem_context`. - Fetching observations by ID retains every requested record, including records that share the same text. A configured recall project still respects exclusion of the actual checkout. - Automatic capture uses one worker-managed transcript watch. Plugin ingestion and summarization stay off by default, preventing a second writer. New managed watches start at the end of existing transcripts rather than unexpectedly importing historical sessions. - Capture retains the real session-header ID, matches current and legacy tool-result formats, and restores directory and pending-tool context after a watcher restart. Replaced transcript files cannot borrow the previous file's session ID, directory, or outstanding tool calls. - Existing user-managed DSH watches remain authoritative. Installation respects the configured transcript-watch path and `DSH_HOME`, preserves an explicit `CLAUDE_MEM_TRANSCRIPTS_ENABLED=false`, and reports incomplete capture setup separately from successful plugin installation. - Pi and DSH use the configured worker address, including persisted settings and environment overrides. DSH recall can target a remote worker with `DSH_MEM_BASE_URL` or plugin configuration without starting a local worker for that remote address. ##### Installation improvements - The interactive installer asks which agents you use and preselects detected agents. Claude Code is the fallback when no supported agent is detected; its host-install prompt appears when Claude Code is selected and missing. - Pi and DeepSeek Harness appear in agent detection and CLI selection. Native Pi extension insta _[Truncated at 4000 characters — full notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.34.0]_ ### v13.33.0 - Date: 2026-10-06 - Version: v13.33.0 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.33.0 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.33.0 - **fixed** — The File Read Gate now works for marketplace installs by downloading the tree-sitter CLI executable at worker startup in the background - **added** — Downloaded tree-sitter CLI executables are verified against a SHA-256 hash pinned for version 0.26.9 before execution - **changed** — The File Read Gate now blocks whole-file reads only for code files of 32 KB or larger instead of 19 KB - **changed** — The MCP server now checks for the tree-sitter CLI executable on every call instead of caching the first lookup - **fixed** — Claude-mem's read-only tools now run in plan mode without permission prompts for the 14 tools that declare themselves read-only - **removed** — The File Read Gate eval suite no longer ships inside every plugin install and now lives in the evals/read-gate/ directory in the repository - **added** — The sync e2e script's CMEM_SYNC_E2E_ALLOW_REMOTE_HUB now accepts a comma-separated list of exact hostnames for production smoke runs ##### The File Read Gate now works for marketplace installs v13.32.0 turned the File Read Gate on by default, but it never switched on for anyone who installed claude-mem from the plugin marketplace. The gate only blocks a Read where `smart_outline` can parse the file, and parsing needs the tree-sitter CLI executable that tree-sitter-cli's install script downloads. Claude Code installs a plugin's dependencies with install scripts turned off, and the Setup hook that could have downloaded it doesn't run on install, update or normal startup. So `smart_search`, `smart_outline` and `smart_unfold` answered "Could not parse" for every file, and the gate never blocked anything. (#4551) - **The worker now downloads the tree-sitter CLI.** Every install starts the worker, so at startup it fetches the executable into its own plugin folder. The download runs in the background, so the worker never waits on it. In a clean-room marketplace install, the executable was in place 5 seconds after the worker started. If the download fails, the worker logs it and tries again on its next start, or you can run `npx claude-mem repair`. - **Only a verified executable runs.** `tree-sitter-cli` is pinned to exactly `0.26.9`. A downloaded executable must match the SHA-256 pinned for that version and your platform before it runs at all. It's moved into place only after it answers `--version`, so a failed, killed or timed-out download never leaves a broken executable behind. - **Running sessions pick it up.** The MCP server used to remember its first lookup of the executable. A session that started before the download kept answering "Could not parse", even after the gate began blocking Reads and sending Claude to those tools. It now checks again on every call. ##### The gate now blocks only code files of 32 KB and up A whole-file `Read` is now blocked only when the code file is **32 KB or larger**. Code files from 1,500 bytes up still get their observation timeline added as context, as before. (#4553) Blocking a Read isn't free. Claude saves the tokens of the file it doesn't read, but it takes extra turns to get what it needs, and every turn re-reads the whole context. A new eval case on a 49 KB file measured the same question with the gate on and off (#4552). The table compares the cost of a run with the gate on against the gate off: | File | Sonnet 5.5 | Opus 5.5 | | --- | --- | --- | | 49 KB, blocked | **-38%** | **-30%** | | 19 KB, blocked (v13.32.0) | -6% | **+20%** | | 19 KB, not blocked (this release) | -1% | 0% | Sonnet 5.5 ran 3 times per case and Opus 5.5 twice. Edits still work after a block: in all 5 edit runs on the 49 KB file, the whole-file Read was blocked, Claude used Grep and a 15-line targeted Read instead, and the Edit changed only the intended line. The viewer's **Block full-file reads** toggle and the docs (File Read Gate → Size Thresholds) now say "code files of 32 KB and up". ##### Fixes - **Plan mode:** claude-mem's read-only tools now run in plan mode without a permission prompt. Before, `-p` sessions refused them outright. Plan mode skips the prompt only for tools that declare themselves read-only, and these 14 now do: `important_workflow`, `search`, `timeline`, `get_observations`, `get_tool_uses`, `work_state_read`, `session_start_context`, `observation_search`, `observation_context`, `observation_generation_status`, `smart_search`, `smart_outline`, `smart_unfold` and `list_corpora`. That includes every tool the File Read Gate sends Claude to. Tools that write, such as `work_state_write`, still ask. (#4551) - **Smaller installs:** the File Read Gate eval suite (cases, graders, scaffold scripts and a 20 KB fixture) no longer ships inside every plugin install. It now lives in `evals/read-gate/` in the repository. (#4551) ##### Tests and tooling - `npm run eval:read-gate` adds a gate-on/gate-off pair on a 49 KB fixture, per-run token and cost accounting, and a "same question, gate ON vs OFF" table for each fixture. (#4552 _[Truncated at 4000 characters — full notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.33.0]_ ### v13.32.0 - Date: 2026-10-06 - Version: v13.32.0 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.32.0 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.32.0 - **added** — File Read Gate that blocks full-file reads when Claude Code attempts to read code files that claude-mem already has observations about, providing cheaper alternatives like smart_outline and smart_unfold instead - **added** — Opt-in worker idle exit feature via CLAUDE_MEM_IDLE_EXIT_SEC environment variable to gracefully shut down the worker after specified seconds of inactivity - **changed** — PreToolUse Read hook is now synchronous again with a 15 second cap and 3 second worker budget, failing open if the worker is slow or missing - **changed** — File Read Gate can be disabled via CLAUDE_MEM_FILE_READ_GATE_ENABLED setting in ~/.claude-mem/settings.json, environment variable, or viewer's Block full-file reads toggle - **fixed** — Worker processing-status broadcast and logging no longer flood when a signed-out observer cycles one batch - **fixed** — Observations from the standalone watcher are now spooled in transcripts - **fixed** — Declined observation lines are kept for retry in transcripts - **fixed** — Checkpoints reset correctly after an atomic file replacement in transcripts - **fixed** — Parents of not-yet-created paths are now watched in transcripts - **fixed** — Distinct summaries are kept and nullable titles deduplicated in import - **fixed** — Exported custom session titles are preserved in import - **fixed** — Malformed imported file metadata is isolated in file context - **fixed** — Direct settings counts are validated before querying memory in context - **fixed** — Multiline Go receiver identities and empty-query relevance are preserved in smart read - **fixed** — State fields named like prototype properties are preserved in work state - **fixed** — Deletions are honored in pending pages and recreations in viewer - **fixed** — Restart recovery requests and response bodies are bounded in viewer - **fixed** — Superseded log responses are discarded after clearing in viewer - **fixed** — Session catalog failures recover through an explicit retry in viewer - **fixed** — Codex install command uses the valid --ide codex-cli flag in docs ##### The File Read Gate is back, on by default When Claude Code tries to `Read` a whole code file that claude-mem already has observations about, the Read is now blocked. Claude gets the file's observation timeline instead, along with cheaper ways to get what it needs: - **Current code:** `smart_outline` for the file's symbols and line numbers, then `smart_unfold` for the ones it needs. - **Past work:** `get_observations` for the observations listed. - **Exact lines, for example before an Edit:** a targeted `Read` with `offset`/`limit`. Partial reads are always allowed, and they satisfy Edit's read-before-edit rule, so editing never deadlocks. The block was first built in April, but it never shipped. It broke Edit, so the same day it was softened to "allow + context", and v12.0.0 shipped that version. In July the hook was made asynchronous, and an asynchronous hook can't block anything. This release brings the block back, with the Edit problem solved by letting targeted Reads through. (#4549) **When it blocks.** Every one of these must hold: - It's the Claude Code main session (not Codex, Kimi, Qwen Code or subagents). - The file is code that `smart_outline` parses (not markdown, YAML, TOML or JSON). - The file is inside the workspace, by the same symlink-aware rule the smart tools use. - The file is at least 1,500 bytes, and its newest observation is newer than the file. - The Read would return the whole file. - The tree-sitter CLI that powers the smart tools is installed. **Turn it off** with `"CLAUDE_MEM_FILE_READ_GATE_ENABLED": "false"` in `~/.claude-mem/settings.json`, the env var of the same name, or the viewer's **Block full-file reads** toggle (Advanced → Save). With the gate off, Reads go through and the timeline is still added as context. `CLAUDE_MEM_DISABLE_FILE_CONTEXT=1` turns off the whole hook. **Hook changes:** - The PreToolUse `Read` hook is synchronous again (15 s cap, 3 s worker budget). It fails open: a slow or missing worker never blocks a Read. - It no longer answers `allow`, so Claude Code's own permission prompts apply as usual. **If `smart_outline` says "Could not parse" for every file,** your install's tree-sitter CLI was never provisioned. Run `npx claude-mem repair`. Until then the gate stays dormant rather than sending Claude to tools that can't parse. **Proof:** `npm run eval:read-gate` runs real Claude Code against two isolated, seeded workers, one with the gate on and one with it off. - **Gate on:** every whole-file Read was denied and no run ever received the whole file. Answers were correct via `smart_outline`/`smart_unfold`, and edits changed only the intended line. - **Gate off:** Reads went through normally. - Every verdict passed on both `claude-sonnet-5-5` (3 runs per case) and `claude-opus-5-5` (2 runs per case). ##### Also new - **Opt-in worker idle exit:** set `CLAUDE_MEM_IDLE_EXIT_SEC` to have the worker shut down gracefully after that many seconds with no session activity, queued work, host traffic or AI calls. The next hook starts it again. The default, `0`, keeps today's behavior. (#4524) ##### Fixes - **Worker:** the processing-status broadcast and its log no longer flood when a signed-out observer cycles one batch. (#4525) - **Transcripts:** - observations from the standalone watcher are spooled (#4531) - declined observation lines are kept for retry (#4541) - checkpoints reset correctly after an atomic file replacement (#4545) - parents of not-yet-created paths are watched (#4544) - **Import:** - distinct summaries are kept and nullable titles deduplicated (#4536) - exported custom session titles are preserved (#4540) - **File context:** malformed imported file metadata is isolated. (#4538) - **Context:** direct settings counts are validated before querying memory. (#4539) - **Smart read:** multiline Go receiver identities and empty-query relevance are preserved. (#4546) - **Work state:** state fields named like prototype properties are preserved. (#4 _[Truncated at 4000 characters — full notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.32.0]_ ### v13.31.1 - Date: 2026-10-06 - Version: v13.31.1 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.31.1 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.31.1 - **fixed** — Cloud sync uploads are no longer blocked by Supabase's Cloudflare firewall by compressing uploads server-side and decoding them in the cmem-sync function - **changed** — Worker no longer treats HTML 401/403 responses as bad tokens, instead retrying them as ordinary failures - **changed** — Worker moves installations given the direct Supabase sync URL during setup back to https://sync.cmem.ai automatically - **changed** — smart-read keeps more symbols across C++, Haskell, Go, Rust, Zig, Swift, Kotlin, Ruby, PHP, Lua, TOML, JS and Python - **changed** — smart-read recognizes source file extensions regardless of case - **fixed** — search and smart-search keep substring reads when FTS probing can't write - **fixed** — search and smart-search honor observation filters during semantic hydration - **fixed** — search and smart-search preserve multi-category selections across every search strategy - **fixed** — search and smart-search rank matches by their full relevance score - **fixed** — context reads assistant transcript rows that contain only whitespace - **fixed** — context encodes every non-alphanumeric character in the cwd - **fixed** — context discards renders after a cache variant is torn down - **fixed** — context counts retained reinforcements once - **fixed** — viewer and HTTP bound data feed pagination before SQLite runs - **fixed** — viewer and HTTP reject truncated row identities - **fixed** — viewer and HTTP prevent one failed SSE client from affecting healthy ones - **fixed** — viewer and HTTP recover malformed observation metadata - **fixed** — viewer and HTTP preserve saved settings while loading - **fixed** — non-finite retry-after hints are ignored ##### Cloud sync: uploads no longer blocked by Supabase's firewall Since the move to Supabase, Supabase's Cloudflare firewall rejected some memory uploads based on their content, answering with an HTML "Attention Required!" page. The worker read that as an invalid token: it paused sync, told users to reconnect (which couldn't help), and left the rest of their upload queue stuck behind the blocked batch. - **Server side (already live, no update needed):** `sync.cmem.ai` now compresses uploads before forwarding them, and the `cmem-sync` function decodes them, so they get through the firewall. - **Worker:** an HTML 401/403 is no longer treated as a bad token. It's an ordinary failure that retries. - **Worker:** installs that were given the direct Supabase sync URL during setup are moved back to `https://sync.cmem.ai` on their own. ##### Other fixes - **smart-read:** keeps more symbols across C++, Haskell, Go, Rust, Zig, Swift, Kotlin, Ruby, PHP, Lua, TOML, JS and Python, and recognizes source file extensions regardless of case. - **search and smart-search:** - substring reads are kept when FTS probing can't write - observation filters are honored during semantic hydration - multi-category selections survive every search strategy - matches are ranked by their full relevance score - **context:** - reads assistant transcript rows that contain only whitespace - encodes every non-alphanumeric character in the cwd - discards renders after a cache variant is torn down - counts retained reinforcements once - **viewer and HTTP:** - data feed pagination is bounded before SQLite runs - truncated row identities are rejected - one failed SSE client no longer affects healthy ones - malformed observation metadata is recovered - saved settings are preserved while loading - **Reliability:** - non-finite `retry-after` hints are ignored - spool tool ids are namespaced by session and platform - the first observation's session owner is kept - the MCP server loads in the launcher process - plugin roots given as relative paths become absolute at install - log follow reads are bounded - watcher configuration shapes that would break it are rejected - knowledge saves require a successful SDK result - exports keep the last good file when a write partly fails ### v13.31.0 - Date: 2026-10-05 - Version: v13.31.0 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.31.0 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.31.0 - **changed** — Sessions start without waiting on SQLite history reads or cloud sync, reducing SessionStart hook latency from 3 seconds to under 100 ms on typical databases - **changed** — Newest memories are retrieved from date-ordered indexes instead of fetching and sorting all observations, reducing query time from 0.8–1.7 s to 4 ms - **changed** — Project-alias lookups use covering indexes to answer from index metadata instead of loading rows, reducing pages read from 7,499 to 355 - **changed** — SessionStart context is built from local database immediately with cloud sync running in the background, making the local database the source of truth - **changed** — Cowork plugin skips cloud reads from cmem.ai when claude-mem is installed locally, only using cloud reads in Cowork's cloud containers - **added** — iFlytek Spark preset for the OpenAI-compatible provider with default model spark-x2.5 - **fixed** — Cloud sync no longer retries before the server's Retry-After minimum after jitter - **fixed** — Full-text search is no longer disabled by interrupted FTS capability probes or probes from other connections - **fixed** — Field compression preserves the observation's context - **fixed** — Interrupted SSE responses and rejected early-stop cancellations no longer leave streams locked - **fixed** — SSE clients are removed when Bun closes their socket - **fixed** — Logs over 10 MiB with no newlines no longer cause the tail reader to loop forever and block the worker - **fixed** — Failed pagination requests in the viewer now release the loading state and display the error - **fixed** — Parser drops array entries that decode to whitespace instead of storing them as blank facts - **fixed** — Smart file outlines keep multiline imports - **fixed** — Smart file outlines assign methods to the correct class - **fixed** — Smart file outlines include generator functions ##### Sessions start without waiting A new session no longer waits on SQLite reading a project's whole history, or on cloud sync. On a 1.2 GB database the claude-mem SessionStart hook took about 3 seconds (up to 44 s at worst). The queries behind it now read a few hundred pages instead of tens of thousands, the precomputed context file is used even with cloud sync on, and nothing at session start waits on the network. ###### Performance - **Newest memories come straight from an index.** SessionStart used to fetch every observation and summary in the project, including worktrees merged into it, and sort them all to keep the newest 50. On the database we measured that was about 21,700 rows (63 MB) per session start, and 0.8–1.7 s whenever those pages were not in memory. New indexes keyed on project and date (schema v63) let it read the newest rows for each project key and stop. The results are identical, and the query takes about 4 ms. (#4427) - **Project-alias lookups no longer load rows.** Every context render resolves which stored project keys belong to the checkout. That lookup loaded each merged row just to read its project name: 7,499 pages for 31 keys. Covering indexes (schema v64) answer it from the index: 355 pages, 9 ms. (#4429) - **Local first with cloud sync on.** The worker builds SessionStart context from the local database straight away. The pull from the sync hub still runs, but in the background, so a slow or unreachable hub never delays a session. The precomputed SessionStart context file no longer waits for a Realtime connection: the local database is the source of truth, and every change sync applies refreshes the file. (#4427) - **Cowork plugin skips the cloud read when claude-mem is installed locally.** The `claude-mem-cowork` hook no longer fetches context from cmem.ai, at session start or for agent prompts, on a machine where the local claude-mem hook already injects it. Cowork's cloud containers still read from cmem.ai. (#4427) ###### Features - **iFlytek Spark preset** for the OpenAI-compatible provider (Astron MaaS, default model `spark-x2.5`). (#4379) ###### Fixes - **Cloud sync** no longer retries before the server's Retry-After minimum after jitter. (#4383) - **Full-text search:** an interrupted FTS capability probe, or one seen from another connection, no longer turns off full-text search. (#4385) - **Field compression** keeps the observation's context. (#4403) - **Streams:** an interrupted SSE response, or a rejected early-stop cancellation, no longer leaves its stream locked (#4382). SSE clients are removed when Bun closes their socket (#4394). - **Logs:** a log over 10 MiB with no newlines no longer makes the tail reader loop forever and block the worker. (#4393) - **Viewer:** a failed pagination request releases the loading state and shows the error. (#4387) - **Parser:** array entries that decode to whitespace are dropped instead of stored as blank facts. (#4397) - **Smart file outlines** keep multiline imports (#4409), assign methods to the right class (#4406), and include generator functions (#4419). ### v13.30.1 - Date: 2026-10-05 - Version: v13.30.1 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.30.1 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.30.1 - **fixed** — Claude Code continue, resume, and resume commands no longer inject a fresh timeline into restored conversations, preserving prompt-cache reuse and conversation context integrity - **changed** — Worker startup and context injection now use separate SessionStart matchers, with resume starting the worker asynchronously while only startup, clear, and compact run the synchronous timeline hook - **fixed** — Claude Code adapter now preserves the SessionStart source and context handler returns empty context block for resume operations before accessing project settings and cached timelines - **fixed** — Resumed conversations no longer receive fresh timeline context or terminal timeline, even when cached model and colored timelines exist or terminal output is enabled ##### Continue and resume preserve the restored conversation Claude Code `--continue`, `--resume`, and `/resume` no longer print or inject a fresh claude-mem timeline into a conversation that is being restored. Reinjecting newly rendered startup context changed the conversation's prompt prefix and disrupted prompt-cache reuse. This patch keeps the existing conversation context intact while retaining worker startup and memory capture. (#4423) ###### Fixes - **Skip timeline injection on resume.** Worker startup and context injection now have separate SessionStart matchers. Resume still starts the worker asynchronously, while only startup, clear, and compact run the synchronous timeline hook. - **Honor the session source throughout the hook.** The Claude Code adapter preserves the SessionStart source, and the context handler returns an empty context block for resume before accessing project settings, cached timelines, the local worker, or the shared server. This also covers older hook registrations that still invoke the context handler on resume. - **Suppress both copies of the timeline.** Resumed conversations receive neither fresh timeline context nor a terminal timeline, including when cached model and colored timelines already exist or terminal output is enabled. - **Keep context injection where it is needed.** New sessions, clear, and compact retain model and terminal context. The resume guard applies to Claude Code; Codex context behavior is unchanged. ###### Validation - 266 focused tests passed across SessionStart adapters and matchers, context handlers, cached timelines, server runtime, distribution, hook lifecycle, and related context handling. - All eight CI checks passed on the fix, including Linux and Windows builds, Chroma lifecycle checks, sync services, clean-room dependency checks, and server runtime integration tests. - Build, TypeScript, and hook I/O checks passed. The rebuilt worker bundle was checked directly: a Claude Code resume returns empty SessionStart context with no timeline. **Full Changelog**: https://github.com/thedotmack/claude-mem/compare/v13.30.0...v13.30.1 ### v13.30.0 - Date: 2026-10-04 - Version: v13.30.0 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.30.0 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.30.0 - **changed** — Hooks save each event to disk and return immediately without waiting on the worker or starting it - **changed** — SessionStart context is prepared in advance by the worker and read from cache instead of waiting on the worker or cloud pull - **changed** — Observer prompts now open with the same block of fixed instructions to enable provider prompt cache reuse - **added** — Observer requests to OpenRouter now include session_id and trace labels with trace_id, trace_name, generation_name and claude_mem_version - **changed** — User prompts no longer get a separate observer request and are included with the next observation or summary instead - **changed** — OpenRouter and OpenAI-compatible observer requests now stream to avoid timeout and double billing on slow replies - **changed** — Worker startup phases are reported via GET /api/ready endpoint instead of being guessed through polling - **changed** — MCP corpus prime and query calls can stream with heartbeat to support longer execution times up to 15 minutes - **changed** — Cloud sync live updates now use Supabase Realtime channel instead of sync hub WebSocket - **fixed** — Observer thinking is now correctly disabled on the Claude path by using the proper SDK option - **fixed** — Search functionality has been fixed - **fixed** — File context handling has been fixed - **fixed** — Hooks functionality has been fixed - **fixed** — CLI has been fixed - **fixed** — Very large transcript handling has been fixed - **fixed** — Sign-in on Linux and Windows has been fixed ##### Hooks stop waiting on the worker, and the observer costs less Claude Code no longer waits on the claude-mem worker in the middle of a session: hooks save each event to disk and return at once, and SessionStart reads context the worker prepared ahead of time. The observer that writes your memories also costs less. A user prompt no longer gets a model call of its own, the observer's prompts now start with the same fixed instructions so provider prompt caches can reuse them, OpenRouter requests carry session and trace labels that keep a session on the provider holding its cache, observer thinking on the Claude path is really off, and a slow reply is waited for instead of being paid for twice. The release also fixes search, file context, hooks, the CLI, very large transcripts, and sign-in on Linux and Windows. ###### Features - **Hooks save and return.** The observation, file-edit, Stop and SessionEnd hooks write each event to a file under `~/.claude-mem/state/hook-spool/` and exit, without waiting on the worker or starting it. The worker picks the files up within moments, and an event delivered twice replaces its file instead of being stored twice. Files still unprocessed after 7 days move to `hook-spool/expired/` and are logged. This replaces the SessionEnd replay queue. (#4368) - **SessionStart context is ready before you start.** The worker prepares SessionStart context in `~/.claude-mem/state/context-cache/`, refreshing it about 2 seconds after anything that could change it, so a new session reads a file instead of waiting on the worker or on a cloud pull of up to 1.5 seconds. A missing or stale (over 24 hours old) file, or a context showing an observer or sync health notice, falls back to the live path. With cloud sync on, the file is used only while live updates are connected and caught up, so a memory deleted on another device is never served from it. (#4368, #4370) - **Observer prompts that providers can cache.** A provider's prompt cache (OpenRouter's, or the cmem.ai gateway's) can only reuse the part of a prompt that starts exactly as before. The observer's first and follow-up prompts now both open with the same block of fixed instructions, which depends only on the mode, followed by the session's context, the user's request and the follow-up text. In the code mode, two sessions' prompts now share their first ~7,260 characters, up from 422 (and from none between a first and a follow-up prompt). Only the order changed, plus one word ("below" became "above") in 33 modes, and the Claude SDK and Codex paths open the same way. (#4415) - **Session and trace labels on OpenRouter requests.** Observer requests that reach OpenRouter, directly or through the cmem.ai gateway, now include a `session_id` (a one-way SHA-256 hash of the Claude Code session id) and a `trace` with a random `trace_id` per observer conversation, `trace_name` `claude-mem observer`, a `generation_name` naming the request (`init`, `observation`, `summary`, `field_compression` or `telegram_wrapup`) and `claude_mem_version`. OpenRouter uses the session id to keep a session on the provider that holds its prompt cache, and OpenRouter Broadcast maps the labels to PostHog's `$ai_session_id`, `$ai_trace_id` and `$ai_span_name`. No path, project name or text you wrote is included, and custom base URLs and `openai-compatible` endpoints get neither field. (#4418) - **One fewer observer call per prompt.** A user prompt used to get an observer request of its own, which nearly always came back as "nothing to record": a full prompt for a nine-token reply. The prompt now goes out with the next observation or summary, in that event's single request, for the HTTP providers and the Claude SDK alike. Set `CLAUDE_MEM_OBSERVE_BARE_PROMPTS=true` (default `false`) to bring back the separate request. (#4336) - **Slow replies are waited for, not paid for twice.** OpenRouter and OpenAI-compatible observer requests now stream behind the scenes, so a slow but working reply is k _[Truncated at 4000 characters — full notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.30.0]_ ### v13.29.0 - Date: 2026-10-03 - Version: v13.29.0 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.29.0 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.29.0 - **added** — Work state tools `work_state_write` and `work_state_read` allow agents to maintain a canonical to-do list across sessions - **added** — SessionStart context now opens with work state rule and every open item with timestamp of last change - **added** — New `openai-compatible` provider enables observer to run against any OpenAI `/chat/completions` endpoint - **added** — Provider presets for nvidia-nim, deepseek, groq, together, ollama, lmstudio, vllm, orcarouter, opencode-go, opencode-zen, minimax, minimax-cn, api-route and opper - **added** — Codex subscription provider support - **added** — Kimi Code and Oh My Pi support - **added** — Opt-in quota fallback for providers - **added** — `CLAUDE_MEM_ALLOWED_ORIGINS` configuration for allowing additional host names to access the worker - **added** — Work state entries stored in new append-only `work_state_entries` database table - **changed** — `CLAUDE_MEM_LLM_TIMEOUT_MS` default increased from 30000 to 180000 milliseconds - **changed** — `CLAUDE_MEM_FIELD_OPTIMIZE_TIMEOUT_MS` now defaults to 180000 milliseconds instead of fixed 30 seconds - **changed** — OpenRouter default model changed from `xiaomi/mimo-v2-flash:free` to `cohere/north-mini-code:free` - **changed** — Subagent observations excluded from SessionStart by default with new `CLAUDE_MEM_CONTEXT_MAIN_AGENT_ONLY` setting - **changed** — UserPromptSubmit hook timeout in Claude Code reduced from 60 to 15 seconds - **changed** — Claude-mem hooks no longer exit with code 2 on error, allowing sessions to continue without memory instead of failing - **changed** — Work state lists scoped to primary project key and visible across worktrees like memory - **fixed** — Antigravity hook configuration now writes in correct named-hook schema format - **fixed** — Worker now rejects requests with unknown host names as DNS-rebinding guard - **fixed** — Various fixes across capture, search, worker and Windows - **deprecated** — Retired OpenRouter model `xiaomi/mimo-v2-flash:free` now fails with `model_unavailable` error ##### The agent keeps its to-do list in claude-mem Every session now opens with a work-state section ahead of memory: a rule telling the agent to use claude-mem's `work_state_write` and `work_state_read` tools as its canonical to-do list, then whatever is still open in the project. Claude Code gives Claude 5 models no native to-do tool, so until now nothing recorded what was in progress or what was left when a session ended. The rest of the release adds an `openai-compatible` provider with presets, a Codex subscription provider, Kimi Code and Oh My Pi support, an opt-in quota fallback, and fixes across capture, search, the worker and Windows. Several defaults changed; see **Upgrade notes**. ###### Work state - **Two MCP tools.** `work_state_write` appends one entry to a named list (fields capped at 2,000 characters as JSON) and replies with what is still open in that list. `work_state_read` returns every open item, or one list, and adds done and dropped items when `includeClosed` is true. (#4340) - **Lists, items and state.** An entry with a `task` field is a to-do item with a `status` of `todo`, `doing`, `done` or `dropped`; any other field is state on the list. The latest value of each key wins, `null` clears a key, and `"status": "done"` closes the list. (#4340) - **SessionStart leads with it.** Context opens with the rule and every open item, each with how long ago it last changed, capped at 3,000 characters (806 when nothing is open); memory is fitted into what remains of the 10,000-character limit. The welcome hint for a project with no observations gets the same lead; the colored terminal preview does not. (#4340) - **Scoped like memory.** Writes land under the checkout's primary project key and reads cover every key the checkout reads, so a list started in the main checkout also shows in its worktrees. Writes from projects matched by `CLAUDE_MEM_EXCLUDED_PROJECTS` are not saved. (#4340) - **Kept in the database, not the repo.** Entries go to a new append-only `work_state_entries` table (schema v61), so lists never conflict on merge but are not in git, and reads and writes need the worker. The server runtime's SessionStart does not read this table yet. (#4340) ###### Upgrade notes - **Observer deadline raised to 3 minutes.** `CLAUDE_MEM_LLM_TIMEOUT_MS` now defaults to `180000` (was `30000`), and the new `CLAUDE_MEM_FIELD_OPTIMIZE_TIMEOUT_MS` for oversized-field condensation (a fixed 30 seconds before) defaults to the same. A `settings.json` holding exactly the old `30000` is moved once; any other value is kept. (#4278, #4287, #4136) - **New OpenRouter default model.** OpenRouter retired `xiaomi/mimo-v2-flash:free`, so the default is now `cohere/north-mini-code:free`, and a stored `CLAUDE_MEM_OPENROUTER_MODEL` equal to the retired id is rewritten once when the base URL is blank or openrouter.ai. A retired or unknown model now fails with a `model_unavailable` error that names the setting. (#3662) - **Subagent observations stay out of SessionStart.** `CLAUDE_MEM_CONTEXT_MAIN_AGENT_ONLY` (default `true`) leaves rows that carry both an agent id and an agent type out of the SessionStart window, in the worker and the server runtime. Search, timeline and `get_observations` still return them; set it to `false` for the old behavior. (#3310, #4290) - **Hooks never block a session.** No claude-mem hook exits 2 any more, so an unexpected error or a worker outage no longer drops your prompt, denies a tool call or re-wakes Stop; the session continues without memory. After `CLAUDE_MEM_HOOK_FAIL_LOUD_THRESHOLD` (default `3`) unreachable-worker hooks in a row you get one notice per session to run `npx claude-mem restart`, and Claude Code hooks other than Setup exit 0 even when the plugin scripts are missing. (#2892, #3168, #3431) - **UserPromptSubmit gets 15 seconds in Claude Code.** The hook timeout drops from 60 to 15 seconds, and session init spends one budget, `CLAUDE_MEM_SESSION_INIT_TIMEOUT_MS` (10 seconds; 7 on Windows, where _[Truncated at 4000 characters — full notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.29.0]_ ### v13.28.0 - Date: 2026-09-26 - Version: v13.28.0 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.28.0 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.28.0 - **fixed** — Non-interactive installs no longer abort on 'provider must be explicit' and now complete successfully - **changed** — Fresh non-interactive installs with no --provider now default to Anthropic plan (local memory) instead of requiring explicit provider selection - **changed** — Existing configs now preserve their saved provider during updates, preventing CMEM Pro installs from switching to another provider - **changed** — Saved personal providers (gemini, openrouter) are now validated against usable keys in ~/.claude-mem/settings.json or environment variables instead of being assumed - **added** — Non-interactive installs now print an optional sign-in link as the last output line for agents to relay to users - **changed** — Interactive OAuth polling now respects the pairing's expires_in value, capped at 30 minutes (4 minutes when server reports none), instead of using a fixed short budget - **fixed** — Non-interactive runs that reuse a saved account-backed provider no longer open a browser or poll until pairing expires - **changed** — Install summary Account line now accurately reflects login status with messages like 'OAuth login complete', 'Kept existing account (no login this run)', or 'Not required (local provider / host observer)' - **added** — OAuth start failures are now classified with error labels: http_error, network, timeout, or bad_body - **added** — New telemetry event installer_oauth_start_failed with outcome, interactive, and phase parameters - **added** — New telemetry event installer_oauth_deferred tracking deferred sign-in for non-interactive installs - **changed** — install_completed event now includes provider_source parameter with values: flag, default, persisted, or prompt - **changed** — installer_oauth_timeout event now includes phase parameter indicating login or enrollment - **fixed** — Installer scrubber now drops persisted key values before any telemetry event leaves the machine - **changed** — Documentation updated to explain that local installs contact cmem.ai only once at signup to create sign-in link, with product telemetry as a separate opt-out channel ##### Non-interactive installs now finish, and capture the signup `npx claude-mem install` run without a TTY (an AI agent, CI, a script) used to stop on "provider must be explicit". It now completes on its own and still gives the user a way to sign in afterwards. ###### Installer - **Provider resolves instead of aborting.** A fresh non-interactive install with no `--provider` defaults to your Anthropic plan (local memory). An existing config keeps its saved provider, so `npx claude-mem update` never flips a CMEM Pro install to something else. - **Saved personal providers are validated, not assumed.** A kept `gemini` / `openrouter` provider needs a usable key: saved in `~/.claude-mem/settings.json`, or exported in the environment. A saved CMEM gateway config still requires its saved key, because the worker locks that tuple to the key on disk (an exported replacement base URL and key together are accepted). - **Deferred sign-in link.** Every non-interactive install that skipped sign-in prints an optional sign-in link as its last line, after the success line, so an agent relaying the output can show it to the user. It is best-effort, never changes the exit status, and is skipped when `CI` is set. - **30-minute browser sign-in wait.** Interactive OAuth polling now honours the pairing's `expires_in` (capped at 30 minutes; 4 minutes when the server reports none) instead of a fixed short budget. - **Persisted providers skip the blocking OAuth gate.** A non-interactive run that reuses a saved account-backed provider no longer opens a browser and polls until the pairing expires. - **Accurate install summary.** The `Account:` line reflects whether a login actually ran: `OAuth login complete`, `Kept existing account (no login this run)`, or `Not required (local provider / host observer)`. - **Provider error labels.** OAuth start failures are classified as `http_error` / `network` / `timeout` / `bad_body`; an abort that fires while the 2xx body is still streaming is a `timeout`, not `bad_body`. ###### Telemetry - New events: `installer_oauth_start_failed` (`outcome`, `interactive`, `phase`: login / deferred) and `installer_oauth_deferred` (`interactive`, always `false`). - `install_completed` gains `provider_source`: `flag` / `default` / `persisted` / `prompt`. - `installer_oauth_timeout` gains `phase` (login / enrollment). - The installer scrubber drops persisted key values before any event leaves the machine. ###### Privacy note Local installs contact cmem.ai once, at signup, to create the sign-in link. Nothing else is sent to cmem.ai. Product telemetry is a separate, opt-out channel (`npx claude-mem telemetry`). The public docs, the `/how-it-works` skill, and the installer summary line now all say this plainly. ###### Docs - Installation, CMEM Pro headless, Cursor, and Telemetry pages updated for the non-interactive flow, the deferred link, and the new events. **Full Changelog**: https://github.com/thedotmack/claude-mem/compare/v13.27.1...v13.28.0 ### v13.27.1 - Date: 2026-09-26 - Version: v13.27.1 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.27.1 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.27.1 - **fixed** — Grok Bot live INDEX lists the seat's own rows first, with each seat's 80-row zz-claude-mem-inject.md showing that seat's project rows before house-wide rows, and house query skipped when the seat fills the window - **fixed** — Seat self-saves show up in the INDEX by including rows saved through POST /api/memory/save in the seat query and triggering an INDEX refresh on successful manual save - **changed** — Agent cost report now reads GitHub merged-PR wins source as read-only ##### Fixes - **Grok Bot live INDEX lists the seat's own rows first** (#4240). Each seat's 80-row `zz-claude-mem-inject.md` now lists that seat's project rows before any house-wide rows; house rows only fill the remaining slots, and the house query is skipped when the seat fills the window. - **Seat self-saves show up in the INDEX.** Rows saved through `POST /api/memory/save` (for example Grok Bot `grok-seat-save`) were excluded by the concept filter; the seat query now includes them, and a successful manual save triggers an INDEX refresh. ##### Also in this range - Agent cost report: read-only GitHub merged-PR wins source (#4241). ### v13.27.0 - Date: 2026-09-26 - Version: v13.27.0 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.27.0 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.27.0 - **added** — Agent cost report skill rebuilt with transcript-based pricing using OpenRouter list prices, with support for Claude Code and Codex tokens labeled as estimated - **added** — Default reporting window set to last 7 full days in PT with single-session and project scopes supported - **added** — Self-contained timing-style reports generated in HTML, PDF, JSON, CSV, and evidence JSON formats with hero view, win vs mistake timelines, cost ribbon, donut chart, day chart, and folded details - **added** — Behavior metrics tracking including human/bot tagger, frustration episodes, Frustration Arc patterns P1–P12, tool errors, hedging detection, and 70% spot-check gate for summary tiles - **added** — Optional classifier for enhanced metrics capped at $2.00, disabled by default - **added** — Pipeline CLI with commands for prices, collect, rollup, review, render, pdf, measure-openrouter, collect --export-device, rollup --device-usage, behavior-sample, and sync-check - **added** — 117 unit tests and verification documentation in VERIFICATION.md - **changed** — Note-taker observer cost priced separately and never added to headline cost - **changed** — Mac transcripts extrapolated with low confidence until device export is merged - **changed** — Grok Bot usage shown as unavailable rather than measured - **changed** — Agent cost report pinned as first-party skill ID with four mirror plugins carrying byte copies ##### Agent Cost Report — weekly rebuild The `agent-cost-report` skill is rebuilt around measured data (#4238): - **Dollars from transcripts.** Claude Code and Codex transcript tokens priced at OpenRouter list prices, labeled ESTIMATED; note-taker (observer) cost priced separately and never added to the headline; measured provider spend only from a sanctioned source (OpenRouter per-key snapshot, shown with its UTC bucket label); "unavailable" is never shown as $0. - **Default window** is the last 7 full days in PT, today excluded; single-session and project scopes supported. - **Timing-style report.** Self-contained `report.html` (no script, no external resources) plus PDF, `report.json`, `line-items.csv`, `evidence.json`: hero, Wins vs mistakes with two timelines on one day axis, cost ribbon, donut, day chart, useful ring, folded Details. - **Behavior metrics.** A human/bot tagger on every user turn, frustration episodes, the Frustration Arc patterns P1–P12 plus tool errors and hedging, a low same-session mistakes line (upper bound in Details only), rule effectiveness, and a 70% spot-check gate for summary tiles. Optional classifier, off by default, capped at $2.00. - **Gaps stay honest.** Mac transcripts extrapolated (low confidence) until a device export is merged; Grok Bot usage shown as unavailable; win cost unmeasured until sessions are linked to PRs. - **Pipeline CLI** (`scripts/acr.py`, stdlib Python): `prices`, `collect`, `rollup`, `review`, `render`, `pdf`, `measure-openrouter`, `collect --export-device`, `rollup --device-usage`, `behavior-sample`, `sync-check`. 117 unit tests; `VERIFICATION.md` records the checks. - The four mirror plugins carry byte copies of the skill, and `agent-cost-report` is pinned as a first-party skill id. ### v13.26.1 - Date: 2026-09-26 - Version: v13.26.1 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.26.1 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.26.1 - **fixed** — Lapsed trial or revoked token no longer retries forever; cloud sync pauses and re-checks once an hour, resuming after renewal - **fixed** — Sync failures are no longer silent; paused or long-failing sync shows one plain-language line in SessionStart context - **added** — /api/sync/status gains authError and health fields - **fixed** — HTML error pages are summarized instead of dumped - **fixed** — Installs with cloud sync off clear the leftover sync_outbox backlog on worker start - **fixed** — One operation that the sync server keeps rejecting is quarantined after 3 attempts so the rest of the queue keeps uploading ##### Cloud sync fixes (CMEM Pro) - **Lapsed trial or revoked token no longer retries forever.** When the sync server answers 401/403, claude-mem pauses cloud sync, re-checks once an hour, and resumes on its own after a renewal. Status explains the cause: renew at cmem.ai/pro (subscription inactive) or reconnect at cmem.ai → Connect (token no longer valid). - **Sync failures are no longer silent.** A paused or long-failing sync now shows one plain-language line in the SessionStart context, and `/api/sync/status` gains `authError` and `health`. HTML error pages are summarized instead of dumped. - **#4228:** installs with cloud sync off clear the leftover `sync_outbox` backlog on worker start. - **#4086:** one op the sync server keeps rejecting (e.g. `revision_hash_conflict`) is quarantined after 3 attempts so the rest of the queue keeps uploading. PR: #4236 ### v13.26.0 - Date: 2026-09-26 - Version: v13.26.0 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.26.0 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.26.0 - **changed** — Cloud sync hub moved from Cloudflare Workers to https://sync.cmem.ai running on Fly and Neon Postgres - **changed** — Legacy Cloudflare hub URL is automatically migrated on startup to https://sync.cmem.ai without requiring reconnection - **added** — Cloud sync now honors Retry-After header on 429 and 503 responses - **changed** — Push checkpoint validation is more tolerant to handle hub migrations without blocking sync - **added** — New services/sync-api implementing protocol-v2 on Postgres - **changed** — Cloudflare Worker now operates in FORWARD_ORIGIN pass-through mode to proxy requests to the new hub ##### CMEM Pro cloud sync moves off Cloudflare The old Cloudflare Worker hub (`sync-hub.black-pond-afbb.workers.dev`) was failing every request because it hit Cloudflare Free plan caps. Cloud sync now runs on a new protocol-v2 hub at **https://sync.cmem.ai** (Fly + Neon Postgres). ###### Plugin changes - **Automatic hub URL migration:** on startup, a `CLAUDE_MEM_CLOUD_SYNC_HUB_URL` that still points at the legacy workers.dev host is rewritten to `https://sync.cmem.ai`. You don't need to reconnect. - **Retry-After backoff:** cloud sync now honors `Retry-After` on 429/503 responses and stops hammering the hub. - **Looser checkpoint check:** the push checkpoint validation is more tolerant, so a hub that moved no longer wedges sync. ###### Infrastructure (#4232, #4233) - New `services/sync-api`: a protocol-v2 port of `workers/sync-hub` on Postgres. - The Worker gets `FORWARD_ORIGIN` pass-through mode, which proxies every request to the new hub and touches no Durable Objects or KV. ### v13.25.3 - Date: 2026-09-21 - Version: v13.25.3 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.25.3 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.25.3 - **security** — Harden unauthenticated settings writes and telemetry error scrubbing ##### 13.25.3 - security: harden unauthenticated settings writes and telemetry error scrubbing (#4166) npm publish is handled separately. ### v13.24.23 - Date: 2026-09-11 - Version: v13.24.23 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.24.23 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.24.23 - **fixed** — Jail SDK subprocess cwd in supervisor - **fixed** — Anchor project names to Claude project dir in hooks ##### 13.24.23 - fix(supervisor): jail SDK subprocess cwd (#4054) - fix(hooks): anchor project names to Claude project dir (#4055) npm publish is handled separately. ### v13.24.22 - Date: 2026-09-11 - Version: v13.24.22 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.24.22 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.24.22 - **fixed** — skip empty-title observations at capture in sqlite ##### 13.24.22 - fix(sqlite): skip empty-title observations at capture (#3176) npm publish is handled separately. ### v13.24.21 - Date: 2026-09-11 - Version: v13.24.21 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.24.21 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.24.21 - **fixed** — Use latest user_prompts text on session rehydration ##### 13.24.21 - fix(session): use latest user_prompts text on rehydration (#4049 / #4047) npm publish is handled separately. ### v13.24.20 - Date: 2026-09-11 - Version: v13.24.20 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.24.20 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.24.20 - **fixed** — Stop regex bundle rewrite that can delete a declaration - **fixed** — Bound scheduled projection repair work in sync-hub ##### 13.24.20 - fix(build): stop regex bundle rewrite that can delete a declaration (#4044) - fix(sync-hub): bound scheduled projection repair work (#4046 / #3555) npm publish is handled separately. ### v13.24.20 - Date: 2026-09-11 - Version: v13.24.20 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.24.20 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.24.20-7939d192 - **fixed** — Stop regex bundle rewrite that can delete a declaration - **fixed** — Bound scheduled projection repair work in sync-hub ##### 13.24.20 - fix(build): stop regex bundle rewrite that can delete a declaration (#4044) - fix(sync-hub): bound scheduled projection repair work (#4046) npm publish is handled separately. ### v13.24.19 - Date: 2026-09-11 - Version: v13.24.19 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.24.19 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.24.19 - **fixed** — Stop cold-start false "too old" and name spawn failures in CLI resolve - **fixed** — Find bun/uv where installers place them during install - **fixed** — Stop ENOENT when Bun runtime path is bad in worker - **fixed** — Skip plugin cache sessions in hooks - **fixed** — Stop JSON parse crashes aborting sync in chroma - **fixed** — Normalize localhost worker host to 127.0.0.1 in settings - **fixed** — Sanitize macOS keychain account to match Claude Code in oauth ##### 13.24.19 - fix(cli-resolve): stop cold-start false "too old" and name spawn failures (#4036) - fix(install): find bun/uv where installers place them (#4038) - fix(worker): stop ENOENT when Bun runtime path is bad (#4039) - fix(hooks): skip plugin cache sessions (#4042) - fix(chroma): stop JSON parse crashes aborting sync (#4040) - fix(settings): normalize localhost worker host to 127.0.0.1 (#4041) - fix(oauth): sanitize macOS keychain account to match Claude Code (#4045 / #4037) npm publish is handled separately. ### v13.24.18 - Date: 2026-09-11 - Version: v13.24.18 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.24.18 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.24.18 - **fixed** — Stop discarding session-summary responses - **changed** — Bound session-summary input by payload size instead of event count - **changed** — Reuse OpenAI-compatible synthetic session IDs - **fixed** — Trip worker-unavailable fail-loud latch once, then fail-open - **fixed** — Test pin observation type handling against mode enum - **fixed** — Bound sync_outbox growth when cloud sync is unconfigured ##### 13.24.18 Ships from main since v13.24.17: - #4029 — stop discarding session-summary responses (server-beta; rehost #3587 / recurrence of #1345) - #4030 — bound session-summary input by payload size not event count (rehost #3584) - #4032 — reuse OpenAI-compatible synthetic session IDs (rehost #3597) - #4033 — trip worker-unavailable fail-loud latch once, then fail-open (rehost #3489) - #4034 — test pin observation type handling against mode enum (rehost #3593) - #4031 — bound sync_outbox growth when cloud sync unconfigured (rehost #3616; complementary to #4027) Does not npm publish from this release authoring step. Prioritizer publishes from tag. ### v13.24.17 - Date: 2026-09-11 - Version: v13.24.17 - Original notes: https://github.com/thedotmack/claude-mem/releases/tag/v13.24.17 - Permalink: https://whatsnew.fyi/product/claude-mem/releases/v13.24.17 - **fixed** — health probes now honor the caller's remaining deadline - **added** — detect macOS Codex desktop-bundled CLI - **fixed** — register memory_session_id once with NULL-only values and keep first id to prevent sync outbox amplification ##### 13.24.17 - #4026 / #3575 — health probes honor the caller's remaining deadline - #3445 — detect macOS Codex desktop-bundled CLI - #4027 — register memory_session_id once (NULL-only); keep first id so sync outbox stops amplifying