Memory that infers,
updates and forgets.
You hand Esfis what your assistant sees: conversations, files, URLs, notes. It turns them into facts, connects the facts to each other and to time, and gives them back as a profile, a search result, or a file the agent can grep.
What a memory is
Documents are what you send. Memories are what Esfis keeps.
| Documents | Memories | |
|---|---|---|
| What | The raw input you send | The facts Esfis extracts |
| Examples | A chat log, a PDF, a meeting note, a URL | “Alex is a PM at Stripe” |
| Role | Source of truth for retrieval | Personal and entity state over time |
| Lifecycle | You add, update and delete | The graph updates, extends, supersedes and forgets |
One input becomes many memories. Each is atomic, carries enough context to stand alone, and is linked to what the graph already knew about that person, that project, that place. You define no schema and draw no edges.
ONE MESSAGE IN
Had a great call with Alex. He's enjoying the new PM role at Stripe,
though the payments work is intense. He moved to Seattle for the job,
Capitol Hill. Wants dinner next time I'm in town.
FOUR MEMORIES OUT
Alex works at Stripe as a PM · since 2026-08
Alex finds the payments work intense · 2026-09-04
Alex lives in Capitol Hill, Seattle · supersedes: Alex lives in Austin
Alex wants dinner when I'm next in Seattle · open intent
Infers, updates, forgets
Infer
Facts are extracted with the surrounding context and a timestamp. Implicit information counts: “moved for the job” becomes a location fact and a career fact.
Update
When a new fact contradicts an old one, the old one is superseded, not overwritten. The history stays, so you can ask what you knew as of any date.
Forget
Facts decay by relevance and can be pinned or deleted by hand. Deletion is a commit too: audited, reversible until you purge.
Memory blocks
Some things should never depend on retrieval. Blocks are named, evergreen documents injected ahead of recall on every request: who you are, how you like to be answered, what you are working on this quarter.
~/.esfis/blocks/
├── persona.md # how you want assistants to talk to you
├── facts.md # stable facts: name, city, timezone, employer
├── projects.md # what you're working on, updated by the observer
└── team.md # who's who, shared with your Team space
Edit them from the app, from any editor, or let your assistant maintain them for you. Blocks are versioned like everything else.
Recall
Recall runs in four deterministic stages. Every stage is inspectable, and the whole cascade completes in under 50 ms on a laptop.
Keyword
Full-text search over facts and documents. Exact names, dates and identifiers win here.
Meaning
Local embeddings over the same set. Catches paraphrase and intent.
Graph
Expand one hop through linked entities and time. “Dinner in Seattle” pulls in Alex, and Alex pulls in Stripe.
Rerank
A small cross-encoder orders the candidates and trims to a token budget you set.
GET /recall?q=what+should+I+cook+for+Friday&budget=800
200 OK
[
{ "fact": "Dinner with Laura & Dani, Friday 9pm", "score": 0.94, "as_of": "2026-09-08" },
{ "fact": "Laura went gluten-free this spring", "score": 0.81, "as_of": "2026-04-12" },
{ "fact": "Dani doesn't eat shellfish", "score": 0.77, "as_of": "2025-11-30" }
]
Try it
A sample store of twelve memories, the real cascade, running in your browser. Ask it something.
What feeds it
Claude, ChatGPT, Cursor, Perplexity and any MCP client, through the observer.
Markdown, PDF, plain text, email exports. Drop a folder, it stays watched.
Articles and docs you save. Readable text only, images ignored.
POST anything your own agents see. Same pipeline, same store.
Where it runs
| Surface | What you get | Status |
|---|---|---|
| macOS app | Menubar engine, memory browser, block editor, audit timeline | Stable |
| MCP server | Local stdio or remote HTTP with OAuth 2.1 | Stable |
| CLI | esfis recall, esfis log, esfis diff | Stable |
| Browser plugins | ChatGPT and Perplexity injection | Beta |
| Linux / Windows | Engine and CLI, no app yet | Beta |
| iOS | Read and pin memories on the go | Coming |
Our products
Memory Engine
The core: temporal knowledge graph, cascade retrieval, and a git-like commit history for every memory. Runs as a single local binary.
SQLiteGraphAudit trailMCP Layer
One store shared by every assistant, over local stdio or remote HTTP. Explain yourself once.
MCPOAuth 2.1ProxymacOS App
A native manager for your memory: browse what you know, edit blocks, walk the audit timeline. No terminal required.
MenubarGalaxy viewBlocksEnterprise
The same engine on your infrastructure, optionally fully air-gapped, with local LLM and embeddings bundled in one signed binary.
On-premAir-gappedSLA
