> Font: https://www.esfis.com/producte · esfis, memòria local per a qualsevol assistent. Actualitzat el 12 de setembre del 2026.

# 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 `NLEmbedding` s'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.

Lèxic 2 ms

Sentit 6 ms

Selecció 1 ms

## Per on hi entra

Assistents

Claude Code, Claude Desktop, Cursor i qualsevol client MCP, amb l'eina `remember`.

Observa

Enganxa una conversa a l'app i el model en treu els records. Aquest camí sí que gasta API.

Fitxers .md

`esfis --import` puja la memòria que els assistents ja t'han escrit en fitxers.

Terminal

`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](https://www.esfis.com/producte#que-es-un-record)

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.

SQLite NLEmbedding log.jsonl

### [La capa MCP](https://www.esfis.com/documentacio#mcp)

Un magatzem compartit per tots els assistents, per l'entrada estàndard. T'expliques un cop.

MCP stdio 4 eines

### [L'app de macOS](https://www.esfis.com/producte#on-funciona)

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.

Observa Recorda Clauer
