Documentació
Com es connecta esfis als teus assistents i què hi pots fer. Això descriu el que fa l'app avui, no el que farà.
Accés
esfis encara no és públic. És una app de macOS: ./build-app.sh genera Esfis.app i deixa el binari a ~/.esfis/bin/esfis, que és el que criden els assistents.
Demana-hi accés i digues quins assistents fas servir. T'escriurem quan et toqui.
Connectar-hi per MCP
Qualsevol client MCP pot llegir i escriure a la memòria. A Claude Code:
claude mcp add --scope user esfis -- ~/.esfis/bin/esfis --mcp
A Claude Desktop, Cursor i companyia, que demanen un fitxer de configuració:
{
"mcpServers": {
"esfis": { "command": "/Users/<tu>/.esfis/bin/esfis", "args": ["--mcp"] }
}
}
El servidor parla JSON-RPC per l'entrada estàndard. No obre cap port, no fa cap petició a la xarxa i no demana cap clau.
A l'initialize, esfis retorna les teves instruccions permanents al camp instructions, que és el que els clients posen al context tots sols. És el que fa que l'assistent hi llegeixi i hi escrigui sense que li ho demanis.
Les quatre eines
Qui decideix què val la pena desar és l'assistent que ja tens obert. La política d'extracció viu a la descripció de remember, que és el que es llegeix abans de cridar-la; esfis només desa i recupera.
| Eina | Què fa |
|---|---|
recall | query. Retorna primer les instruccions permanents i després, com a molt, vuit fets rellevants, cadascun amb l'id i la data en què es va actualitzar. |
remember | text, kind (fact o instruction) i supersedes opcional. Una frase curta, en tercera persona, en la teva llengua. |
forget | id. Desactiva un record. Es queda al magatzem com a història. |
memories | Tots els records actius, els nous primer. Per a la resta, recall. |
remember fa dues coses pel seu compte. Si la frase ja hi és gairebé igual, no la desa i respon quin id ja la conté. I si en desa una amb supersedes, desactiva la vella i l'hi apunta. Els records semblants tornen amb cada resposta, perquè l'assistent pugui substituir en comptes d'acumular contradiccions.
Un fet només surt quan la pregunta el toca. Una instrucció viatja sempre, perquè és l'encàrrec que s'ha de seguir tant si la pregunta hi té a veure com si no.
Línia d'ordres
El mateix magatzem, des del terminal:
esfis --recall "on viu l'Alex" # els fets rellevants, amb puntuació i data
esfis --add "..." # desa un record a mà
esfis --import [carpeta...] # els .md de memòria dels assistents
esfis --list # tot, actius i desactivats
esfis --mcp # el servidor, per l'entrada estàndard
Importar memòria que ja tens
Els assistents ja desen fets en fitxers: un .md per fet, amb frontmatter, dins de ~/.claude/projects/<projecte>/memory/. Són bons records, però cadascun només es veu des del projecte on es va escriure.
esfis --import # ~/.claude/projects
esfis --import ~/notes ~/altra/mem # o les carpetes que diguis
Recorre les carpetes, agafa tot .md que tingui description: al frontmatter i el desa. Un type: feedback entra com a instrucció; la resta, com a fets.
El .md continua sent el teu: llegible, editable a mà, i la font. Es pot tornar a passar sempre que vulguis, perquè cada record recorda de quin fitxer ve: la segona passada no duplica res, i un fitxer que hagis editat substitueix la versió vella en comptes d'afegir-se-li.
On viu tot
~/.esfis/
memory.db el magatzem (SQLite, una taula)
log.jsonl una línia per canvi: add · supersede · forget · delete
bin/esfis el binari que criden els assistents
Un record és una fila. Sense subject/predicate/object, sense entitats, sense graf: el model entén la frase.
{ "id": 184,
"text": "En Francesc prefereix TypeScript per al projecte esfis.",
"created_at": "2026-09-10", "updated_at": "2026-09-10",
"active": true, "kind": "fact", "source": "mcp" }
El log.jsonl és afegir i prou, una línia per canvi, al costat de la base de dades: es pot fer grep, es pot comparar, i és teu si algun dia la base de dades se'n va.
Observa
L'altre camí: enganxar una conversa a la pestanya Observa de l'app i que el model en tregui els records. Amb l'MCP connectat no et cal, i aquest sí que gasta: són dues crides a l'API d'Anthropic amb la teva clau, que es desa al clauer.
La primera crida n'extreu entre zero i cinc frases; zero és una resposta bona i freqüent. La segona, per a cada candidata, recupera els records actius més semblants i decideix ADD, SUPERSEDE o IGNORE.
Si alguna cosa no va
L'assistent no recupera res
Comprova amb claude mcp get esfis que el servidor hi és i que diu «Connected». Si l'acabes d'afegir, reinicia el client: la llista d'eines es llegeix un sol cop, quan arrenca.
Recupera menys del que esperava
És a posta: si la pregunta no toca res del que sap, no retorna res. El rànquing surt de dos senyals i es queda entre tres i vuit records; el mig fet que hi té a veure de lluny es queda fora perquè no valia el context.
Una memòria ha quedat malament
Digues-li a l'assistent que ho oblidi i cridarà forget amb l'id. El record es desactiva, però no s'esborra: continua al magatzem i al log.jsonl.
Vull veure-ho tot de cop
esfis --list ho treu tot, actius i desactivats, amb l'id. La pestanya Recorda de l'app fa el mateix amb la finestra oberta.

