Guides / Use cases

Workplace assistants

For internal tools that help a team: a chat assistant in Slack or Teams, a meeting notetaker, a project bot. Recall remembers what was said in which meeting, what each project decided and who owns what, so the assistant can answer the question that otherwise goes round five channels.

What memory adds

Without memory, the assistant knows only the message in front of it. With it, decisions and commitments outlive the meeting where they were made:

Without memoryWith Recall
"Who owns the pricing page?"Someone searches three channels and asks around."The checkout PM, since the kickoff on 6 October."
A new hire asks why PayPal is leaving checkoutThe thread from March is long forgotten.The assistant answers from the imported March thread: about 2% of orders used it.
"What did I promise for checkout?" in a DMThe assistant has no idea."New checkout mockups by 20 October, from the kickoff."

Recall is memory, not the assistant: your model writes the replies, and your chat or meeting integration sends Recall what was said. Recall also does not know who may read which channel; you decide what goes into each scope.

How to model it

In your companyIn RecallWhy
The company, or a department whose memory must stay apart (HR)Workspace, e.g. acme-corpMemory never crosses workspaces. Each internal tool gets its own key, scoped to the workspace it needs.
Each employeePeer keyed by directory id, emp-1042Outlives name and email changes, and is the same person in chat, meetings and email.
The assistantPeer team-assistant with observeMe: falseIts replies stay in the history; facts are learned about people, not from the assistant.
A meeting, a thread, a DMSession, e.g. meet-20261006-checkout, dm-emp-2210One conversation with its own summary. A DM stays between that person and the assistant.
A projectScope proj-checkoutQuestions about the project read only the sessions filed under it.
Documents and wiki pagesA session per document, written by a peer for the source, wikiThey stay when the person who wrote them leaves.
What is known about a personTheir peer card and facts (conclusions)Role, projects and commitments, in the context of every DM.

Build it

Install the SDK (npm install @recall-memory/sdk or pip install recall-mem) and set RECALL_API_KEY. Create the people, the assistant and a session per meeting or thread, filed under its project.

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

const recall = new Recall({ workspaceId: "acme-corp" });

// People are peers keyed by their directory id, which outlives name and email changes.
const lead = recall.peer("emp-1042");
const designer = recall.peer("emp-2210");
// The assistant's own replies teach Recall nothing about the team.
const assistant = recall.peer("team-assistant");
await assistant.setConfiguration({ observeMe: false });

// One session per meeting, thread or DM. Work on a project joins the project's scope.
const kickoff = recall.session("meet-20261006-checkout", {
  peers: [lead, designer, assistant],
  scopes: ["proj-checkout"],
});
// Your notetaker or chat integration records what each person said.
await kickoff.addMessages([
  lead.message("I own the pricing page. Annual plans get two months free: decided."),
  designer.message("Then I'll have the new checkout mockups ready by 20 October."),
]);

Bring in what came before. Import exported threads with the time each message was written, so Recall dates what it learns and reckons "next quarter" from then, not from today. The SDKs send more than 100 messages in ordered batches. Documents go in with uploadFile: PDF, JSON and text formats such as Markdown or CSV are accepted, and long files become several messages. Convert Word files to PDF or text first.

// Past material: an exported thread, oldest first, with the time each message was written,
// so Recall dates what it learns. Over 100 messages go in ordered batches of 100.
const exported = [
  { user: "emp-1042", at: "2026-03-02T09:14:00Z", text: "We drop PayPal in Q4." },
  { user: "emp-2210", at: "2026-03-02T09:20:00Z", text: "Fine, it is 2% of orders." },
];
const thread = recall.session("slack-c04p2qk-1709370840", { scopes: ["proj-checkout"] });
await thread.addMessages(
  exported.map((m) => recall.peer(m.user).message(m.text, { createdAt: m.at })),
);
// Documents (PDF, JSON or any text format) become messages from the peer you name: here a
// peer for the wiki, so they outlive the person who wrote them.
const wiki = recall.session("doc-checkout-decisions", { scopes: ["proj-checkout"] });
const doc = "# Checkout decisions\n\n- PayPal goes in Q4.\n- Annual plans: two months free.";
await wiki.uploadFile(
  { filename: "checkout-decisions.md", content: new TextEncoder().encode(doc) },
  "wiki",
);

Ask about a project. A question with scope answers from the sessions filed under that project and nothing else, in a few seconds. For an answer limited to what one person could have seen, search with peer_perspective: it returns only messages from sessions they were in while they were in them (see Search filters), and your model answers from those.

// A question about the project, answered only from the sessions in its scope.
// (waitForIdle is for this demo; a real assistant does not block on learning.)
await recall.waitForIdle();
const answer = await recall.chat("Who owns the pricing page, and what is decided on PayPal?", {
  scope: "proj-checkout",
  reasoningLevel: "low",
});
// Only what one person could have seen: search through their perspective (no answer is
// generated; your model answers from the messages).
const seen = await recall.search("PayPal", {
  filters: { peer_perspective: designer.id },
  limit: 5,
});

A DM: one request per message. turn stores the message and returns what the next reply needs: the conversation, a summary of older turns and what is known about this person, focused on what they asked.

// A direct message: one session per person, with what is known about them in the context.
const dm = recall.session("dm-emp-2210", { peers: [designer, assistant] });
const text = "What did I promise for the checkout project?";
const { context } = await dm.turn([designer.message(text)], {
  peerTarget: designer,
  searchQuery: text,
  tokens: 2000,
});
const prompt = context.toOpenAI(assistant); // your model writes the reply from `prompt`

A key per tool

Give each internal tool (the chat assistant, the notetaker, a wiki sync) its own key, scoped to its workspace, under API keys in the dashboard. You can then revoke one tool without touching the others. A key scoped to one peer or one session cannot forget a person (401), so the job that handles leavers needs a workspace key.

When someone leaves

Decide your policy first: some companies keep work conversations as business records, others erase a person's data when they leave or ask. To erase:

// Someone leaves and is to be forgotten: their messages and every fact about them or from
// their view go. Other people's messages, the wiki and facts that only mention them stay.
const removed = await lead.delete();

delete removes every message the person wrote, their memberships, every fact and peer card about them or from their view, and cached answers; summaries of their sessions are rebuilt without them. Other people's messages stay, and so do facts about other people that merely mention them ("emp-2210 took over the pricing page from emp-1042"). A decision that lives only in the leaver's own messages goes with them, which is why decision documents belong to the wiki peer, not to their author. See Forget a person.

Settings that matter

SettingUse
scopes on each sessionFiles the meeting or thread under a project. Keep HR conversations, one-to-ones and DMs out of project scopes.
Message createdAtThe time a message was written, for imports. Without it, everything imported is dated today.
peer_perspective search filterLimits results to what one person saw, for answers that must respect who was in the room.
observeMe: false on the assistantFacts about people come from what they said, not from the assistant's summaries of it.
configuration: { reasoning: { enabled: false } } on a sessionFor a channel you want searchable but not learned from, such as an off-topic channel. Its messages count only what Recall reads of them.
reasoningLevellow (the default) for most questions, minimal for quick lookups. See Reasoning levels and models.

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, and a question at minimal or low 2 to 4.5 seconds, well within what people expect from a chat assistant. Learning runs in the background.

Context, search and storage are included. You pay for learning, $1.75 per million message tokens with every message counting as at least 50, and for questions. An employee who writes 40 short messages a day in recorded channels over 20 working days, speaks 60 times in each of 8 recorded meetings, gets 100 replies from the assistant and asks 60 questions:

ItemPer month
Chat messages: 800 × 50 tokens × $1.75 / 1M$0.070
Meeting turns: 480 × 50 tokens × $1.75 / 1M$0.042
Assistant replies, read but not learned from: 100 × 200 tokens × $1.75 / 1M$0.035
Questions at low: 60 × $0.005$0.300
Totalabout $0.45 per employee, or $89 for 200 people

An import is paid once: 20,000 old messages at the 50-token minimum are 1,000,000 tokens, $1.75. More in Cost and speed.

Privacy and forgetting

An assistant that records meetings and chats processes employees' personal data, and staff can experience it as monitoring. What follows is practical guidance, not legal advice:

Recall stores data in Frankfurt; text is processed by AI model providers in the US through OpenRouter, restricted to providers that do not collect it, and is never used to train models. Your company is the controller and Recall the processor, under the DPA. Everything your account stores can be downloaded as JSON under Settings, for example to answer an access request (Export your data), and a person is erased with delete. See Privacy, consent and forgetting and the privacy policy.

Pitfalls

Next: Multi-agent systems · Discord and Slack bots