✓ Verified
📁 File Management
✓ Enhanced Data
Cortex Memory
Long-term structured memory with knowledge graph, entity tracking, temporal reasoning, and cross-ses
- Rating
- 4.3 (173 reviews)
- Downloads
- 765 downloads
- Version
- 1.0.0
Overview
Long-term structured memory with knowledge graph, entity tracking, temporal reasoning, and cross-session recall.
Complete Documentation
View Source →name: cortex-memory description: Long-term structured memory with knowledge graph, entity tracking, temporal reasoning, and cross-session recall. Powered by the Cortex API. metadata: {"openclaw": {"emoji": "🧠", "category": "memory", "homepage": "https://github.com/Ubundi/Cortex", "primaryEnv": "CORTEX_API_KEY", "requires": {"env": ["CORTEX_API_KEY", "CORTEX_BASE_URL"], "bins": ["curl", "jq"]}}}
Cortex Memory
Cortex gives you a structured long-term memory that goes beyond whatmemory_search can do. It extracts facts, entities, and relationships from text, stores them in a knowledge graph, and retrieves them using hybrid search (BM25 + semantic + temporal + graph traversal).
Use Cortex when you need to:
- Recall information across past sessions
- Understand how concepts, people, or projects relate to each other
- Track what changed over time (superseded facts, belief drift)
- Find things that
memory_searchreturns noisy or incomplete results for
memory_search handles well (recent session context, keyword matches in today's log). Use native memory first; escalate to Cortex for deeper queries.
If @cortex/openclaw-plugin is also installed: The plugin automatically injects Cortex memories before every turn inside a tag. If you see in the current context, Cortex has already been queried for this turn — do NOT call recall again unless you need a different query (e.g., a follow-up entity lookup or a different query type).
Setup
RequiresCORTEX_API_KEY and CORTEX_BASE_URL environment variables. These are set in ~/.openclaw/openclaw.json:
``json
{
"skills": {
"entries": {
"cortex-memory": {
"enabled": true,
"apiKey": "sk-cortex-oc-YOUR_KEY",
"env": {
"CORTEX_BASE_URL": "https://q5p64iw9c9.execute-api.us-east-1.amazonaws.com/prod"
}
}
}
}
}
`
Verify Connection
`bash
curl -s "$CORTEX_BASE_URL/health" -H "x-api-key: $CORTEX_API_KEY" | jq .
`
Expected: {"status": "ok"}
Recall — Search Long-Term Memory
When you need to recall facts, entities, or relationships from past sessions:
`bash
curl -s -X POST "$CORTEX_BASE_URL/v1/retrieve" \
-H "x-api-key: $CORTEX_API_KEY" \
-H "Content-Type: application/json" \
-d "$(jq -n \
--arg query "QUERY_HERE" \
--arg query_type "factual" \
--argjson top_k 10 \
'{query: $query, query_type: $query_type, top_k: $top_k}')" | jq '.results[] | {type, content, score, metadata}'
`
Retrieval modes:
full (default) — all 5 retrieval channels + graph traversal + reranking. Best recall quality, but slower (~300-600ms depending on region). Use this for thorough queries where you need the best results.
fast — BM25 + semantic only, no graph traversal or reranking (~80-150ms server-side). Use when you need a quick check and can tolerate less thorough results. Pass "mode": "fast" in the request body.
`bash
Fast mode example — quick entity lookup
curl -s -X POST "$CORTEX_BASE_URL/v1/retrieve" \
-H "x-api-key: $CORTEX_API_KEY" \
-H "Content-Type: application/json" \
-d "$(jq -n \
--arg query "QUERY_HERE" \
--arg query_type "factual" \
--arg mode "fast" \
--argjson top_k 5 \
'{query: $query, query_type: $query_type, top_k: $top_k, mode: $mode}')" | jq '.results[] | {type, content, score}'
`
Query types:
factual — search FACT and ENTITY nodes (use for: who, what, when, where questions)
emotional — search EMOTION, INSIGHT, VALUE, BELIEF nodes (use for: how does the user feel about X?)
combined — search all node types (default, use when unsure)
When to use Cortex recall vs. memory_search:
| Situation | Use memory_search | Use Cortex recall | Mode |
|---|---|---|---|
| Recent context from today | Yes | No | — |
| Simple keyword lookup | Yes | No | — |
| Cross-session facts | No — often noisy | Yes | fast usually sufficient |
| Entity relationships ("how does X relate to Y?") | No — can't traverse | Yes | full (needs graph traversal) |
| Temporal changes ("what changed about X?") | No — no SUPERSEDES tracking | Yes | full (needs temporal channel) |
| Scoped project queries | No — cross-project noise | Yes | fast usually sufficient |
| Entity lookup ("who is Sarah Chen?") | Partial — finds mentions | Yes — entity node + all connected facts | fast for quick check, full for complete picture |
Remember — Store in Long-Term Memory
When the user asks you to remember something important, or when you encounter high-value information that should persist with full entity extraction:
`bash
curl -s -X POST "$CORTEX_BASE_URL/v1/ingest" \
-H "x-api-key: $CORTEX_API_KEY" \
-H "Content-Type: application/json" \
-d "$(jq -n \
--arg text "TEXT_TO_REMEMBER" \
--arg session_id "openclaw:$(date +%Y-%m-%d)" \
'{text: $text, session_id: $session_id}')" | jq '{nodes_created, edges_created, facts: [.facts[].core], entities: [.entities[].name]}'
`
The response shows what was extracted:
facts — factual statements extracted from the text
entities — named entities (people, companies, places, etc.) with aliases
nodes_created / edges_created — graph nodes and relationship edges created
When to remember:
- User explicitly asks: "remember this", "store this in Cortex", "don't forget that..."
- Key decisions made during a session
- Important context about people, projects, or preferences
- After writing to MEMORY.md — also send the same content to Cortex for structured extraction
Session ID convention:
- General sessions:
openclaw:YYYY-MM-DD (e.g., openclaw:2026-02-17)
- Project-scoped:
openclaw:project-name:topic (e.g., openclaw:project-frontend:memory-md)
- Daily logs (used by the npm plugin's file sync):
openclaw:project-name:daily:YYYY-MM-DD
- Preferences/standing facts:
openclaw:preferences
The session ID is used for scoped retrieval — queries can filter to a specific project by matching the session ID prefix.
Ingest Conversation — End of Session
At the end of a productive session, you can ingest the key conversation turns with proper speaker attribution:
`bash
curl -s -X POST "$CORTEX_BASE_URL/v1/ingest/conversation" \
-H "x-api-key: $CORTEX_API_KEY" \
-H "Content-Type: application/json" \
-d "$(jq -n \
--arg session_id "openclaw:$(date +%Y-%m-%d):session-topic" \
--argjson messages '[
{"role": "user", "content": "FIRST USER MESSAGE"},
{"role": "assistant", "content": "FIRST ASSISTANT RESPONSE"},
{"role": "user", "content": "SECOND USER MESSAGE"}
]' \
'{messages: $messages, session_id: $session_id}')" | jq '{nodes_created, edges_created, facts: [.facts[].core]}'
`
When to use this:
- After a session with significant decisions or new information
- Do NOT ingest every conversation — only sessions with lasting value
- Summarize or select key turns rather than dumping the entire transcript
- Keep to 5-15 key messages, not the full history
Bootstrap — First Run
On first install, ingest the user's existing MEMORY.md to seed the knowledge graph.
For small MEMORY.md files (under ~50 lines / ~4KB — most users):
`bash
MEMORY_CONTENT=$(cat ~/.openclaw/workspace/MEMORY.md 2>/dev/null || echo "")
if [ -n "$MEMORY_CONTENT" ]; then
curl -s -X POST "$CORTEX_BASE_URL/v1/ingest" \
-H "x-api-key: $CORTEX_API_KEY" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg text "$MEMORY_CONTENT" --arg session_id "openclaw:bootstrap" \
'{text: $text, session_id: $session_id}')" | jq '{nodes_created, edges_created, facts: (.facts | length), entities: (.entities | length)}'
fi
`
For large MEMORY.md files (power users with months of curated facts): Split at markdown heading boundaries (## or ###) and ingest each section separately. Large files sent in a single request may exceed the ingest endpoint's text limit or produce lower-quality extraction.
`bash
Split MEMORY.md at ## headings and ingest each section
MEMORY_FILE=~/.openclaw/workspace/MEMORY.md
if [ -f "$MEMORY_FILE" ]; then
SECTION="" TOTAL_FACTS=0 TOTAL_ENTITIES=0
while IFS= read -r line || [ -n "$line" ]; do
if echo "$line" | grep -q '^## ' && [ -n "$SECTION" ]; then
RESULT=$(curl -s -X POST "$CORTEX_BASE_URL/v1/ingest" \
-H "x-api-key: $CORTEX_API_KEY" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg text "$SECTION" --arg session_id "openclaw:bootstrap" \
'{text: $text, session_id: $session_id}')")
TOTAL_FACTS=$((TOTAL_FACTS + $(echo "$RESULT" | jq '.facts | length')))
TOTAL_ENTITIES=$((TOTAL_ENTITIES + $(echo "$RESULT" | jq '.entities | length')))
SECTION=""
fi
SECTION="$SECTION$line
"
done < "$MEMORY_FILE"
# Ingest final section
if [ -n "$SECTION" ]; then
RESULT=$(curl -s -X POST "$CORTEX_BASE_URL/v1/ingest" \
-H "x-api-key: $CORTEX_API_KEY" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg text "$SECTION" --arg session_id "openclaw:bootstrap" \
'{text: $text, session_id: $session_id}')")
TOTAL_FACTS=$((TOTAL_FACTS + $(echo "$RESULT" | jq '.facts | length')))
TOTAL_ENTITIES=$((TOTAL_ENTITIES + $(echo "$RESULT" | jq '.entities | length')))
fi
echo "Bootstrap complete: $TOTAL_FACTS facts, $TOTAL_ENTITIES entities extracted."
fi
`
Run this once after installation. Tell the user how many facts and entities were extracted.
Error Handling
401 Unauthorized — invalid or missing API key. Ask user to check CORTEX_API_KEY.
422 Validation Error — malformed request. Check the JSON payload.
500 Internal Server Error — Cortex API issue. Retry once, then fall back to native memory_search.
- Network timeout — Cortex is unreachable. Use native memory only and inform the user.
If Cortex is unavailable, always fall back to memory_search. Never block the user because of a Cortex API issue.
Examples
"What company did I join?"
`bash
curl -s -X POST "$CORTEX_BASE_URL/v1/retrieve" \
-H "x-api-key: $CORTEX_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "What company did the user join?", "query_type": "factual", "top_k": 5}' | jq '.results[] | {type, content, score}'
`
"Remember that I prefer PostgreSQL over MySQL"
`bash
curl -s -X POST "$CORTEX_BASE_URL/v1/ingest" \
-H "x-api-key: $CORTEX_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "User prefers PostgreSQL over MySQL for all database projects.", "session_id": "openclaw:preferences"}' | jq '{facts: [.facts[].core], entities: [.entities[].name]}'
`
"How does the auth service relate to the API gateway?"
`bash
curl -s -X POST "$CORTEX_BASE_URL/v1/retrieve" \
-H "x-api-key: $CORTEX_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "How does the auth service relate to the API gateway?", "query_type": "factual", "top_k": 10}' | jq '.results[] | {type, content, score, metadata}'
`
Security
- NEVER output the
CORTEX_API_KEY` value in responses, logs, or tool outputs.
- NEVER include sensitive user data (passwords, tokens, credentials) in text sent to Cortex.
- The Cortex API uses tenant-level database isolation — the user's data is not accessible to other users.
Installation
Terminal bash
openclaw install cortex-memory
Copied!
Tags
#notes_and-pkm
Quick Info
Category File Management
Model Claude 3.5
Complexity One-Click
Author matthewubundi
Last Updated 3/10/2026
🚀
Optimized for
Claude 3.5
Ready to Install?
Get started with this skill in seconds
openclaw install cortex-memory
Related Skills
✓ Verified
💻 Development
4claw
4claw — a moderated imageboard for AI agents.
🧠 Claude-Ready
)}
★ 4.4 (118)
↓ 4,990
v1.0.0
✓ Verified
💻 Development
Aap Passport
Agent Attestation Protocol - The Reverse Turing Test.
🧠 Claude-Ready
)}
★ 4.3 (89)
↓ 4,621
v1.0.0
✓ Verified
💻 Development
Adaptive Suite
A continuously adaptive skill suite that empowers Clawdbot.
🧠 Claude-Ready
)}
★ 4.7 (88)
↓ 1,625
v1.0.0
✓ Verified
💻 Development
Adversarial Prompting
Adversarial analysis to critique, fix.
🧠 Claude-Ready
)}
★ 4.6 (372)
↓ 28,222
v1.0.0