Your coding agent solved this once. It found the failing test, tried the obvious fix, rejected it, learned the weird constraint, and made a decision. Then the session ended. Next week, a new agent meets the same project as if none of that happened.
Try it now
curl -fsSL https://huggingface.co/buckets/huggingface/funes/resolve/install.sh | sh
funes add codex # or: claude, pi, hermes
That builds the first index, registers the tools, and installs hooks so new turns are indexed automatically. Query directly:
funes recall "why did we switch off the streaming parser"
funes get <session_id> --from 40 --to 60
funes ask claude "what did we decide about the storage layout"
recall returns ranked passages from real sessions. ask retrieves locally, then asks the selected agent to answer from those passages.
Privacy first and local by default
Agent traces can contain local paths, stack traces, unreleased plans, and sometimes pasted credentials. Indexing is deterministic: parse → chunk → embed locally → store as a Lance dataset. There is no LLM in that path. The embedding model is pinned and recorded so funes refuses to query a memory built with an incompatible model. When TruffleHog is available, indexing redacts detected credentials; on funes push, a fail-closed scan holds back any block that still contains a secret.
Why Lance
funes stores memory as one growing table. Every completed turn adds chunks with original text, provenance, and vectors. Lance holds data, BM25 and vector indexes, and versions in one dataset directory—append without rewrite, roll back versions, and keep indexes with the data. On recall, funes combines vector search and BM25, then reranks with recency weighting. Deterministic chunk IDs make re-indexing cheap: already-written chunks are not re-embedded.
The takeaway
funes is not a knowledge base that rewrites your history. It is a local recall layer for the work your agents already did.
funes recall "what did we already learn here?"
Source: huggingface.co/blog/ariG23498/funes-lance