# Show HN: Engrim – A universal, local-first SQLite memory engine for AI CLIs

> Source: <https://github.com/timgordontg/engrim>
> Published: 2026-09-07 04:49:36+00:00

**The Universal Cross-Model & Cross-Agent Episodic Memory Store.**

A local-first, project-scoped SQLite memory engine that allows developers to freely switch between models and environments (**Google Antigravity**, **Claude Code**, **Cursor MCP**, **Windsurf**) on the **SAME** project without losing architectural decisions, user constraints, or project state.

**"Why pay for 200,000 tokens of forgotten noise on every turn? The models are disposable utilities; your project's decisions are not."**

As context windows scale to 1M+ tokens, developers face **attention dilution**: reasoning degrades, cost multiplies with every conversational turn, and clearing context causes total amnesia.

`engrim` replaces attention dilution with **4,000 characters of curated episodic working memory**:

- **Switzerland of AI Memory** : Decouples project intelligence from any single AI vendor or proprietary cloud silo. Switch from Gemini 3.8 in Antigravity to Claude 3.7 Sonnet in Claude Code to GPT-4o in Cursor mid-project — your agents pick up right where the others left off.
- **Save Button for Autonomous Coding** : Externalize decisions, constraints, and state as you work. Clear your agent session freely (`/clear` ) and watch context reload intact.
- **Smart, Hot Context Loading** : Combines SQLite FTS5 (bm25 keyword search) with static vector embeddings (`model2vec` ) in a zero-latency hybrid reciprocal-rank fusion engine.

**Tested across 105 continuous sessions on a 50,000-line algorithmic trading system. Zero regressions across 186 unit tests, zero context amnesia across model switches.**

In production testing on an active algorithmic trading codebase running real capital:

- Over **153,000 tokens of work** across days of architecture, parameter tuning, and debugging was consolidated into an active memory pack under**1,000 tokens** (<1% of the context window).
- That is a **99%+ cut in reloaded context cost** on every session restart.
- Seamlessly switched between Google Antigravity CLI, Claude Code, and Cursor MCP on identical repos with zero model drift or architectural regression.

```
graph TD
    subgraph Agents ["Supported Agent Environments"]
        AGY["Google Antigravity<br/>(PreInvocation & Stop Hooks)"]
        CLAUDE["Claude Code<br/>(SessionStart & Stop Hooks)"]
        CURSOR["Cursor / Windsurf<br/>(Model Context Protocol stdio)"]
    end

    subgraph CoreEngine ["engrim Core Engine (v1.3.0)"]
        ADAPTERS["Adapters & Hooks<br/>(agy, claude, mcp)"]
        PROVENANCE["Agent Provenance Engine<br/>(origin_agent tracking)"]
        ROUTER["Hybrid Retrieval & Minder<br/>(bm25 lexical + vector cosine)"]
    end

    subgraph Storage ["Local-First SQLite Store (~/.engrim/memory.db)"]
        MEMORIES[("Curated Memories<br/>(decisions, facts, feedback)")]
        FTS5["FTS5 Full-Text Search<br/>(porter stemmer, triggers)"]
        VEC["Vector Embeddings<br/>(model2vec static embeddings)"]
        LOG["Flight Recorder Log<br/>(turns + action lines)"]
    end

    AGY <-->|"hook / CLI"| ADAPTERS
    CLAUDE <-->|"hook / CLI"| ADAPTERS
    CURSOR <-->|"JSON-RPC (stdio)"| ADAPTERS
    ADAPTERS --> PROVENANCE
    PROVENANCE --> ROUTER
    ROUTER --> MEMORIES
    MEMORIES --- FTS5
    MEMORIES --- VEC
    ADAPTERS --> LOG
pip install engrim
```

Run `engrim setup` without arguments. It automatically detects installed environments on your machine and configures them all:

```
engrim setup
```

- If `~/.gemini` exists$\rightarrow$ wires Antigravity lifecycle hooks, skill, and MCP server.
- If `~/.claude` exists$\rightarrow$ wires Claude Code SessionStart, Stop, status line, and CLAUDE.md.
- If `~/.cursor` exists$\rightarrow$ generates and merges Cursor MCP configuration.

```
engrim setup --agy
```

- Configures `~/.gemini/config/hooks.json` to execute`engrim hook --agent agy --event boot` on`PreInvocation` and`engrim hook --agent agy --event stop` on`Stop` .
- Deploys the canonical Antigravity skill to `~/.gemini/config/skills/engrim/SKILL.md` .
- Registers the MCP server in `~/.gemini/antigravity-cli/mcp_config.json` and`~/.gemini/config/mcp_config.json` .

```
engrim setup --claude
```

- Wires `SessionStart` ,`SessionEnd` ,`Stop` , and`UserPromptSubmit` hooks in`~/.claude/settings.json` .
- Configures live ambient status line in Claude Code's status bar.
- Appends memory usage notes to `~/.claude/CLAUDE.md` .

```
engrim setup --cursor
```

- Adds `engrim` to`~/.cursor/mcp.json` running`engrim serve --mcp` .

Add `engrim` to your `~/.codeium/windsurf/mcp_config.json`:

```
{
  "mcpServers": {
    "engrim": {
      "command": "engrim",
      "args": ["serve", "--mcp"]
    }
  }
}
engrim setup --all
```

- Configures every supported environment in one command.

*(Use `--dry-run` with any setup command to inspect changes without modifying disk).*

When multiple agents collaborate on a single codebase, provenance matters. `engrim` records the origin of every memory entry with the `origin_agent` field:

- Allowed values: `antigravity` ,`claude-code` ,`cursor` ,`cli` , or`user` .
- Automatically populated based on the active hook, MCP client, or CLI session.
- Subtly surfaced in `engrim context` and`engrim list` :

```
🧠 engrim · memory restored for this project — you don't have to re-explain · /workspace
  18 of 54 curated records loaded (~3850 chars) · the rest one `recall` away

[DECISION]
- #961 [DECISION] (via Antigravity): Inverted stop loss matrix for high volatility  (risk, execution)
- #942 [DECISION] (via Claude Code): Switched primary database from MongoDB to PostgreSQL  (db, schema)
- #910 [DECISION] (via Cursor): Standardized on Pydantic v2 schemas across API boundaries  (api, types)
```

Existing databases are non-destructively migrated on first access via `ALTER TABLE memories ADD COLUMN origin_agent TEXT`.

Launch the zero-dependency, JSON-RPC 2.0 stdio MCP server:

```
engrim serve --mcp
# or: engrim mcp
```

`stdout` is strictly reserved for JSON-RPC messages, redirecting all diagnostic logs to `stderr`.

| Tool | Signature | Purpose | 
|---|---|---|
| `engrim_recall` | `(query: str, project: str = "auto", k: int = 5, type: str = None)` | Hybrid (keyword + semantic) search over project memory. | 
| `engrim_add` | `(type: str, summary: str, detail: str = None, tags: list[str] = [])` | Write a durable memory record persisted across sessions. | 
| `engrim_context` | `(project: str = "auto", budget: int = 4000)` | Retrieve the session-boot memory pack within a character budget. | 
| `engrim_review` | `(project: str = "auto")` | Check uncaptured decisions from transcript logs before clearing. | 

| Command | Usage | Description | 
|---|---|---|
| `engrim add` | `engrim add -t decision -s "..." [--origin-agent agy]` | Insert memory record (types: `decision` ,`fact` ,`feedback` ,`state` ,`user` ,`reference` ). | 
| `engrim recall` | `engrim recall -q "database"` | Ranked hybrid recall for the project ( `--log` searches raw turns). | 
| `engrim context` | `engrim context [-b 4000]` | Priority-ordered, budget-capped session-boot pack. | 
| `engrim hook` | `engrim hook --agent agy --event boot` | Agent lifecycle hook runner for Antigravity and Claude Code. | 
| `engrim setup` | `engrim setup [--agy\|--claude\|--cursor\|--all]` | Universal multi-agent environment configuration. | 
| `engrim serve` | `engrim serve --mcp` | Start stdio MCP server for agent integrations. | 
| `engrim review` | `engrim review` | "Safe to clear" coverage check: scans logs for uncurated decisions. | 
| `engrim list` | `engrim list [-k 20]` | List recent memories for the current project. | 
| `engrim supersede` | `engrim supersede --id 12 --status superseded` | Mark a record superseded without erasing history. | 
| `engrim sync` | `engrim sync [DIR]` | Mirror markdown memories into the store (idempotent seed-once). | 

1. **Capture as you work** : Whenever a major decision or architectural rule is made, run`engrim add` or invoke`engrim_add` via your agent.
2. **Use `resume-pointer`** : Before ending a session or clearing, add a record tagged`resume-pointer` describing the immediate next task. The newest pointer is pinned under`[▶ RESUME HERE]` at the top of the next session's boot pack.
3. **Verify with `engrim review`** : Check that all recent decisions are captured.
4. **Clear freely (`/clear`)** : The session window is wiped clean;` engrim` automatically re-injects the active memory pack on the next prompt or invocation.

- **100% Local & Offline** : All memory records and logs reside in a local SQLite file (`~/.engrim/memory.db` ). No telemetry, no cloud sync, no tracking.
- **Model Storage** : Uses`model2vec` for local static embeddings (~30ms load time, no GPU required, runs on CPU). Can run pure-lexical (`ENGRIM_EMBED=off` ) for zero extra dependencies.
- **POSIX File Permissions** : Databases are created with restricted owner-only permissions (`0600` ).
- **Git Protection** :`*.db` is gitignored by default; your memories never accidentally commit to version control.

MIT © 2026 Tim Gordon.
