esfis

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.

EinaQuè fa
recallquery. 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.
remembertext, kind (fact o instruction) i supersedes opcional. Una frase curta, en tercera persona, en la teva llengua.
forgetid. Desactiva un record. Es queda al magatzem com a història.
memoriesTots 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.