``` remember 'acme moved to annual billing' topic:billing entity:acme recall billing entity:acme since:30d top:5 ```
Two verbs because the caller pays for every token it reads back. A recall is ranked and capped rather than exhaustive, with recent facts outranking older ones.
Unlike most memory layers that use existing databases (vector, graph) to index data, Fraise provides a lightweight, no infrastructure layer that is designed to be used directly by agents: hence the simple query language to manage memory.
Fraise has a hybrid (graph, text and vector) retrieval engine: text and vector are used to find seeds, which are starting points for the graph search. The Fraise graph is bipartite: facts linked to entities and / or topics.
It ships an MCP server (that I actually use now with my Claude Code sessions). Which means that memory persists across sessions. You can use `claude mcp add fraise -- fraise mcp` to set it up. It also supports Codex (all instructions available in the docs).
I benchmarked it against mem0, Letta, Graphiti, EverOS and cognee on LoCoMo, with every system ingesting the same conversations using the same extraction model and the same embedding model, and answering the same questions. Retrieval recall at k=10: 0.893 against a best of 0.897, at 0.18s p50 (twice as fast as the next system) and about a third of the tokens of the highest scorer. Scalability-wise, writes are essentially linear, but reads grow linearly with vertex degree (e.g. a topic with 30K facts attached costs about 55× than one with 500).
This is 0.1.0 so plenty of work to do. As mentioned above, scalability with adversarial graph topologies, but also persistency: for now Fraise is in memory with no file storage. This is the first feature for 0.2.0.
If this is a topic that is of interest, I'd love to chat, or if you have any feedback feel free to reach out!
Repo: https://github.com/FraiseHQ/fraise Docs: https://docs.getfraise.dev