v9.1.0
thedotmack/claude-memv9.1.0Feb 7, 2026by thedotmack
AI Summary
v9.1.0 is a major release titled 'The Great PR Triage' that reviewed and resolved 100 open PRs with 157 commits across 123 files. This release prioritizes stability, security, and community contributions through a fail-open hook architecture, database initialization guards, and security hardening including CORS restrictions and XSS protection.
Key Highlights
- 100 PR triage completed - merged 48, cherry-picked 13, closed 39 stale/duplicate/YAGNI PRs
- Fail-open hook architecture - hooks no longer block Claude Code prompts during worker startup
- DB initialization guard - all API endpoints now wait for database initialization instead of crashing
- Security hardening - CORS restricted to localhost and XSS defense via DOMPurify
- 3 new features: Manual memory save, project exclusion, folder exclude setting
Breaking Changes
- CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED now defaults to false (opt-in) instead of always-on
New Features
- Manual memory storage - save_memory MCP tool and POST /api/memory/save endpoint for explicit memory capture
- Project exclusion setting - CLAUDE_MEM_EXCLUDED_PROJECTS glob patterns to exclude entire projects from tracking
- Folder exclude setting - CLAUDE_MEM_FOLDER_MD_EXCLUDE JSON array to exclude paths from CLAUDE.md generation
- Folder CLAUDE.md opt-in - CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED now defaults to false
- Generate/clean CLI commands - CLAUDE.md management with --dry-run support
- Ragtime email investigation - batch processor for email investigation workflows
- Graceful hook failures - hooks exit 0 with empty responses instead of crashing
- Fetch timeouts - all hook fetch calls have timeouts via fetchWithTimeout() helper
- Windows stability fixes - path spaces fix and spawn guard with 2-minute cooldown
- Daemon children cleanup - orphan reaper now catches idle daemon child processes
- Session-complete hook - new Stop phase 2 hook removes sessions from active map
- Prompt-too-long termination - sessions terminate cleanly instead of infinite retry loops
- Infinite restart prevention - max 3 restart attempts with exponential backoff
- CLAUDE.md race condition fix - two-pass detection prevents corruption
- Chroma/Vector search ID/metadata alignment fix
- Nested XML tag handling in parser
- Graceful empty transcripts handling
- Minimum Bun version check - enforces Bun 1.1.14+
- Cursor bun runtime - Cursor hooks use bun instead of node
Full Release Notes
## v9.1.0 — The Great PR Triage 100 open PRs reviewed, triaged, and resolved. 157 commits, 123 files changed, +6,104/-721 lines. This release focuses on stability, security, and community contributions. ### Highlights - **100 PR triage**: Reviewed every open PR — merged 48, cherry-picked 13, closed 39 (stale/duplicate/YAGNI) - **Fail-open hook architecture**: Hooks no longer block Claude Code prompts when the worker is starting up - **DB initialization guard**: All API endpoints now wait for database initialization instead of crashing with "Database not initialized" - **Security hardening**: CORS restricted to localhost, XSS defense-in-depth via DOMPurify - **3 new features**: Manual memory save, project exclusion, folder exclude setting --- ### Security - **CORS restricted to localhost** — Worker API no longer accepts cross-origin requests from arbitrary websites. Only localhost/127.0.0.1 origins allowed. (PR #917 by @Spunky84) - **XSS defense-in-depth** — Added DOMPurify sanitization to TerminalPreview.tsx viewer component (concept from PR #896) ### New Features - **Manual memory storage** — New \`save_memory\` MCP tool and \`POST /api/memory/save\` endpoint for explicit memory capture (PR #662 by @darconada, closes #645) - **Project exclusion setting** — \`CLAUDE_MEM_EXCLUDED_PROJECTS\` glob patterns to exclude entire projects from tracking (PR #920 by @Spunky84) - **Folder exclude setting** — \`CLAUDE_MEM_FOLDER_MD_EXCLUDE\` JSON array to exclude paths from CLAUDE.md generation, fixing Xcode/drizzle build conflicts (PR #699 by @leepokai, closes #620) - **Folder CLAUDE.md opt-in** — \`CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED\` now defaults to \`false\` (opt-in) instead of always-on (PR #913 by @superbiche) - **Generate/clean CLI commands** — \`generate\` and \`clean\` commands for CLAUDE.md management with \`--dry-run\` support (PR #657 by @thedotmack) - **Ragtime email investigation** — Batch processor for email investigation workflows (PR #863 by @thedotmack) ### Hook Resilience (Fail-Open Architecture) Hooks no longer block Claude Code when the worker is unavailable or slow: - **Graceful hook failures** — Hooks exit 0 with empty responses instead of crashing with exit 2 (PR #973 by @farikh) - **Fail-open context injection** — Returns empty context during initialization instead of 503 (PR #959 by @rodboev) - **Fetch timeouts** — All hook fetch calls have timeouts via \`fetchWithTimeout()\` helper (PR #964 by @rodboev) - **Removed stale user-message hook** — Eliminated startup error from incorrectly bundled hook (PR #960 by @rodboev) - **DB initialization middleware** — All \`/api/*\` routes now wait for DB init with 30s timeout instead of crashing ### Windows Stability - **Path spaces fix** — bun-runner.js no longer fails for Windows usernames with spaces (PR #972 by @farikh) - **Spawn guard** — 2-minute cooldown prevents repeated worker popup windows on startup failure ### Process & Zombie Management - **Daemon children cleanup** — Orphan reaper now catches idle daemon child processes (PR #879 by @boaz-robopet) - **Expanded orphan cleanup** — Startup cleanup now targets mcp-server.cjs and worker-service.cjs processes - **Session-complete hook** — New Stop phase 2 hook removes sessions from active map, enabling effective orphan reaper cleanup (PR #844 by @thusdigital, fixes #842) ### Session Management - **Prompt-too-long termination** — Sessions terminate cleanly instead of infinite retry loops (PR #934 by @jayvenn21) - **Infinite restart prevention** — Max 3 restart attempts with exponential backoff, prevents runaway API costs (PR #693 by @ajbmachon) - **Orphaned message fallback** — Messages from terminated sessions drain via Gemini/OpenRouter fallback (PR #937 by @jayvenn21, fixes #936) - **Project field backfill** — Sessions correctly scoped when PostToolUse creates session before UserPromptSubmit (PR #940 by @miclip) - **Provider-aware recovery** — Startup recovery uses correct provider instead of hardcoding SDKAgent (PR #741 by @licutis) - **AbortController reset** — Prevents infinite "Generator aborted" loops after session abort (PR #627 by @TranslateMe) - **Stateless provider IDs** — Synthetic memorySessionId generation for Gemini/OpenRouter (concept from PR #615 by @JiehoonKwak) - **Duplicate generator prevention** — Legacy init endpoint uses idempotent \`ensureGeneratorRunning()\` (PR #932 by @jayvenn21) - **DB readiness wait** — Session-init endpoint waits for database initialization (PR #828 by @rajivsinclair) - **Image-only prompt support** — Empty/media prompts use \`[media prompt]\` placeholder (concept from PR #928 by @iammike) ### CLAUDE.md Path & Generation - **Race condition fix** — Two-pass detection prevents corruption when Claude Code edits CLAUDE.md (concept from PR #974 by @cheapsteak) - **Duplicate path prevention** — Detects \`frontend/frontend/\` style nested duplicates (concept from PR #836 by @Glucksberg) - **Unsafe directory exclusion** — Blocks generation in \`res/\`, \`.git/\`, \`build/\`, \`node_modules/\`, \`__pycache__/\` (concept from PR #929 by @jayvenn21) ### Chroma/Vector Search - **ID/metadata alignment fix** — Search results no longer misaligned after deduplication (PR #887 by @abkrim) - **Transport zombie prevention** — Connection error handlers now close transport (PR #769 by @jenyapoyarkov) - **Zscaler SSL support** — Enterprise environments with SSL inspection now work via combined cert path (PR #884 by @RClark4958) ### Parser & Config - **Nested XML tag handling** — Parser correctly extracts fields with nested XML content (PR #835 by @Glucksberg) - **Graceful empty transcripts** — Transcript parser returns empty string instead of crashing (PR #862 by @DennisHartrampf) - **Gemini model name fix** — Corrected \`gemini-3-flash\` → \`gemini-3-flash-preview\` (PR #831 by @Glucksberg) - **CLAUDE_CONFIG_DIR support** — Plugin paths respect custom config directory (PR #634 by @Kuroakira, fixes #626) - **Env var priority** — \`env > file > defaults\` ordering via \`applyEnvOverrides()\` (PR #712 by @cjpeterein) - **Minimum Bun version check** — smart-install.js enforces Bun 1.1.14+ (PR #524 by @quicktime, fixes #519) - **Stdin timeout** — JSON self-delimiting detection with 30s safety timeout prevents hook hangs (PR #771 by @rajivsinclair, fixes #727) - **FK constraint prevention** — \`ensureMemorySessionIdRegistered()\` guard + \`ON UPDATE CASCADE\` schema migration (PR #889 by @Et9797, fixes #846) - **Cursor bun runtime** — Cursor hooks use bun instead of node, fixing bun:sqlite crashes (PR #721 by @polux0) ### Documentation - **9 README PRs merged**: formatting fixes, Korean/Japanese/Chinese render fixes, documentation link updates, Traditional Chinese + Urdu translations (PRs #953, #898, #864, #637, #636, #894, #907, #691 by @Leonard013, @youngsu5582, @eltociear, @WuMingDao, @fengluodb, @PeterDaveHello, @yasirali646) - **Windows setup note** — npm PATH instructions (PR #919 by @kamran-khalid-v9) - **Issue templates** — Duplicate check checkbox added (PR #970 by @bmccann36) ### Community Contributors Thank you to the 35+ contributors whose PRs were reviewed in this release: @Spunky84, @farikh, @rodboev, @boaz-robopet, @jayvenn21, @ajbmachon, @miclip, @licutis, @TranslateMe, @JiehoonKwak, @rajivsinclair, @iammike, @cheapsteak, @Glucksberg, @abkrim, @jenyapoyarkov, @RClark4958, @DennisHartrampf, @Kuroakira, @cjpeterein, @quicktime, @polux0, @Et9797, @thusdigital, @superbiche, @darconada, @leepokai, @Leonard013, @youngsu5582, @eltociear, @WuMingDao, @fengluodb, @PeterDaveHello, @yasirali646, @kamran-khalid-v9, @bmccann36 --- **Full Changelog**: https://github.com/thedotmack/claude-mem/compare/v9.0.17...v9.1.0