home / skills / openclaw / skills / engram

engram skill

/skills/dannydvm/engram

This skill enables semantic search over a local Markdown knowledge base using embeddings to reveal contextually relevant results.

npx playbooks add skill openclaw/skills --skill engram

Review the files below or copy the command above to add this skill to your agents.

Files (2)
SKILL.md
7.0 KB
---
name: engram
description: Persistent semantic memory layer for AI agents. Local-first storage (SQLite+LanceDB) with Ollama embeddings. Store and recall facts, decisions, preferences, events, relationships across sessions. Supports memory decay, deduplication, typed memories (5 types), memory relationships (7 graph relation types), agent/user scoping, semantic search, context-aware recall, auto-extraction from text (rules/LLM/hybrid), import/export, REST API, MCP protocol. Solves context window and compaction amnesia. Server at localhost:3400, dashboard at /dashboard. Install via npm (engram-memory), requires Ollama with nomic-embed-text model.
requires:
  bins:
    - engram
install:
  npm: engram-memory
  setup: |
    # Install Ollama and embedding model
    brew install ollama  # macOS
    ollama pull nomic-embed-text
    
    # Start server (run as daemon or manually)
    engram serve
---

# Engram: Persistent Memory for AI Agents

Engram gives you **durable semantic memory** that survives sessions, compaction, crashes. All local, no cloud, no token cost.

## Boot Sequence (MANDATORY)

**On every session start**, run:
```bash
engram search "<current task context>" --limit 10
```

Example: `engram search "client onboarding status churn risk" --limit 10`

This recalls relevant memories from previous sessions before you start work.

## Storing Memories

**5 memory types:** `fact` | `decision` | `preference` | `event` | `relationship`

```bash
# Facts — objective information
engram add "API rate limit is 100 req/min" --type fact --tags api,limits

# Decisions — choices made
engram add "We chose PostgreSQL over MongoDB for better ACID" --type decision --tags database

# Preferences — user/client likes/dislikes
engram add "Dr. Steph prefers text over calls" --type preference --tags dr-steph,communication

# Events — milestones, dates
engram add "Launched v2.0 on January 15, 2026" --type event --tags launch,milestone

# Relationships — people, roles, connections  
engram add "Mia is client manager, reports to Danny" --type relationship --tags team,roles
```

**When to store:**
- Client status changes (churn risk, upsell opportunity, complaints)
- Important decisions made about projects/clients
- Facts learned during work (credentials, preferences, dates)
- Milestones completed (onboarding steps, launches)

## Searching

**Semantic search** (finds meaning, not just keywords):
```bash
# Basic search
engram search "database choice" --limit 5

# Filter by type
engram search "user preferences" --type preference --limit 10

# Filter by agent (see only your memories + global)
engram search "project status" --agent theo --limit 10
```

## Context-Aware Recall

**Recall** ranks by: semantic similarity × recency × salience × access frequency

```bash
engram recall "Setting up new client deployment" --limit 10
```

Better than search when you need **the most relevant memories for a specific context**.

## Memory Relationships

**7 relation types:** `related_to` | `supports` | `contradicts` | `caused_by` | `supersedes` | `part_of` | `references`

```bash
# Manual relation
engram relate <memory-id-1> <memory-id-2> --type supports

# Auto-detect relations via semantic similarity
engram auto-relate <memory-id>

# List relations for a memory
engram relations <memory-id>
```

Relations boost recall scoring — well-connected memories rank higher.

## Auto-Extract from Text

**Ingest** extracts memories from raw text (rules-based by default, optionally LLM):

```bash
# From stdin
echo "Mia confirmed client is happy. We decided to upsell SEO." | engram ingest

# From command
engram extract "Sarah joined as CTO last Tuesday. Prefers async communication."
```

Uses memory types, tags, confidence scoring automatically.

## Management

```bash
# Stats (memory count, types, storage size)
engram stats

# Export backup
engram export -o backup.json

# Import backup
engram import backup.json

# View specific memory
engram get <memory-id>

# Soft delete (preserves for audit)
engram forget <memory-id> --reason "outdated"

# Apply decay manually (usually runs daily automatically)
engram decay
```

## Memory Decay

Inspired by biological memory:
- Every memory has **salience** (0.0 → 1.0)
- Daily decay: `salience *= 0.99` (configurable)
- Accessing a memory boosts salience
- Low-salience memories fade from search results
- Nothing deleted — archived memories can be recovered

## Agent Scoping

**4 scope levels:** `global` → `agent` → `user` → `session`

By default:
- Agents see their own memories + global memories
- `--agent <agentId>` filters to specific agent
- Scope isolation prevents memory bleed between agents

## REST API

Server runs at `http://localhost:3400` (start with `engram serve`).

```bash
# Add memory
curl -X POST http://localhost:3400/api/memories \
  -H "Content-Type: application/json" \
  -d '{"content": "...", "type": "fact", "tags": ["x","y"]}'

# Search
curl "http://localhost:3400/api/memories/search?q=query&limit=5"

# Recall with context
curl -X POST http://localhost:3400/api/recall \
  -H "Content-Type: application/json" \
  -d '{"context": "...", "limit": 10}'

# Stats
curl http://localhost:3400/api/stats
```

**Dashboard:** `http://localhost:3400/dashboard` (visual search, browse, delete, export)

## MCP Integration

Engram works as an MCP server. Add to your MCP client config:

```json
{
  "mcpServers": {
    "engram": {
      "command": "engram-mcp"
    }
  }
}
```

**MCP tools:** `engram_add`, `engram_search`, `engram_recall`, `engram_forget`

## Configuration

`~/.engram/config.yaml`:

```yaml
storage:
  path: ~/.engram

embeddings:
  provider: ollama           # or "openai"
  model: nomic-embed-text
  ollama_url: http://localhost:11434

server:
  port: 3400
  host: localhost

decay:
  enabled: true
  rate: 0.99                 # 1% decay per day
  archive_threshold: 0.1

dedup:
  enabled: true
  threshold: 0.95            # cosine similarity for dedup
```

## Best Practices

1. **Boot with recall** — Always `engram search "<context>" --limit 10` at session start
2. **Type everything** — Use correct memory types for better recall ranking
3. **Tag generously** — Tags enable filtering and cross-referencing
4. **Ingest conversations** — Use `engram ingest` after important exchanges
5. **Let decay work** — Don't store trivial facts; let important memories naturally stay salient
6. **Use relations** — `auto-relate` after adding interconnected memories
7. **Scope by agent** — Keep agent memories separate for clean context

## Troubleshooting

**Server not running?**
```bash
engram serve &
# or install as daemon: see ~/.engram/daemon/install.sh
```

**Embeddings failing?**
```bash
ollama pull nomic-embed-text
curl http://localhost:11434/api/tags  # verify Ollama running
```

**Want to reset?**
```bash
rm -rf ~/.engram/memories.db ~/.engram/vectors.lance
engram serve  # rebuilds from scratch
```

---

**Created by:** Danny Veiga ([@dannyveigatx](https://x.com/dannyveigatx))  
**Source:** https://github.com/Dannydvm/engram-memory  
**Docs:** https://github.com/Dannydvm/engram-memory/blob/main/README.md

Overview

This skill provides semantic search over a local knowledge base of Markdown files using Pinecone and Gemini embeddings. It turns a folder of notes (for example an Obsidian vault) into a searchable memory that finds conceptually relevant passages, not just keyword matches. Use it to surface context, related notes, and concise excerpts for agent reasoning or user queries.

How this skill works

The skill indexes Markdown files by embedding their content with Gemini and storing vectors in Pinecone. It exposes two tools: one to build or update the index from your local folder, and another to run natural-language queries that return top-k results with relevance scores. Results are ranked by semantic similarity, and you can filter by minimum score or limit the number of returned passages.

When to use it

  • You need to search a personal knowledge base or project notes by meaning rather than exact words.
  • You want an agent to reference local documentation, design notes, or archived content during tasks.
  • You want fast retrieval of related passages to support context-aware replies or summarization.
  • You need to keep a searchable backup or archive of Markdown content for offline use.
  • You want to augment an assistant with long-term memory sourced from local files.

Best practices

  • Run the index tool after major edits or periodically to keep embeddings synchronized with file changes.
  • Split long documents into logical chunks (headings or sections) so results are granular and focused.
  • Set a sensible top_k (3–10) to balance relevance and response length for agent consumption.
  • Tune min_score to filter out weak matches; start around 0.2–0.3 and adjust based on quality.
  • Exclude or tag sensitive files before indexing to avoid unintended retrieval.

Example use cases

  • Ask an agent to locate design decisions across archived project notes and return the supporting passages.
  • Search meeting notes to find action items and relevant context for follow-up tasks.
  • Provide a writer with related research snippets from a personal library of Markdown drafts.
  • Enable a chatbot to cite local policy documents or SOPs when answering compliance questions.
  • Create an offline searchable archive of all versions of notes for audit and recovery purposes.

FAQ

How do I keep the index up to date?

Run the index tool after changes or schedule periodic updates; it builds or refreshes embeddings from the local Markdown folder.

What do top_k and min_score control?

top_k limits the number of returned results; min_score filters results below a relevance threshold to remove weak matches.

Can I exclude files from indexing?

Yes. Remove or tag files you don't want included before running the index tool so they are not embedded or stored.