Skip to main content

Troubleshooting Guide

Quick Diagnostic Tool

Describe any issues you’re experiencing to Claude, and the troubleshoot skill will automatically activate to provide diagnosis and fixes. The troubleshoot skill will:
  • ✅ Check worker status and health
  • ✅ Verify database existence and integrity
  • ✅ Test worker service connectivity
  • ✅ Validate dependencies installation
  • ✅ Check port configuration and availability
  • ✅ Provide automated fixes for common issues
The skill includes comprehensive diagnostics, automated repair sequences, and detailed troubleshooting workflows for all common issues. Simply describe the problem naturally to invoke it.

v5.x Specific Issues

Viewer UI Not Loading

Symptoms: Cannot access http://localhost:37777, page doesn’t load, or shows connection error. Solutions:
  1. Check if worker is running on port 37777:
    lsof -i :37777
    # or
    npm run worker:status
    
  2. Verify worker is healthy:
    curl http://localhost:37777/health
    
  3. Check worker logs for errors:
    npm run worker:logs
    
  4. Restart worker service:
    npm run worker:restart
    
  5. Check for port conflicts:
    # If port 37777 is in use by another service
    export CLAUDE_MEM_WORKER_PORT=38000
    npm run worker:restart
    

Theme Toggle Not Persisting

Symptoms: Theme preference (light/dark mode) resets after browser refresh. Solutions:
  1. Check browser localStorage is enabled:
    // In browser console
    localStorage.getItem('claude-mem-settings')
    
  2. Verify settings endpoint is working:
    curl http://localhost:37777/api/settings
    
  3. Clear localStorage and try again:
    // In browser console
    localStorage.removeItem('claude-mem-settings')
    
  4. Check for browser privacy mode (blocks localStorage)

SSE Connection Issues

Symptoms: Viewer shows “Disconnected” status, updates not appearing in real-time. Solutions:
  1. Check SSE endpoint is accessible:
    curl -N http://localhost:37777/stream
    
  2. Check browser console for errors:
    • Open DevTools (F12)
    • Look for EventSource errors
    • Check Network tab for failed /stream requests
  3. Verify worker is running:
    npm run worker:status
    
  4. Check for network/proxy issues blocking SSE
    • Corporate firewalls may block SSE
    • Try disabling VPN temporarily
  5. Restart worker and refresh browser:
    npm run worker:restart
    

Chroma/Python Dependency Issues (v5.0.0+)

Symptoms: Installation fails with chromadb or Python-related errors. Solutions:
  1. Verify Python 3.8+ is installed:
    python --version
    # or
    python3 --version
    
  2. Install chromadb manually:
    cd ~/.claude/plugins/marketplaces/thedotmack
    npm install chromadb
    
  3. Check chromadb health:
    npm run chroma:health
    
  4. Windows-specific: Ensure Python is in PATH:
    where python
    # Should show Python installation path
    
  5. If Chroma continues to fail, hybrid search will gracefully degrade to SQLite FTS5 only

Smart Install Caching Issues (v5.0.3+)

Symptoms: Dependencies not updating after plugin update, stale version marker. Solutions:
  1. Clear install cache:
    rm ~/.claude/plugins/marketplaces/thedotmack/.install-version
    
  2. Force reinstall:
    cd ~/.claude/plugins/marketplaces/thedotmack
    npm install --force
    
  3. Check version marker:
    cat ~/.claude/plugins/marketplaces/thedotmack/.install-version
    cat ~/.claude/plugins/marketplaces/thedotmack/package.json | grep version
    
  4. Restart Claude Code after manual install

Worker Service Issues

Worker Service Not Starting

Symptoms: Worker doesn’t start, or worker status shows it’s not running. Solutions:
  1. Check worker status:
    npm run worker:status
    
  2. Try starting manually:
    npm run worker:start
    
  3. Check worker logs for errors:
    npm run worker:logs
    
  4. Full reset:
    npm run worker:stop
    npm run worker:start
    
  5. Verify Bun is installed:
    which bun
    bun --version
    

Port Allocation Failed

Symptoms: Worker fails to start with “port already in use” error. Solutions:
  1. Check if port 37777 is in use:
    lsof -i :37777
    
  2. Kill process using the port:
    kill -9 $(lsof -t -i:37777)
    
  3. Or use a different port:
    export CLAUDE_MEM_WORKER_PORT=38000
    npm run worker:restart
    
  4. Verify new port:
    cat ~/.claude-mem/worker.port
    

Worker Keeps Crashing

Symptoms: Worker restarts repeatedly or fails to stay running. Solutions:
  1. Check error logs:
    npm run worker:logs
    
  2. Check worker status:
    npm run worker:status
    
  3. Check database for corruption:
    sqlite3 ~/.claude-mem/claude-mem.db "PRAGMA integrity_check;"
    
  4. Verify Bun installation:
    bun --version
    

Worker Not Processing Observations

Symptoms: Observations saved but not processed, no summaries generated. Solutions:
  1. Check worker is running:
    npm run worker:status
    
  2. Check worker logs:
    npm run worker:logs
    
  3. Verify database has observations:
    sqlite3 ~/.claude-mem/claude-mem.db "SELECT COUNT(*) FROM observations;"
    
  4. Restart worker:
    npm run worker:restart
    

Manual Recovery for Stuck Observations

Symptoms: Observations stuck in processing queue after worker crash or restart, no new summaries appearing despite worker running. Background: As of v5.x, automatic queue recovery on worker startup is disabled. Users must manually trigger recovery to maintain explicit control over reprocessing and prevent unexpected duplicate observations. Solutions: The interactive CLI tool provides the safest and most user-friendly recovery experience:
# Check queue status and prompt for recovery
bun scripts/check-pending-queue.ts

# Auto-process without prompting
bun scripts/check-pending-queue.ts --process

# Process up to 5 sessions
bun scripts/check-pending-queue.ts --process --limit 5
What it does:
  • ✅ Checks worker health before proceeding
  • ✅ Shows detailed queue summary (pending, processing, failed, stuck)
  • ✅ Groups messages by session with age and status breakdown
  • ✅ Prompts user to confirm processing (unless --process flag used)
  • ✅ Shows recently processed messages for feedback
Interactive Example:
Worker is healthy ✓

Queue Summary:
  Pending: 12 messages
  Processing: 2 messages (1 stuck)
  Failed: 0 messages
  Recently Processed: 5 messages in last 30 minutes

Sessions with pending work: 3
  Session 44: 5 pending, 1 processing (age: 2m)
  Session 45: 4 pending, 1 processing (age: 7m - STUCK)
  Session 46: 2 pending

Would you like to process these pending queues? (y/n)

Option 2: Use HTTP API Directly

For automation or scripting scenarios:
  1. Check queue status:
    curl http://localhost:37777/api/pending-queue
    
    Response shows:
    • queue.totalPending: Messages waiting to process
    • queue.totalProcessing: Messages currently processing
    • queue.stuckCount: Processing messages >5 minutes old
    • sessionsWithPendingWork: Session IDs needing recovery
  2. Trigger manual recovery:
    curl -X POST http://localhost:37777/api/pending-queue/process \
      -H "Content-Type: application/json" \
      -d '{"sessionLimit": 10}'
    
    Response includes:
    • totalPendingSessions: Total sessions with pending messages
    • sessionsStarted: Number of sessions we started processing
    • sessionsSkipped: Sessions already processing (not restarted)
    • startedSessionIds: Database IDs of sessions started

Understanding Queue States

Messages progress through these states:
  1. pending - Queued, waiting to process
  2. processing - Currently being processed by SDK agent
  3. processed - Completed successfully
  4. failed - Failed after 3 retry attempts
Stuck Detection: Messages in processing state for >5 minutes are considered stuck and automatically reset to pending on worker startup (but not automatically reprocessed).

Recovery Strategy

When to use manual recovery:
  • After worker crashes or unexpected restarts
  • When observations appear saved but no summaries generated
  • When queue status shows stuck messages (processing >5 minutes)
  • After system crashes or forced shutdowns
Best practices:
  1. Always check queue status before triggering recovery
  2. Use the CLI tool for interactive sessions (provides feedback)
  3. Use the HTTP API for automation/scripting
  4. Start with a low session limit (5-10) to avoid overwhelming the worker
  5. Monitor worker logs during recovery: npm run worker:logs
  6. Check recently processed messages to confirm recovery worked

Troubleshooting Recovery Issues

If recovery fails or messages remain stuck:
  1. Verify worker is healthy:
    curl http://localhost:37777/health
    # Should return: {"status":"ok","uptime":12345,"port":37777}
    
  2. Check database for corruption:
    sqlite3 ~/.claude-mem/claude-mem.db "PRAGMA integrity_check;"
    
  3. View stuck messages directly:
    sqlite3 ~/.claude-mem/claude-mem.db "
      SELECT id, session_db_id, status, retry_count,
             (strftime('%s', 'now') * 1000 - started_processing_at_epoch) / 60000 as age_minutes
      FROM pending_messages
      WHERE status = 'processing'
      ORDER BY started_processing_at_epoch;
    "
    
  4. Force reset stuck messages (nuclear option):
    sqlite3 ~/.claude-mem/claude-mem.db "
      UPDATE pending_messages
      SET status = 'pending', started_processing_at_epoch = NULL
      WHERE status = 'processing';
    "
    
    Then trigger recovery:
    bun scripts/check-pending-queue.ts --process
    
  5. Check worker logs for SDK errors:
    npm run worker:logs | grep -i error
    

Understanding the Queue Table

The pending_messages table tracks all messages with these key fields:
CREATE TABLE pending_messages (
  id INTEGER PRIMARY KEY,
  session_db_id INTEGER,          -- Foreign key to sdk_sessions
  claude_session_id TEXT,          -- Claude session ID
  message_type TEXT,               -- 'observation' | 'summarize'
  status TEXT,                     -- 'pending' | 'processing' | 'processed' | 'failed'
  retry_count INTEGER,             -- Current retry attempt (max: 3)
  created_at_epoch INTEGER,        -- When message was queued
  started_processing_at_epoch INTEGER,  -- When marked 'processing'
  completed_at_epoch INTEGER       -- When completed/failed
)
Query examples:
# Count messages by status
sqlite3 ~/.claude-mem/claude-mem.db "
  SELECT status, COUNT(*)
  FROM pending_messages
  GROUP BY status;
"

# Find sessions with pending work
sqlite3 ~/.claude-mem/claude-mem.db "
  SELECT session_db_id, COUNT(*) as pending_count
  FROM pending_messages
  WHERE status IN ('pending', 'processing')
  GROUP BY session_db_id;
"

# View recent failures
sqlite3 ~/.claude-mem/claude-mem.db "
  SELECT id, session_db_id, message_type, retry_count,
         datetime(completed_at_epoch/1000, 'unixepoch') as failed_at
  FROM pending_messages
  WHERE status = 'failed'
  ORDER BY completed_at_epoch DESC
  LIMIT 10;
"

Hook Issues

Hooks Not Firing

Symptoms: No context appears, observations not saved. Solutions:
  1. Verify hooks are configured:
    cat plugin/hooks/hooks.json
    
  2. Test hooks manually:
    # Test context hook
    echo '{"session_id":"test-123","cwd":"'$(pwd)'","source":"startup"}' | node plugin/scripts/context-hook.js
    
  3. Check hook permissions:
    ls -la plugin/scripts/*.js
    
  4. Verify hooks.json is valid JSON:
    cat plugin/hooks/hooks.json | jq .
    

Context Not Appearing

Symptoms: No session context when Claude starts. Solutions:
  1. Check if summaries exist:
    sqlite3 ~/.claude-mem/claude-mem.db "SELECT COUNT(*) FROM session_summaries;"
    
  2. View recent sessions:
    npm run test:context:verbose
    
  3. Check database integrity:
    sqlite3 ~/.claude-mem/claude-mem.db "PRAGMA integrity_check;"
    
  4. Manually test context hook:
    npm run test:context
    

Hooks Timeout

Symptoms: Hook execution times out, errors in Claude Code. Solutions:
  1. Increase timeout in plugin/hooks/hooks.json:
    {
      "timeout": 180  // Increase from 120
    }
    
  2. Check worker is running (prevents timeout waiting for worker):
    npm run worker:status
    
  3. Check database size (large database = slow queries):
    ls -lh ~/.claude-mem/claude-mem.db
    
  4. Optimize database:
    sqlite3 ~/.claude-mem/claude-mem.db "VACUUM;"
    

Dependencies Not Installing

Symptoms: SessionStart hook fails with “module not found” errors. Solutions:
  1. Manually install dependencies:
    cd ~/.claude/plugins/marketplaces/thedotmack
    npm install
    
  2. Check npm is available:
    which npm
    npm --version
    
  3. Check package.json exists:
    ls -la ~/.claude/plugins/marketplaces/thedotmack/package.json
    

Database Issues

Database Locked

Symptoms: “database is locked” errors in logs. Solutions:
  1. Close all connections:
    npm run worker:stop
    
  2. Check for stale locks:
    lsof ~/.claude-mem/claude-mem.db
    
  3. Kill processes holding locks:
    kill -9 <PID>
    
  4. Restart worker:
    npm run worker:start
    

Database Corruption

Symptoms: Integrity check fails, weird errors. Solutions:
  1. Check database integrity:
    sqlite3 ~/.claude-mem/claude-mem.db "PRAGMA integrity_check;"
    
  2. Backup database:
    cp ~/.claude-mem/claude-mem.db ~/.claude-mem/claude-mem.db.backup
    
  3. Try to repair:
    sqlite3 ~/.claude-mem/claude-mem.db "VACUUM;"
    
  4. Nuclear option - recreate database:
    rm ~/.claude-mem/claude-mem.db
    npm run worker:start  # Will recreate schema
    

FTS5 Search Not Working

Symptoms: Search returns no results, FTS5 errors. Solutions:
  1. Check FTS5 tables exist:
    sqlite3 ~/.claude-mem/claude-mem.db "SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '%_fts';"
    
  2. Rebuild FTS5 tables:
    sqlite3 ~/.claude-mem/claude-mem.db "
      INSERT INTO observations_fts(observations_fts) VALUES('rebuild');
      INSERT INTO session_summaries_fts(session_summaries_fts) VALUES('rebuild');
      INSERT INTO user_prompts_fts(user_prompts_fts) VALUES('rebuild');
    "
    
  3. Check triggers exist:
    sqlite3 ~/.claude-mem/claude-mem.db "SELECT name FROM sqlite_master WHERE type='trigger';"
    

Database Too Large

Symptoms: Slow performance, large database file. Solutions:
  1. Check database size:
    ls -lh ~/.claude-mem/claude-mem.db
    
  2. Vacuum database:
    sqlite3 ~/.claude-mem/claude-mem.db "VACUUM;"
    
  3. Delete old sessions:
    sqlite3 ~/.claude-mem/claude-mem.db "
      DELETE FROM observations WHERE created_at_epoch < $(date -v-30d +%s);
      DELETE FROM session_summaries WHERE created_at_epoch < $(date -v-30d +%s);
      DELETE FROM sdk_sessions WHERE created_at_epoch < $(date -v-30d +%s);
    "
    
  4. Rebuild FTS5 after deletion:
    sqlite3 ~/.claude-mem/claude-mem.db "
      INSERT INTO observations_fts(observations_fts) VALUES('rebuild');
      INSERT INTO session_summaries_fts(session_summaries_fts) VALUES('rebuild');
    "
    

MCP Search Issues

Search Tools Not Available

Symptoms: MCP search tools not visible in Claude Code. Solutions:
  1. Check MCP configuration:
    cat plugin/.mcp.json
    
  2. Verify search server is built:
    ls -l plugin/scripts/mcp-server.cjs
    
  3. Rebuild if needed:
    npm run build
    
  4. Restart Claude Code

Search Returns No Results

Symptoms: Valid queries return empty results. Solutions:
  1. Check database has data:
    sqlite3 ~/.claude-mem/claude-mem.db "SELECT COUNT(*) FROM observations;"
    
  2. Verify FTS5 tables populated:
    sqlite3 ~/.claude-mem/claude-mem.db "SELECT COUNT(*) FROM observations_fts;"
    
  3. Test simple query:
    # Test MCP search tool
    search(query="test", limit=5)
    
  4. Check query syntax:
    # Bad: Special characters may cause issues
    search(query="[test]")
    
    # Good: Simple words
    search(query="test")
    

Token Limit Errors

Symptoms: “exceeded token limit” errors from MCP. Solutions:
  1. Follow 3-layer workflow (don’t skip to get_observations):
    # Start with search to get index
    search(query="...", limit=10)
    
    # Review IDs, then fetch only relevant ones
    get_observations(ids=[<2-3 relevant IDs>])
    
  2. Reduce limit in search:
    search(query="...", limit=3)
    
  3. Use filters to narrow results:
    search(query="...", type="decision", limit=5)
    
  4. Paginate results:
    # First page
    search(query="...", limit=5, offset=0)
    
    # Second page
    search(query="...", limit=5, offset=5)
    
  5. Batch IDs in get_observations:
    # Always batch multiple IDs in one call
    get_observations(ids=[123, 456, 789])
    
    # Don't make separate calls per ID
    

Performance Issues

Slow Context Injection

Symptoms: SessionStart hook takes too long. Solutions:
  1. Reduce context sessions:
    // In src/hooks/context.ts
    const CONTEXT_SESSIONS = 5;  // Reduce from 10
    
  2. Optimize database:
    sqlite3 ~/.claude-mem/claude-mem.db "
      ANALYZE;
      VACUUM;
    "
    
  3. Add indexes (if missing):
    sqlite3 ~/.claude-mem/claude-mem.db "
      CREATE INDEX IF NOT EXISTS idx_sessions_project_created ON sdk_sessions(project, created_at_epoch DESC);
    "
    

Slow Search Queries

Symptoms: MCP search tools take too long. Solutions:
  1. Use more specific queries
  2. Add date range filters
  3. Add type/concept filters
  4. Reduce result limit
  5. Use index format instead of full format

High Memory Usage

Symptoms: Worker uses too much memory. Solutions:
  1. Check current usage:
    npm run worker:status
    
  2. Restart worker:
    npm run worker:restart
    
  3. Clean up old data (see “Database Too Large” above)

Installation Issues

Plugin Not Found

Symptoms: /plugin install claude-mem fails. Solutions:
  1. Add marketplace first:
    /plugin marketplace add thedotmack/claude-mem
    
  2. Then install:
    /plugin install claude-mem
    
  3. Verify installation:
    ls -la ~/.claude/plugins/marketplaces/thedotmack/
    

Build Failures

Symptoms: npm run build fails. Solutions:
  1. Clean and reinstall:
    rm -rf node_modules package-lock.json
    npm install
    
  2. Check Node.js version:
    node --version  # Should be >= 18.0.0
    
  3. Check for TypeScript errors:
    npx tsc --noEmit
    

Missing Dependencies

Symptoms: “Cannot find module” errors. Solutions:
  1. Install dependencies:
    npm install
    
  2. Check package.json:
    cat package.json
    
  3. Verify node_modules exists:
    ls -la node_modules/
    

Debugging

Enable Verbose Logging

export DEBUG=claude-mem:*
npm run worker:restart
npm run worker:logs

Check Correlation IDs

Trace observations through the pipeline:
sqlite3 ~/.claude-mem/claude-mem.db "
  SELECT correlation_id, tool_name, created_at
  FROM observations
  WHERE session_id = 'YOUR_SESSION_ID'
  ORDER BY created_at;
"

Inspect Worker State

# Check if worker is running
npm run worker:status

# View logs
npm run worker:logs

# Check port file
cat ~/.claude-mem/worker.port

# Test worker health
curl http://localhost:37777/health

Database Inspection

sqlite3 ~/.claude-mem/claude-mem.db

# View schema
.schema

# Check table counts
SELECT 'sessions', COUNT(*) FROM sdk_sessions
UNION ALL
SELECT 'observations', COUNT(*) FROM observations
UNION ALL
SELECT 'summaries', COUNT(*) FROM session_summaries
UNION ALL
SELECT 'prompts', COUNT(*) FROM user_prompts;

# View recent activity
SELECT created_at, tool_name FROM observations ORDER BY created_at DESC LIMIT 10;

Common Error Messages

”Worker service not responding”

Cause: Worker not running or port mismatch. Solution: Restart worker with npm run worker:restart.

”Database is locked”

Cause: Multiple processes accessing database. Solution: Stop worker, kill stale processes, restart.

”FTS5: syntax error”

Cause: Invalid search query syntax. Solution: Use simpler query, avoid special characters.

”SQLITE_CANTOPEN”

Cause: Database file permissions or missing directory. Solution: Check ~/.claude-mem/ exists and is writable.

”Module not found”

Cause: Missing dependencies. Solution: Run npm install.

Getting Help

If none of these solutions work:
  1. Check logs:
    npm run worker:logs
    
  2. Create issue: GitHub Issues
    • Include error messages
    • Include relevant logs
    • Include steps to reproduce
  3. Check existing issues: Someone may have already solved your problem

Next Steps