Long-term memory system for Claude Code using HelixDB graph-vector database. Store and retrieve facts, preferences, context, and relationships across sessions using semantic search, reasoning chains, and time-window filtering.
/plugin marketplace add MarcinDudekDev/helix-memory/plugin install marcindudekdev-helix-memory@MarcinDudekDev/helix-memoryThis skill inherits all available tools. When active, it can use any tool Claude has access to.
README.mdexamples/semantic_search.mdexamples/session_workflow.mdexamples/store_preference.mdreferences/queries.mdreferences/schema.mdStore and retrieve persistent memory across sessions using HelixDB's graph-vector database. Features semantic search (via Ollama), reasoning chains (IMPLIES/CONTRADICTS/BECAUSE), time-window filtering, and hybrid search.
ALWAYS use the memory bash script - never call Python scripts directly.
The memory script is located in the helix-memory repo root. After installation, use it directly or via alias:
# Direct path (update to your install location)
/path/to/helix-memory/memory <command>
# Or if you set up an alias
memory <command>
# Start HelixDB (auto-starts Docker Desktop if needed)
memory start
# Stop HelixDB
memory stop
# Restart
memory restart
# Check status
memory status
# Search memories
memory search "topic"
# List all (sorted by importance)
memory list --limit 10
# Quick store with auto-categorization (uses Ollama/Gemini)
memory remember "User prefers FastAPI over Flask"
# Store with explicit category
memory store "content" -t preference -i 9 -g "tags"
# Delete by ID (prefix OK)
memory delete abc123
# Find by tag
memory tag "wordpress"
# Help
memory help
The common.py module provides high-level functions:
import sys
sys.path.insert(0, '/path/to/helix-memory/hooks')
from common import (
# Storage
store_memory, store_memory_embedding, generate_embedding,
# Retrieval
get_all_memories, get_high_importance_memories,
# Search
search_by_similarity, search_by_text, hybrid_search,
get_memories_by_time_window,
# Reasoning chains
create_implication, create_contradiction, create_causal_link, create_supersedes,
get_implications, get_contradictions, get_reasoning_chain,
# Utils
check_helix_running, ensure_helix_running
)
Real vector similarity using nomic-embed-text model:
# Search finds semantically related content, not just keywords
results = search_by_similarity("verify code works", k=5)
# Finds: "test before completing" even without keyword match
Filter memories by recency:
# Time windows: "recent" (4h), "contextual" (30d), "deep" (90d), "full" (all)
recent = get_memories_by_time_window("recent") # Last 4 hours
contextual = get_memories_by_time_window("contextual") # Last 30 days
all_time = get_memories_by_time_window("full") # Everything
Combines vector similarity + text matching for best results:
results = hybrid_search("python testing preferences", k=10, window="contextual")
Create logical relationships between memories:
# "prefers Python" IMPLIES "avoid Node.js suggestions"
create_implication(python_pref_id, avoid_node_id, confidence=9, reason="Language preference")
# "always use tabs" CONTRADICTS "always use spaces"
create_contradiction(tabs_id, spaces_id, severity=8, resolution="newer_wins")
# "migrated to FastAPI" BECAUSE "Flask too slow"
create_causal_link(fastapi_id, flask_slow_id, strength=9)
# New preference SUPERSEDES old one
create_supersedes(new_pref_id, old_pref_id)
Query reasoning chains:
implications = get_implications(memory_id) # What does this imply?
contradictions = get_contradictions(memory_id) # What conflicts with this?
chain = get_reasoning_chain(memory_id) # Full reasoning graph
| Category | Importance | Description |
|---|---|---|
| preference | 7-10 | User preferences that guide interactions |
| fact | 5-9 | Factual info about user/projects/environment |
| context | 4-8 | Project/domain background |
| decision | 6-10 | Architectural decisions with rationale |
| task | 3-9 | Ongoing/future tasks |
| solution | 6-9 | Bug fixes, problem solutions |
memory_id = store_memory(
content="User prefers Python over Node.js for backend",
category="preference",
importance=9,
tags="python,nodejs,backend,language",
source="session-abc123" # or "manual"
)
# Generate real embedding via Ollama
vector, model = generate_embedding(content)
# Store embedding for semantic search
store_memory_embedding(memory_id, vector, content, model)
all_mems = get_all_memories()
important = get_high_importance_memories(min_importance=8)
prefs = [m for m in all_mems if m.get('category') == 'preference']
# Semantic (finds related meanings)
results = search_by_similarity("testing workflow", k=10)
# Text (exact substring match)
results = search_by_text("pytest")
# Hybrid (best of both)
results = hybrid_search("python testing", k=10, window="contextual")
All endpoints: POST http://localhost:6969/{endpoint} with JSON body.
# Store memory
curl -X POST http://localhost:6969/StoreMemory -H "Content-Type: application/json" \
-d '{"content":"...", "category":"preference", "importance":9, "tags":"...", "source":"manual"}'
# Create implication
curl -X POST http://localhost:6969/CreateImplication -H "Content-Type: application/json" \
-d '{"from_id":"...", "to_id":"...", "confidence":8, "reason":"..."}'
# Get all memories
curl -X POST http://localhost:6969/GetAllMemories -H "Content-Type: application/json" -d '{}'
# Get implications
curl -X POST http://localhost:6969/GetImplications -H "Content-Type: application/json" \
-d '{"memory_id":"..."}'
# Vector search
curl -X POST http://localhost:6969/SearchBySimilarity -H "Content-Type: application/json" \
-d '{"query_vector":[...], "k":10}'
Memory storage/retrieval happens automatically via Claude Code hooks:
load_memories.py): Loads relevant memories before processingreflect_and_store.py): Analyzes conversation, stores important items (every 5 prompts)session_start.py): Initializes session context# Service
memory start # Start HelixDB (auto-starts Docker Desktop)
memory stop # Stop HelixDB
memory restart # Restart HelixDB
memory status # Check status and memory count
# Memory operations
memory search "pytest"
memory list --limit 10
memory remember "User prefers pytest over unittest"
memory store "content" -t category -i importance -g "tags"
memory delete <memory-id>
memory tag "tagname"
memory help
Memories are automatically tagged with project names based on working directory. Project detection uses directory name as fallback.
# Start Ollama service
brew services start ollama
# Pull embedding model (274MB)
ollama pull nomic-embed-text
# Verify
curl http://localhost:11434/api/tags
Without Ollama, falls back to Gemini API (if key set) or hash-based pseudo-embeddings.
# Use the memory script (handles Docker auto-start)
memory start
# Check container status
docker ps | grep helix
brew services restart ollama
ollama list # Should show nomic-embed-text
HelixDB expects 1536-dim vectors. The code auto-pads smaller embeddings.
docker logs $(docker ps -q --filter "name=helix-memory") 2>&1 | tail -20
~/.local/bin/helixUse when working with Payload CMS projects (payload.config.ts, collections, fields, hooks, access control, Payload API). Use when debugging validation errors, security issues, relationship queries, transactions, or hook behavior.