Memòria que desa,
substitueix i oblida.
L'assistent que ja tens obert veu la conversa, decideix què val la pena recordar i ho desa. Quan després li preguntes una altra cosa, esfis li torna només el que hi té a veure. Tot passa a la teva màquina i no costa res.
Què és un record
Una frase. I prou.
Sense subject/predicate/object, sense entitats, sense graf: el model entén la frase, que és per a qui està escrita. Un record és una fila d'una taula de SQLite amb el text, dues dates, si és actiu, d'on ve i el seu vector.
UN MISSATGE A DINS
Molt bona trucada amb l'Alex. Està content amb la feina nova de PM a
Stripe, tot i que el món dels pagaments és intens. S'ha mudat al
Poblenou per la feina. Vol que sopem el pròxim cop que hi passi.
QUATRE RECORDS A FORA
L'Alex treballa a Stripe, de product manager · 2026-08
A l'Alex la feina de pagaments li sembla intensa · 2026-09-04
L'Alex viu al Poblenou, Barcelona · substitueix: viu a Girona
L'Alex vol sopar quan passi per Barcelona · pendent
Cada frase s'aguanta sola i diu de qui parla pel seu nom. Un record que necessita la conversa per entendre's no serveix d'aquí a tres mesos.
Desa, substitueix, oblida
Desa
L'assistent crida remember quan hi ha alguna cosa que encara importarà la setmana que ve. La majoria de torns no en generen cap, i això és una resposta bona.
Substitueix
Si la frase nova contradiu una de vella, la vella es desactiva i apunta cap a la nova. Ningú no esborra res: tens memòria temporal sense haver construït cap sistema temporal.
Oblida
forget desactiva un record quan li dius que és fals. Es queda al magatzem i al log.jsonl, una línia per canvi, per si te'n penedeixes.
Perquè això funcioni, remember no desa a cegues: si la frase ja hi és gairebé igual, respon quin id ja la conté en comptes de duplicar-la, i amb cada resposta torna els records semblants perquè l'assistent pugui substituir en comptes d'acumular contradiccions.
Fets i instruccions
Hi ha coses que no haurien de dependre de si la pregunta hi encaixa. Un fet es busca; una instrucció viatja sempre, perquè és l'encàrrec que l'assistent ha de seguir tant si la pregunta hi té a veure com si no.
instrucció Quan em donis codi, no m'expliquis què fa línia a línia.
instrucció Ves al gra: primer la resposta, després el perquè.
fet En Francesc prefereix TypeScript per al projecte esfis.
fet L'Alex viu al Poblenou, Barcelona.
Les instruccions van al davant de cada recall i també al camp instructions de l'initialize del servidor MCP, que és el que els clients posen al context tots sols. Per això han de ser curtes: les pagues a cada petició.
Recuperar
Tot local, sense xarxa ni cost: BM25 sobre el magatzem, vectors de NLEmbedding (els models que ja porta el sistema) i entre tres i vuit records com a molt. Si la pregunta no toca res del que sap, no retorna res.
Lèxic
BM25 sobre el text dels records. Una paraula rara —«esfis», «Alex»— pesa més que una de comuna, i els accents i les terminacions es normalitzen: desplego, desplega i desplegar són el mateix senyal.
Sentit
Els vectors hi posen les paraules que no has fet servir literalment. Els cosinus de
NLEmbeddings'amunteguen en una banda estreta, o sigui que es puntuen relatius a la resta del magatzem per aquesta pregunta, no en una escala absoluta.Selecció
Els dos senyals es combinen i es talla. Un mig fet que hi tingui a veure de lluny es queda fora: no valia el context que ocupa.
Per què dos senyals i no un: el lèxic sol no troba el que has dit amb altres paraules, i els vectors sols diuen que tot s'assembla a tot. El català no té model d'embeddings al sistema; s'hi fa servir el castellà, i la meitat lèxica compensa la resta.
$ esfis --recall "què cuino divendres"
0.94 Sopar amb la Laura i en Dani, divendres a les 9 (2026-09-08)
0.81 La Laura menja sense gluten des d'aquesta primavera (2026-04-12)
0.77 En Dani no menja marisc (2025-11-30)
Prova-ho
Un magatzem d'exemple de dotze records, el mateix rànquing, que s'executa al teu navegador. Pregunta-li alguna cosa.
Per on hi entra
Claude Code, Claude Desktop, Cursor i qualsevol client MCP, amb l'eina remember.
Enganxa una conversa a l'app i el model en treu els records. Aquest camí sí que gasta API.
esfis --import puja la memòria que els assistents ja t'han escrit en fitxers.
esfis --add "…" quan ho vols desar tu, sense passar per ningú.
On funciona
| Peça | Què tens | Estat |
|---|---|---|
| App de macOS | Una finestra i tres pestanyes: Observa, Recorda i la configuració | Va |
| Servidor MCP | JSON-RPC per l'entrada estàndard, quatre eines, cap port obert | Va |
| Línia d'ordres | --recall, --add, --import, --list | Va |
| Sincronització | El magatzem no surt de la màquina | Encara no |
| Linux i Windows | Els vectors surten dels models que porta macOS | Encara no |
Les peces
El motor
Una taula de SQLite, vectors calculats al dispositiu i un registre on cada canvi és una línia. Un sol binari, sense servei ni dimoni.
SQLiteNLEmbeddinglog.jsonlLa capa MCP
Un magatzem compartit per tots els assistents, per l'entrada estàndard. T'expliques un cop.
MCPstdio4 einesL'app de macOS
Per mirar què sap de tu, esborrar el que no toca i enganxar-hi una conversa quan vols que en tregui els records ell mateix.
ObservaRecordaClauer
