Guides / Use cases

Personal assistants and companions

For personal assistants, AI companions and any chat product the same person keeps coming back to. With Recall your assistant starts every conversation knowing the user's plans, preferences and the people in their life, without old transcripts in the prompt: one call per message stores what was said and returns the memory for the reply.

What memory adds

Without memory, every conversation starts from zero and the user repeats themselves. With it, the assistant picks up where they left off:

Without memoryWith Recall
"My parents visit on Saturday. Can you plan a dinner for four?"Suggests roast chicken.Suggests a mushroom risotto: the user set "vegetarian" in their profile.
Thursday, a new conversation: "What do I still need to buy?""For what, exactly?""For Saturday's dinner with your parents: mushrooms, risotto rice and a lemon."
The user mentions once that they movedKeeps suggesting cafés in the old city.Recall closes "lives in Utrecht", starts "lives in Amersfoort" and keeps the old fact as history.

Recall does not write the replies. Your model does, as it does now; Recall gives it what it should know about this user, and learns from what they say.

How to model it

In your appIn RecallWhy
Your app, per environmentWorkspace, e.g. assistant-prodOne memory space for all your users. Use another workspace for staging and tests.
A userPeer user-8412, your own stable user idRecall learns about the user from everything they write. Each user's memory is built from their own messages.
Your assistant or companion characterPeer assistant with observeMe: falseYou write its persona, so Recall need not learn about it; its replies cost less.
A conversationSession, e.g. chat-20261010-a91fSummaries and recent messages are per conversation. What Recall learns about the user carries over to every conversation.
Facts for every prompt: name, diet, timezoneThe user's peer cardA short list that turn returns with the context. Recall keeps it up to date, and you can edit it.
What the user fills in under settingsConclusions you createStored as facts at once, as given; nothing is inferred.

Ask about one user through their peer (user.chat). The workspace-level recall.chat reads every user's memory, which is never what you want in a personal assistant.

Build it

Install the SDK (npm install @recall-memory/sdk or pip install recall-mem) and set RECALL_API_KEY. Create handles for the user, the assistant and the conversation.

import { Recall } from "@recall-memory/sdk";

const recall = new Recall({ workspaceId: "assistant-prod" });

// The user is a peer, keyed by your own stable user id (not their email address).
const user = recall.peer("user-8412", { metadata: { locale: "nl-NL" } });
// You write the assistant's persona, so Recall should not learn from its replies.
const assistant = recall.peer("assistant", { configuration: { observeMe: false } });
// One session per conversation. Memory of the user is shared across all of them.
const chat = recall.session("chat-20261010-a91f");

Settings are facts. When a user fills in their profile ("I'm vegetarian", "keep it short"), write it down as conclusions about them. They are stored as given, can be found at once and show up in every answer that needs them. What the user says in conversation is learned in the background instead.

// What the user entered in your app's settings is fact, not inference: store it as such.
// It is searchable at once, without waiting for background learning.
await user.conclusions.create(["Is vegetarian.", "Prefers short answers."]);

The peer card: facts for every prompt. The card is a short list of the most stable facts about the user. Recall writes and updates it as it learns, and turn returns it with the context, so your model always sees it. You can add lines yourself, for example from onboarding. setCard replaces the whole list, so read it first.

// The peer card: a short list of facts for every prompt. Recall writes and updates it as it
// learns; you can add lines yourself, e.g. from onboarding. setCard replaces the whole card.
const card = (await user.getCard()) ?? [];
await user.setCard([
  ...card,
  "Prefers to be called Sam.",
  "Vegetarian.",
  "Timezone Europe/Amsterdam.",
]);

Every message: one request. turn stores the user's message and returns the context for your model in the same round trip: the conversation so far, a summary of older turns, the card and what Recall has learned about the user, trimmed to tokens. Building the context uses no model, so it is fast and included in the price; you pay only for learning from the message. Store the reply afterwards so the conversation is complete.

// Every user message: one request stores it and returns the context for the reply: this
// conversation so far, a summary of older turns, the card and what Recall knows about Sam.
const { context } = await chat.turn(
  [user.message("My parents visit on Saturday. Can you plan a dinner for four?")],
  { peerTarget: user, tokens: 3000 },
);
const messages = context.toOpenAI(assistant); // or context.toAnthropicParams(assistant)
// Your model writes the reply from `messages`; store it so the conversation is complete.
const reply = "How about a mushroom risotto with a big salad? Here is a shopping list.";
await chat.addMessages([assistant.message(reply)]);

Questions about the user: ask. For things outside the chat, such as a morning briefing, a reminder or a suggestion for the weekend, ask the user's memory in plain language. That is one model call of a few seconds, so run it in the background, not while the user waits for a reply.

// A question about the user, for a reminder or a suggestion outside the chat. One model call
// of a few seconds. (waitForIdle is for this demo; real apps rarely block on learning.)
await recall.waitForIdle();
const answer = await user.chat("What should I keep in mind when suggesting a weekend plan?", {
  reasoningLevel: "low",
});

Let users fix what you remember. A "What I remember" page builds trust and catches mistakes. List the user's facts, delete the ones they flag, and store the right value when they give it. Deleting a fact does not change the card, so update the card too. When the user corrects something in conversation ("I moved to Amersfoort"), you need not do anything: Recall closes the old fact itself.

// A "What I remember" page: list the facts and let the user delete a wrong or outdated one.
// Deleting a fact does not edit the card, so remove it there too, and store the new value.
const { items: facts } = await user.conclusions.list({ size: 50 });
const flagged = facts.find((f) => f.content.toLowerCase().includes("vegetarian")); // user's pick
if (flagged) await user.conclusions.delete(flagged.id);
const current = (await user.getCard()) ?? [];
await user.setCard(current.filter((line) => !line.toLowerCase().includes("vegetarian")));
await user.conclusions.create("Eats fish, but no meat.");

Account deletion. user.delete() erases the user: their messages, everything learned about them and their card. The assistant's replies are another peer's messages, so delete the user's conversations as well.

// The user deletes their account: erase them (their messages, every fact and the card), then
// their conversations, which still hold the assistant's replies to them.
const chats = await (await user.sessions()).toArray();
await user.delete();
for (const c of chats) await c.delete();

Memory in Claude and ChatGPT

To give Claude or ChatGPT memory across chats you build nothing: add Recall as a connector with the URL https://api.recallmem.dev/mcp and sign in. With Remember automatically ticked (the default) the app saves lasting facts you share, such as preferences, plans and people, without being asked; untick it per app under API keys → Connected apps to have it save only what you ask. The steps for each app are in Add Recall as a connector. That is memory for your own Recall account. To give your product's users memory, build it as above.

Settings that matter

SettingUse
observeMe: false on the assistantRecall learns nothing from the assistant's replies; it reads them only as context for the user's messages. Give it when you create the handle; both SDKs send it before the assistant's first message.
peerTarget and tokens on turnpeerTarget: user adds what Recall knows about the user and their card. 2,000 to 4,000 tokens is plenty for a chat; older turns become a summary.
reasoningLevellow (the default) for questions about the user, minimal for quick checks: the cheapest and fastest. See Reasoning levels and models.
Message createdAtWhen you import old chats, pass when each message was written, so "next week" is reckoned from then, not from the import.
reasoning.customInstructions (workspace configuration)Tell Recall what matters in your product and what to leave out. It guides the model that extracts facts; it is not a filter.
peerCard.create: false (workspace configuration)Recall stops writing cards and you own them entirely. Leave it on unless you need that.

Cost and speed

Measured from Europe against the hosted API (Frankfurt), October 2026: a turn or context call took 0.3 to 0.7 seconds, a search about 0.9 seconds, a question at minimal or low 2 to 4.5 seconds. Learning happens in the background, usually within about 20 seconds of a message, and never holds up a call.

Context, search, storage, summaries and dreams are included. You pay for learning, $1.75 per million message tokens with every message counting as at least 50, and for questions. A user who sends 300 messages a month of about 40 tokens, gets 300 replies of about 150 tokens, and about whom your app asks 30 questions at low:

ItemPer month
User messages: 300 × 50 tokens × $1.75 / 1M$0.0263
Assistant replies, read but not learned from: 300 × 150 tokens × $1.75 / 1M$0.0788
Questions at low: 30 × $0.005$0.1500
Totalabout $0.26 per user

An answer from empty memory is free. Set a monthly cap and auto top-up under Billing. More in Cost and speed.

Privacy and forgetting

People tell assistants a lot: health, relationships, money, other people. Say in your privacy notice that conversations are stored to give the assistant memory, that AI model providers process them, and how users delete it. Give users a page that shows what is remembered, like the one above.

Companions. Memory makes a companion feel like it knows the person, which is the point and also the risk. Keep it honest: let the character say it is an AI when asked, and do not use what it remembers to make people feel guilty for leaving or to keep them chatting longer. Let people see and delete what it remembers. If someone writes about self-harm or a crisis, your app has to point them to real help; Recall stores what was said, it does not notice or handle it. If minors may use your app, read Privacy, consent and forgetting first.

Pitfalls

Next: Designing workspaces, peers and sessions · Privacy, consent and forgetting