engrim 0.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
engrim-0.7.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tim Gordon
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
engrim-0.7.0/PKG-INFO ADDED
@@ -0,0 +1,401 @@
1
+ Metadata-Version: 2.4
2
+ Name: engrim
3
+ Version: 0.7.0
4
+ Summary: Project-scoped, cross-session memory for AI coding agents — hybrid keyword+semantic retrieval over a tagged SQLite store.
5
+ Author: Tim Gordon
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/timgordontg/engrim
8
+ Keywords: ai,agents,memory,context,retrieval,sqlite,claude-code,llm,rag
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3 :: Only
14
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
15
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: model2vec>=0.3
20
+ Dynamic: license-file
21
+
22
+ # engrim
23
+
24
+ [![CI](https://github.com/timgordontg/engrim/actions/workflows/ci.yml/badge.svg)](https://github.com/timgordontg/engrim/actions/workflows/ci.yml)
25
+ [![Python](https://img.shields.io/badge/python-3.10%2B-blue)](https://www.python.org/)
26
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE)
27
+ [![Local & private](https://img.shields.io/badge/local-%26%20private-brightgreen)](#security--privacy)
28
+
29
+ **Cross-session memory for Claude Code.** A small local store that remembers your project's
30
+ decisions and facts, tags them by repo, and hands your agent just the relevant slice — at the start
31
+ of each session and on every prompt — so you can `/clear` aggressively without losing the *why*
32
+ behind your work.
33
+
34
+ ![engrim live in the Claude Code status bar — 44 curated, clear-safe](docs/status-line.jpg)
35
+
36
+ <sub>engrim, ambient in the Claude Code status bar — it even tells you when it's `✓ clear-safe` to clear.</sub>
37
+
38
+ > **Clearing your agent's context without engrim feels like closing a doc without hitting save.**
39
+ > We've all got the high-school muscle memory of losing an unsaved assignment — so we *don't* clear,
40
+ > we just keep hammering one bloated session. **engrim is the save button.** Externalize your
41
+ > decisions as you go, then clear freely and watch them reload intact.
42
+
43
+ The problem, concretely: an agent's context window is expensive and forgetful. Everything it knows
44
+ about your project either sits in the window (costly, and re-billed every turn) or vanishes when you
45
+ clear. The first thing lost is the rationale that was never written into your code or files. engrim
46
+ keeps that on disk and returns a precise, *meaning-ranked* slice on demand — so your memory grows
47
+ unbounded while the context you actually load stays small.
48
+
49
+ It's the **supercharger to your agent's engine**, not a replacement for it. Claude Code's native
50
+ context handling is excellent; engrim doesn't compete with it — it complements it, and charges it:
51
+ the engine stays lean and fast, engrim holds the deep, queryable, cross-session layer you pull from
52
+ on demand.
53
+
54
+ ```bash
55
+ pip install git+https://github.com/timgordontg/engrim
56
+ engrim setup
57
+ ```
58
+
59
+ That's the whole install. `setup` wires engrim into Claude Code and warms the semantic model once.
60
+ Next session, your agent starts already knowing your project — **and it understands what you *mean***,
61
+ not just keywords you typed. A prompt about *"the database"* surfaces the decision that said
62
+ *"Postgres."*
63
+
64
+ ## Who it's for
65
+
66
+ engrim is built for **heavy, long-horizon work** — the multi-week build where the *why* spans dozens
67
+ of sessions and lives in nobody's head by Friday. Trading systems, data pipelines, gnarly
68
+ migrations, anything you'll `/clear` and resume across days. If that's you, this is the tool that
69
+ would've saved you three months ago.
70
+
71
+ If you do short, one-off sessions, you probably don't need it — and that's fine. engrim earns its
72
+ keep precisely when a project is too big to hold in one window.
73
+
74
+ **It compounds.** The longer and deeper your Claude sessions run, the more decisions and rationale
75
+ engrim has captured — and the more valuable each reload becomes. A fresh project barely needs it; a
76
+ project you've been hammering for weeks has a memory layer no single context window could ever hold,
77
+ handed back to you a relevant slice at a time. Value grows with the depth of the work, exactly when a
78
+ plain context window is hitting its limits.
79
+
80
+ ## Try the save button (60 seconds)
81
+
82
+ Don't take it on faith — prove it to yourself:
83
+
84
+ ```bash
85
+ engrim add -t decision -s "Chose Postgres over Mongo for relational integrity" --tags db
86
+ # ...now /clear your Claude Code session (or close it and open a new one)...
87
+ engrim context # there's your decision, already reloaded and oriented
88
+ ```
89
+
90
+ The first time you clear and watch your context come back, the fear is gone for good.
91
+
92
+ ## See it working — the live status line
93
+
94
+ `engrim setup` adds an ambient line to Claude Code's status bar, so you can *watch* the memory layer
95
+ work without it ever cluttering the chat:
96
+
97
+ ```
98
+ 🧠 engrim · 32 curated · +14 logged · ✎ 2 to capture
99
+ ```
100
+
101
+ - **`32 curated`** — high-signal records in this project's memory (grows when you `add`).
102
+ - **`+14 logged`** — turns recorded to the transcript log *this session*. This **ticks up every turn**:
103
+ even when you're not adding curated records, engrim is capturing the raw back-and-forth for free (zero
104
+ tokens, never loaded into context). It's the live proof that nothing is silently dropping on the floor.
105
+ - **`✎ 2 to capture` / `✓ clear-safe`** — recent decisions that don't yet appear in curated memory. Your
106
+ at-a-glance **"is it safe to `/clear`?"** answer: capture what's flagged, watch it flip to `✓`, then
107
+ clear freely. The pencil is an invitation, not a warning — capturing as you work is normal. (Same honest
108
+ signal as `engrim review`, kept light enough to live in the status bar.)
109
+
110
+ The number that *moves* is the log; the number that *matters long-term* is curated. Seeing both is how
111
+ you learn the rhythm: work, capture the decisions, clear, reload.
112
+
113
+ ## Smart, hot context loading
114
+
115
+ engrim is **retrieval-first by design**, not a notes file that grew a search box. The bet — straight
116
+ out of ML research — is that *learned, query-conditioned selection of what to load* beats stuffing
117
+ everything into the window and hoping the model sorts it out.
118
+
119
+ Retrieval is **hybrid**: every record is embedded when written, and recall fuses keyword relevance
120
+ (SQLite FTS5 / bm25) with semantic similarity (embedding cosine) via reciprocal-rank fusion.
121
+
122
+ - **Keyword** nails exact IDs, symbols, error strings, file names.
123
+ - **Semantic** catches paraphrase and concept — *"how should I reach customers"* finds the record
124
+ about *outreach*, with zero shared words.
125
+ - **Fused**, they beat either alone.
126
+
127
+ Semantic is **on out of the box** — the embedding model (a fast *static* embedder, `model2vec`, no
128
+ GPU and no per-prompt neural pass) ships as a dependency and `engrim setup` warms it for you. Want a
129
+ zero-third-party-dependency, fully-offline posture instead? Set `ENGRIM_EMBED=off` and engrim runs
130
+ pure-lexical on the standard library alone.
131
+
132
+ ## Clear often — keep the context that matters
133
+
134
+ Because engrim persists your project's decisions and reloads them at session start, you can `/clear`
135
+ or `/compact` aggressively to keep your agent fast and lean — *without* losing the context you care
136
+ about:
137
+
138
+ 1. **Capture as you go** — `engrim add ...` the moment a decision or fact lands (your agent can do
139
+ this for you).
140
+ 2. **Clear freely** — when the session gets heavy, `/clear`. The bloat goes; the knowledge stays.
141
+ 3. **Reload lean** — the SessionStart hook injects your project's memory pack, so the next session
142
+ starts oriented in a few hundred tokens instead of dragging a giant window.
143
+
144
+ Externalize → clear → reload. A small, durable store beats a giant, expensive context window — and
145
+ it's lighter on rate limits, latency, *and* output quality (a clean, relevant slice gets sharper
146
+ attention than 100k tokens of accumulated cruft).
147
+
148
+ > **Not sure it's safe to clear?** `engrim review` scans your recent transcript for decisions that
149
+ > aren't in curated memory yet and flags them — so you capture them *before* you clear, not after you
150
+ > realize they're gone. It's deliberately honest: it nudges you when unsure rather than falsely
151
+ > reassuring you, and only says *"looks safe to clear"* when nothing's outstanding.
152
+
153
+ ## "Isn't this just markdown notes / CLAUDE.md?"
154
+
155
+ No — and the difference is the whole point. Markdown memory is great until it outgrows the context
156
+ window, and then it forces a bad trade: **bloat the window, or truncate the file.** (Claude Code
157
+ literally warns you when a memory file gets too big.) engrim removes the choice — your memory grows
158
+ unbounded while the context you load stays small and relevant.
159
+
160
+ | | Markdown files | engrim |
161
+ |---|---|---|
162
+ | **Loading** | the whole file (or truncated) | a budget-capped *relevant slice* |
163
+ | **Retrieval** | "load it all and hope" | hybrid keyword + semantic ranking, on demand |
164
+ | **Scale** | context cost grows until it hits a wall | stays bounded as memory grows 100× |
165
+ | **Structure** | unstructured prose | types, tags, status, recency |
166
+ | **Lifecycle** | rots; you hand-prune | `supersede` stale records, keep history honest |
167
+ | **Multi-project** | per-folder, manual | one store, auto-scoped by project path |
168
+ | **Programmatic** | hand-edit | a queryable DB any tool or hook reads & writes |
169
+
170
+ It's **not anti-markdown and not a replacement** for your agent's md memory. Think *engine and
171
+ supercharger*: your `CLAUDE.md` is the engine — the hot working set your agent loads natively every
172
+ session. engrim is the supercharger bolted alongside — the deep, queryable archive you pull from on
173
+ demand so the window stays small. Clean division of labor: **md = hot working set, db = deep
174
+ archive.** The seed-once context build below establishes that division without you babysitting it.
175
+
176
+ ### Day-1 context build, then db-canonical (seed-once)
177
+
178
+ The first time engrim runs for a project it does a **one-time context build**: it mirrors your
179
+ existing markdown memory (e.g. Claude Code's per-project memory dir) into the store, so day one
180
+ already carries your pre-install history. **After that it steps aside** — the store is canonical,
181
+ sessions read from it, and new knowledge is logged via `engrim add`. It will *not* keep re-importing
182
+ historical md over your live store (that would let stale history overwrite real work). Re-pull md
183
+ deliberately any time with `engrim sync --claude --force`.
184
+
185
+ ```bash
186
+ engrim sync ./docs # build the store from a markdown dir (idempotent; re-runs are safe)
187
+ engrim sync --claude # seed-once from Claude Code's memory dir for this project
188
+ engrim sync --claude --force # deliberately rebuild from md (the only way to re-import)
189
+ ```
190
+
191
+ ## Two tiers: curated memory + the full-conversation log
192
+
193
+ engrim keeps two separate stores so they never compete:
194
+
195
+ 1. **Curated memory** (`memories`) — the decisions/facts/feedback you (or your agent) record. Small,
196
+ high-signal, and the *only* tier loaded into the boot pack. This is what keeps context lean.
197
+ 2. **Transcript log** (`log`) — an append-only record of the raw back-and-forth, **never injected
198
+ into context.** A flight recorder: complete, replayable, queried only on demand.
199
+
200
+ With `engrim setup`, a `Stop` hook tails Claude Code's own transcript JSONL into SQLite after each
201
+ turn — reading only the new bytes (a per-session byte-offset cursor) and de-duping on each turn's
202
+ stable `uuid`, so it's cheap and idempotent. Writing to the log costs **zero tokens and zero
203
+ context** (it's a disk append), so you can `/clear` every single turn and lose nothing. Browse or
204
+ search it with `engrim logs [-q "..."]`.
205
+
206
+ > **engrim does not enlarge Claude's context window** — nothing can. It lets you *use* the window
207
+ > efficiently: load a lean slice, keep the rest on disk, pull more only when you ask. That's the
208
+ > trade that keeps a big chat gentle on session and rate limits instead of re-billing a giant window
209
+ > every turn.
210
+
211
+ ## A global layer that follows you everywhere
212
+
213
+ Most memory is project-specific — *this repo chose Postgres.* But some truths are about **you**, not
214
+ any one repo: who authors your code, how you like commits written, conventions you hold across every
215
+ project. engrim keeps a single **global user-layer** for exactly those and **co-loads it alongside
216
+ whatever project you're in** — so you state them once and they ride into every session, everywhere.
217
+
218
+ ```bash
219
+ engrim add --global -t user -s "Sole author — never add Co-Authored-By trailers"
220
+ ```
221
+
222
+ It's purely additive: the global layer rides *alongside* project memory — the boot pack, the minder,
223
+ and `recall` all span both — never instead of it, and one project's own records never leak into
224
+ another. Budget discipline is unchanged: the global layer flows through the same fair, capped boot
225
+ pack, so it can't bloat your context. This is **vertical layering** (*user ⊕ project*), deliberately
226
+ *not* arbitrary multi-project loading — that would dilute the lean slice that's the whole point. Don't
227
+ want it? `ENGRIM_NO_GLOBAL=1` turns it off and reads go back to project-only.
228
+
229
+ ## How it works
230
+
231
+ - **Store:** one SQLite file with an FTS5 virtual table kept in sync by triggers, plus an embedding
232
+ table for the semantic tier. WAL mode for safe concurrency.
233
+ - **Hybrid recall:** bm25 lexical rank fused with embedding cosine (reciprocal-rank fusion).
234
+ Embeddings are computed once at write time (`add` auto-embeds) and stored; per prompt the minder
235
+ embeds only the short query and does cosine — no per-turn neural pass.
236
+ - **The four-hook loop** (`engrim setup` wires it, idempotently):
237
+ - **SessionStart → `engrim hook`:** on a project's first run, seed-once from file-memory; then
238
+ inject the budget-capped boot pack (you see exactly what was restored). It also reconciles recent
239
+ transcripts, so a session that **crashed or hard-closed** (skipping Stop/SessionEnd) gets its
240
+ dropped tail swept up on the next boot — idempotent.
241
+ - **UserPromptSubmit → `engrim assist`:** the minder. Ranks the store against your prompt and
242
+ injects only the top few records (gated on ≥2 substantive terms; ~150-token cap; hits-only).
243
+ - **Stop → `engrim log --hook`:** tails the transcript JSONL into the append-only `log` table —
244
+ new bytes only, de-duped by `uuid`. Never enters context.
245
+ - **SessionEnd → `engrim sync --claude`:** a final, seed-gated mirror (no-op once seeded).
246
+ - **Boot-pack priority:** `user` → `feedback` → `state` → `decision` → `fact` → `reference`,
247
+ recent-first within each type, capped to a character budget so it loads cheaply.
248
+ - **Perf:** each hook is a short-lived process, off the critical path except UserPromptSubmit, where
249
+ it's invisible against model latency. A project with nothing embedded never pays the model-load
250
+ cost.
251
+
252
+ ## Configuration
253
+
254
+ Everything is controllable by flag or environment variable — nothing is hard-coded.
255
+
256
+ | Env var | Default | Purpose |
257
+ |---|---|---|
258
+ | `ENGRIM_DB` | `~/.engrim/memory.db` | Path to the SQLite store. Point many machines/containers at one shared file. |
259
+ | `ENGRIM_PROJECT` | *(unset)* | A **stable project tag**. Set it so the same project resolves identically across host and containers. |
260
+ | `ENGRIM_EMBED` | *(on)* | Semantic recall. On by default; set to `off` for pure-lexical, zero-third-party-dependency mode. |
261
+ | `ENGRIM_EMBED_MODEL` | `minishlab/potion-base-8M` | The embedding model (any model2vec static model). |
262
+ | `ENGRIM_NO_GLOBAL` | *(unset)* | Set to disable the global user-layer co-load, so reads are project-only. |
263
+
264
+ **Project-tag precedence:** `--project` flag → `$ENGRIM_PROJECT` → **git root of cwd** → cwd.
265
+
266
+ - *git root* means you can launch from any subdirectory of a repo and get the same memory.
267
+ - *`$ENGRIM_PROJECT`* gives a stable tag when paths differ (a host's `/home/you/app` vs a container's `/app`).
268
+
269
+ ## Docker — works *with* and *without* it
270
+
271
+ engrim needs no Docker. But if you live in containers, you can give every container **and** the host
272
+ one shared brain in two steps:
273
+
274
+ 1. **Share the store** — mount one host directory into each container and point `ENGRIM_DB` at it.
275
+ 2. **Stabilize the tag** — set `ENGRIM_PROJECT` so a project resolves the same name everywhere.
276
+
277
+ ```yaml
278
+ # examples/docker-compose.yml
279
+ services:
280
+ app:
281
+ image: your-app
282
+ environment:
283
+ ENGRIM_DB: /memory/memory.db # shared store inside the container
284
+ ENGRIM_PROJECT: my-app # stable tag across host + every container
285
+ volumes:
286
+ - ~/.engrim:/memory # one host dir, shared by all containers
287
+ ```
288
+
289
+ SQLite runs in WAL mode (concurrent readers, serialized writers) — ideal for a shared **local**
290
+ volume. (Avoid a single store over a network filesystem like NFS.)
291
+
292
+ ## Commands
293
+
294
+ | command | what it does |
295
+ |---|---|
296
+ | `engrim setup` | wire the four-hook loop into Claude Code + warm the semantic model (one-time, idempotent) |
297
+ | `engrim add` | write a memory: `-t TYPE -s "summary" [-d detail] [--tags a,b]` (auto-embeds); `--global` writes the user-layer that loads in every project |
298
+ | `engrim recall -q "..."` | hybrid keyword + semantic recall for the current project |
299
+ | `engrim assist` | **the minder** — UserPromptSubmit hook: auto-inject the relevant slice for a prompt |
300
+ | `engrim context` | priority-ordered, budget-capped session-boot pack |
301
+ | `engrim review` | **"safe to clear" coverage check** — flags recent decisions in the log not yet in curated memory |
302
+ | `engrim sync [DIR\|--claude]` | seed-once md→store mirror (upsert + reconcile); `--force` to rebuild |
303
+ | `engrim import <path>` | bulk-import markdown notes as records (insert-only) |
304
+ | `engrim embed` | backfill embeddings (rarely needed — `add` auto-embeds; use after a model change) |
305
+ | `engrim logs [-q "..."]` | browse/search the transcript log (kept out of the boot pack) |
306
+ | `engrim supersede --id N` | mark a record `superseded`/`done` |
307
+ | `engrim list` · `projects` · `stats` | browse and summarize (stats reports context economics) |
308
+ | `engrim mcp` | run engrim as an [MCP server](#use-it-as-an-mcp-server) (stdio) for any MCP client |
309
+
310
+ Record types: `decision`, `fact`, `feedback`, `state`, `user`, `reference`. Stale records are
311
+ `supersede`d rather than deleted, so history stays honest.
312
+
313
+ ## Use it as an MCP server
314
+
315
+ Prefer wiring engrim in over the [Model Context Protocol](https://modelcontextprotocol.io)? It ships
316
+ a server too — no extra dependency, just the stdio transport (newline-delimited JSON-RPC) over
317
+ engrim's zero-dep core:
318
+
319
+ ```bash
320
+ claude mcp add engrim -- engrim mcp # Claude Code
321
+ ```
322
+
323
+ …or point any MCP client at the `engrim mcp` command. It exposes three tools backed by the exact
324
+ recall / boot-pack / write logic the CLI uses:
325
+
326
+ | tool | does |
327
+ |---|---|
328
+ | `engrim_recall` | hybrid keyword + semantic search over the project's records |
329
+ | `engrim_context` | the curated, budget-capped session-boot pack |
330
+ | `engrim_add` | write a durable record (`decision`/`fact`/`feedback`/`state`/`user`/`reference`) |
331
+
332
+ Project scope is the client's working directory by default (`"auto"`), same as the CLI. The hook
333
+ loop and the MCP server are two front doors to one store — use either, or both.
334
+
335
+ ## Security & privacy
336
+
337
+ engrim is built to be safe to run without a second thought. Full posture in [SECURITY.md](SECURITY.md).
338
+
339
+ - **No telemetry, never phones home.** engrim itself opens no sockets. The *one* exception is a
340
+ one-time download of the embedding model from HuggingFace on first run (cached forever after, then
341
+ fully offline). Run `ENGRIM_EMBED=off` for a no-network, pure-standard-library posture.
342
+ - **Minimal dependencies.** The core is pure standard library; the semantic tier adds `model2vec`
343
+ and its well-known ML deps (numpy, safetensors, tokenizers, huggingface-hub). Lexical mode pulls
344
+ none of them.
345
+ - **No dangerous primitives.** No `eval`/`exec`/`pickle`/`subprocess`/shell, and no `yaml.load`
346
+ (frontmatter is parsed by hand) — the classic RCE vectors are designed out.
347
+ - **No SQL-injection surface.** Every input is bound via `?`; search terms are tokenized/quoted
348
+ before reaching SQLite, so code symbols and punctuation can't inject query operators.
349
+ - **Private on disk.** The store is created owner-only (`0600`) on POSIX.
350
+ - **Your data never ships to git.** `*.db` is gitignored; you commit the tool, never your memory.
351
+
352
+ ## Testing
353
+
354
+ A real test suite covers persistence, hybrid + semantic recall, supersession, the boot pack, the
355
+ hook JSON contract, git-root tagging, and the env overrides. CI runs it across Python 3.10–3.13.
356
+
357
+ ```bash
358
+ pip install pytest
359
+ pytest -q
360
+ ```
361
+
362
+ ## Limitations & edge cases (the honest list)
363
+
364
+ engrim is small and opinionated on purpose. Known edges, stated plainly:
365
+
366
+ - **It remembers what gets *recorded*, not everything you say.** This is the most important one.
367
+ Curated memory holds what you (or the agent) `add`; the boot pack and the minder only surface
368
+ *that*. If a decision is discussed but never recorded before the session closes, it isn't in
369
+ curated memory — capture matters. (The transcript `log` keeps the raw back-and-forth, but it's a
370
+ flight recorder you query deliberately, not what the minder reasons over.)
371
+ - **Retrieval, not comprehension.** The minder ranks records by relevance to your prompt — fast and
372
+ good, but it doesn't *understand* them. Hybrid ranking can still over-weight a stray keyword match
373
+ on very abstract queries; rerank and adaptive fusion are on the [roadmap](ROADMAP.md).
374
+ - **First-run model download.** The semantic tier fetches a small model from HuggingFace once
375
+ (`engrim setup` does this up front with a visible message). Offline/locked host? `ENGRIM_EMBED=off`
376
+ runs lexical with no network.
377
+ - **It doesn't enlarge the context window.** Nothing can. It lets you *use* the window efficiently.
378
+ - **Monorepos:** git-root tagging treats the whole repo as one project. For per-package memory, set
379
+ `ENGRIM_PROJECT` per package.
380
+ - **Docker on macOS/Windows:** SQLite over a Docker Desktop **bind mount** can hit filesystem-locking
381
+ flakiness. Use a **named volume** there; native Linux bind mounts are fine.
382
+ - **Single-user by design.** No auth or multi-tenant model — it's your local memory, not a team server.
383
+ - **Moved a project folder?** Memory stays under the old path tag. Re-tag by exporting/re-adding, or
384
+ pin a stable `ENGRIM_PROJECT`.
385
+
386
+ ## Agent support
387
+
388
+ engrim's core is **agent-agnostic** — a CLI over a SQLite file, so anything that can run a shell
389
+ command can use it. The *auto-load* integration (hooks that inject memory automatically) is
390
+ **Claude Code-first** in these early releases; the brain is universal, only that adapter is
391
+ per-agent. Broader provider support is on the [roadmap](ROADMAP.md). **Open SQLite, no lock-in.**
392
+
393
+ ## Why it's free
394
+
395
+ engrim is MIT-licensed and free because the people doing the hardest builds shouldn't have to lose
396
+ their context to do them. If it saves you a fraction of what it would've saved me, that's the point.
397
+ Ideas and pull requests welcome.
398
+
399
+ ## License
400
+
401
+ MIT © 2026 Tim Gordon. Not affiliated with Anthropic.