- State-of-the-art memory and context engine for AI. And yes - you can use it as a company/personal brain.
+ State-of-the-art memory and context engine for AI.
@@ -67,7 +67,7 @@ All of this is in our single memory structure and ontology.
🧑💻 I use AI tools
-Build your own personal supermemory by using our app. Builds **persistent memory graph across every conversation**.
+Give Claude Code, Cursor, Codex and OpenCode **persistent memory across every conversation** with a plugin or the MCP server.
Your AI remembers your preferences, projects, past discussions — and gets smarter over time.
@@ -107,21 +107,11 @@ curl -fsSL https://supermemory.ai/install | bash
## Give your AI memory
-The Supermemory App, browser extension, plugins and MCP server gives any compatible AI assistant persistent memory. One install, and your AI remembers you.
-
-### The app
-
-You can use supermemory without any code, by using our consumer-facing app for free.
-
-Start at https://app.supermemory.ai
-
-
-
-It also comes with an agent embedded inside, which we call Nova.
+Plugins and the MCP server give any compatible AI assistant persistent memory. One install, and your AI remembers you.
### Supermemory Plugins
-Supermemory comes built with Plugins for Claude Code, OpenCode, OpenClaw, and Hermes.
+Supermemory comes built with plugins for Claude Code, Cursor, Codex, OpenCode, OpenClaw, and Hermes.
@@ -129,8 +119,10 @@ These plugins are implementations of the supermemory API, and they are open sour
You can find them here:
-- Openclaw plugin: https://github.com/supermemoryai/openclaw-supermemory
-- Claude code plugin: https://github.com/supermemoryai/claude-supermemory
+- Claude Code plugin: https://github.com/supermemoryai/claude-supermemory
+- Cursor plugin: https://github.com/supermemoryai/cursor-supermemory
+- Codex plugin: https://github.com/supermemoryai/codex-supermemory
+- OpenClaw plugin: https://github.com/supermemoryai/openclaw-supermemory
- OpenCode plugin: https://github.com/supermemoryai/opencode-supermemory
- Hermes agent (Supermemory memory provider): https://github.com/NousResearch/hermes-agent
diff --git a/README.zh-CN.md b/README.zh-CN.md
index 20121721..e0a53055 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -7,7 +7,7 @@
- 面向 AI 的记忆与上下文引擎,业界领先。也可以把它当作公司或个人的「大脑」来用。
+ 面向 AI 的记忆与上下文引擎,业界领先。
@@ -60,7 +60,7 @@ Supermemory 是为 AI 设计的记忆与上下文层。在 **[LongMemEval](https
- )
-}
-
-const cardShadow =
- "2px 2px 2px 0 rgba(0, 0, 0, 0.50) inset, -1px -1px 1px 0 rgba(82, 89, 102, 0.08) inset"
-
-type ManualImportProvider = "gemini"
-
-const manualImportProviderConfig: Record<
- ManualImportProvider,
- { label: string; actionSource: string }
-> = {
- gemini: {
- label: "Gemini",
- actionSource: "gemini_manual_memory_import",
- },
-}
-
-const manualMemoryImportPrompt = `Export all of my stored memories and any context you've learned about me from past conversations. Preserve my words verbatim where possible, especially for instructions and preferences.
-
-## Categories (output in this order):
-
-1. **Instructions**: Rules I've explicitly asked you to follow going forward - tone, format, style, "always do X", "never do Y", and corrections to your behavior. Only include rules from stored memories, not from conversations.
-
-2. **Identity**: Name, age, location, education, family, relationships, languages, and personal interests.
-
-3. **Career**: Current and past roles, companies, and general skill areas.
-
-4. **Projects**: Projects I meaningfully built or committed to. Ideally ONE entry per project. Include what it does, current status, and any key decisions. Use the project name or a short descriptor as the first words of the entry.
-
-5. **Preferences**: Opinions, tastes, and working-style preferences that apply broadly.
-
-## Format:
-
-Use section headers for each category. Within each category, list one entry per line, sorted by oldest date first. Format each line as:
-
-[YYYY-MM-DD] - Entry content here.
-
-If no date is known, use [unknown] instead.
-
-## Output:
-- Wrap the entire export in a single code block for easy copying.
-- After the code block, state whether this is the complete set or if more remain.`
-
-const normalizeManualMemoryImport = (value: string) => {
- const trimmed = value.trim()
- const codeBlockMatch = trimmed.match(/```(?:[\w-]+)?\s*([\s\S]*?)```/)
-
- return (codeBlockMatch?.[1] ?? trimmed).trim()
-}
-
-const OpenAILogo = ({ className }: { className?: string }) => (
-
-)
-
-const ClaudeLogo = ({ className }: { className?: string }) => (
-
-)
-
-const GeminiLogo = ({ className }: { className?: string }) => (
-
-)
-
-const XLogo = ({ className }: { className?: string }) => (
-
-)
-
-const GrokLogo = ({ className }: { className?: string }) => (
-
-)
-
-const ChatAppsLogo = ({ className }: { className?: string }) => (
-
- The project you want to import your bookmarks to.
-
-
- `
-
- const form = document.createElement("div")
- form.style.cssText = `
- display: flex;
- flex-direction: column;
- gap: 16px;
- `
-
- const selectContainer = document.createElement("div")
- selectContainer.style.cssText = `
- display: flex;
- flex-direction: column;
- gap: 8px;
- `
-
- const label = document.createElement("label")
- label.style.cssText = `
- font-size: 14px;
- font-weight: 500;
- color: #ffffff;
- `
- label.textContent = "Select Project to import"
-
- const select = document.createElement("select")
- select.id = "project-select"
- select.style.cssText = `
- padding: 12px 40px 12px 16px;
- border: none;
- border-radius: 12px;
- font-size: 14px;
- background: rgba(91, 126, 245, 0.04);
- box-shadow: -1px -1px 1px 0 rgba(82, 89, 102, 0.08) inset, 2px 2px 1px 0 rgba(0, 0, 0, 0.50) inset;
- color: #ffffff;
- cursor: pointer;
- transition: border-color 0.2s ease;
- appearance: none;
- background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6,9 12,15 18,9'%3e%3c/polyline%3e%3c/svg%3e");
- background-repeat: no-repeat;
- background-position: right 16px center;
- background-size: 16px;
- font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
- `
- select.addEventListener("focus", () => {
- select.style.borderColor = "#1A88FF"
- })
- select.addEventListener("blur", () => {
- select.style.borderColor = "#374151"
- })
-
- // Add default option
- const defaultOption = document.createElement("option")
- defaultOption.value = ""
- defaultOption.textContent = "Choose a project..."
- defaultOption.disabled = true
- defaultOption.selected = true
- select.appendChild(defaultOption)
-
- // Add project options
- projects.forEach((project) => {
- const option = document.createElement("option")
- option.value = project.id
- option.textContent = project.name
- option.dataset.containerTag = project.containerTag
- select.appendChild(option)
- })
-
- const buttonContainer = document.createElement("div")
- buttonContainer.style.cssText = `
- display: flex;
- gap: 12px;
- justify-content: flex-end;
- margin-top: 8px;
- `
-
- const cancelButton = document.createElement("button")
- cancelButton.textContent = "Cancel"
- cancelButton.style.cssText = `
- padding: 10px 16px;
- color: #ffffff;
- font-size: 14px;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.2s ease;
- border-radius: 10px;
- border: none;
- background: #05070A;
- `
- cancelButton.addEventListener("mouseenter", () => {
- cancelButton.style.backgroundColor = "#f9fafb"
- cancelButton.style.color = "#05070A"
- })
- cancelButton.addEventListener("mouseleave", () => {
- cancelButton.style.backgroundColor = "#05070A"
- cancelButton.style.color = "#ffffff"
- })
-
- const importButton = document.createElement("button")
- importButton.textContent = "Import"
- importButton.style.cssText = `
- padding: 10px 16px;
- border: 1px solid rgba(255, 255, 255, 0.1);
- border-radius: 12px;
- background: rgba(255, 255, 255, 0.05);
- color: rgba(255, 255, 255, 0.3);
- font-size: 14px;
- font-weight: 500;
- cursor: not-allowed;
- transition: all 0.2s ease;
- `
- importButton.disabled = true
-
- // Handle project selection
- select.addEventListener("change", () => {
- const selectedOption = select.options[select.selectedIndex]
- if (selectedOption.value) {
- importButton.disabled = false
- importButton.style.cssText = `
- padding: 10px 16px;
- border: none;
- border-radius: 12px;
- background: linear-gradient(203deg, #0FF0D2 -49.88%, #5BD3FB -33.14%, #1E0FF0 81.81%);
- box-shadow: 1px 1px 2px 1px #1A88FF inset, 0 2px 10px 0 rgba(5, 1, 0, 0.20);
- color: #ffffff;
- font-size: 14px;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.2s ease;
- `
- } else {
- importButton.disabled = true
- importButton.style.cssText = `
- padding: 10px 16px;
- border: 1px solid rgba(255, 255, 255, 0.1);
- border-radius: 12px;
- background: rgba(255, 255, 255, 0.05);
- color: rgba(255, 255, 255, 0.3);
- font-size: 14px;
- font-weight: 500;
- cursor: not-allowed;
- transition: all 0.2s ease;
- `
- }
- })
-
- // Handle import button click
- importButton.addEventListener("click", () => {
- const selectedOption = select.options[select.selectedIndex]
- if (selectedOption.value) {
- const selectedProject = {
- id: selectedOption.value,
- name: selectedOption.textContent,
- containerTag: selectedOption.dataset.containerTag || "",
- }
- onImport(selectedProject)
- }
- })
-
- // Handle cancel button click
- cancelButton.addEventListener("click", onClose)
-
- // Handle overlay click to close
- modal.addEventListener("click", (e) => {
- if (e.target === modal) {
- onClose()
- }
- })
-
- // Handle escape key
- const handleKeyDown = (e: KeyboardEvent) => {
- if (e.key === "Escape") {
- onClose()
- }
- }
- document.addEventListener("keydown", handleKeyDown)
-
- // Clean up event listener when modal is removed
- const observer = new MutationObserver(() => {
- if (!document.contains(modal)) {
- document.removeEventListener("keydown", handleKeyDown)
- observer.disconnect()
- }
- })
- observer.observe(document.body, { childList: true, subtree: true })
-
- selectContainer.appendChild(label)
- selectContainer.appendChild(select)
- form.appendChild(selectContainer)
- buttonContainer.appendChild(cancelButton)
- buttonContainer.appendChild(importButton)
- form.appendChild(buttonContainer)
-
- dialog.appendChild(header)
- dialog.appendChild(form)
- modal.appendChild(dialog)
-
- return modal
-}
-
-/**
- * Utility functions for DOM manipulation
- */
-export const DOMUtils = {
- /**
- * Check if current page is on specified domains
- * @param domains - Array of domain names to check
- * @returns boolean
- */
- isOnDomain(domains: readonly string[]): boolean {
- return domains.includes(window.location.hostname)
- },
-
- /**
- * Detect if the page is in dark mode based on color-scheme style
- * @returns boolean - true if dark mode, false if light mode
- */
- isDarkMode(): boolean {
- const htmlElement = document.documentElement
- const style = htmlElement.getAttribute("style")
- return style?.includes("color-scheme: dark") || false
- },
-
- /**
- * Check if element exists in DOM
- * @param id - Element ID to check
- * @returns boolean
- */
- elementExists(id: string): boolean {
- return !!document.getElementById(id)
- },
-
- /**
- * Remove element from DOM if it exists
- * @param id - Element ID to remove
- */
- removeElement(id: string): void {
- const element = document.getElementById(id)
- element?.remove()
- },
-
- /**
- * Show toast notification with auto-dismiss
- * @param state - Toast state
- * @param duration - Duration to show toast (default from config)
- * @returns The toast element
- */
- showToast(
- state: ToastState,
- duration: number = UI_CONFIG.TOAST_DURATION,
- ): HTMLElement {
- const existingToast = document.getElementById(ELEMENT_IDS.SUPERMEMORY_TOAST)
-
- if ((state === "success" || state === "error") && existingToast) {
- const icon = existingToast.querySelector("div")
- const text = existingToast.querySelector("span")
-
- if (icon && text) {
- if (state === "success") {
- const iconUrl = browser.runtime.getURL("/new_logo.png")
- icon.innerHTML = ``
- icon.style.animation = ""
- text.textContent = "Added to Memory"
- } else if (state === "error") {
- icon.innerHTML = `
-
- `
- icon.style.animation = ""
-
- const textContainer = document.createElement("div")
- textContainer.style.cssText =
- "display: flex; flex-direction: column; gap: 2px;"
-
- const mainText = document.createElement("span")
- mainText.style.cssText = "font-weight: 500; line-height: 1.2;"
- mainText.textContent = "Failed to save memory"
-
- const helperText = document.createElement("span")
- helperText.style.cssText =
- "font-size: 12px; color: #6b7280; font-weight: 400; line-height: 1.2;"
- helperText.textContent = "Make sure you are logged in"
-
- textContainer.appendChild(mainText)
- textContainer.appendChild(helperText)
-
- text.innerHTML = ""
- text.appendChild(textContainer)
- }
-
- // Auto-dismiss
- setTimeout(() => {
- if (document.body.contains(existingToast)) {
- existingToast.style.animation = "fadeOut 0.3s ease-out"
- setTimeout(() => {
- if (document.body.contains(existingToast)) {
- existingToast.remove()
- }
- }, 300)
- }
- }, duration)
-
- return existingToast
- }
- }
-
- const existingToasts = document.querySelectorAll(
- `#${ELEMENT_IDS.SUPERMEMORY_TOAST}`,
- )
- existingToasts.forEach((toast) => {
- toast.remove()
- })
-
- const toast = createToast(state)
- document.body.appendChild(toast)
-
- // Auto-dismiss for success and error states
- if (state === "success" || state === "error") {
- setTimeout(() => {
- if (document.body.contains(toast)) {
- toast.style.animation = "fadeOut 0.3s ease-out"
- setTimeout(() => {
- if (document.body.contains(toast)) {
- toast.remove()
- }
- }, 300)
- }
- }, duration)
- }
-
- return toast
- },
-}
diff --git a/apps/browser-extension/wxt.config.ts b/apps/browser-extension/wxt.config.ts
deleted file mode 100644
index ea1ca4a0..00000000
--- a/apps/browser-extension/wxt.config.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import path from "node:path"
-import { createRequire } from "node:module"
-import tailwindcss from "@tailwindcss/vite"
-import { defineConfig, type WxtViteConfig } from "wxt"
-
-const require = createRequire(import.meta.url)
-
-function reactPackageRoot(pkg: "react" | "react-dom"): string {
- return path.dirname(require.resolve(`${pkg}/package.json`))
-}
-
-// See https://wxt.dev/api/config.html
-export default defineConfig({
- modules: ["@wxt-dev/module-react"],
- vite: () =>
- ({
- plugins: [tailwindcss()],
- resolve: {
- dedupe: ["react", "react-dom"],
- alias: {
- react: reactPackageRoot("react"),
- "react-dom": reactPackageRoot("react-dom"),
- },
- },
- optimizeDeps: {
- include: ["react", "react-dom", "@tanstack/react-query"],
- },
- }) as WxtViteConfig,
- manifest: {
- name: "supermemory",
- homepage_url: "https://supermemory.ai",
- version: "6.1.3",
- permissions: ["storage", "activeTab", "webRequest", "tabs"],
- host_permissions: [
- "*://x.com/*",
- "*://twitter.com/*",
- "*://supermemory.ai/*",
- "*://api.supermemory.ai/*",
- "*://chatgpt.com/*",
- "*://chat.openai.com/*",
- "*://grok.com/*",
- "*://*.grok.com/*",
- "*://x.ai/*",
- "*://*.x.ai/*",
- "*://claude.ai/*",
- "*://gemini.google.com/*",
- "*://t3.chat/*",
- "https://*.posthog.com/*",
- ],
- web_accessible_resources: [
- {
- resources: ["new_logo.png", "fonts/*.ttf"],
- matches: [""],
- },
- ],
- },
- webExt: {
- chromiumArgs: ["--user-data-dir=./.wxt/chrome-data"],
- },
-})
diff --git a/apps/docs/company-brain/automations.mdx b/apps/docs/company-brain/automations.mdx
deleted file mode 100644
index da253659..00000000
--- a/apps/docs/company-brain/automations.mdx
+++ /dev/null
@@ -1,99 +0,0 @@
----
-title: "Automations and Proactiveness"
-sidebarTitle: "Automations"
-description: "Scheduled work Company Brain runs on its own, and when it speaks without being asked"
-icon: "bot"
----
-
-import { SlackThread, SlackMessage, Mention, ChannelRef } from "/snippets/slack-message.mdx";
-
-Company Brain doesn't only answer when you @mention it. It can run recurring work on a schedule, and it can speak in a thread on its own when it has something genuinely worth saying. Both are opt-in, both are rate-limited, and both read from exactly the same [permissions graph](/company-brain/permissions) as a normal question — neither is a backdoor around it.
-
-## Automations
-
-An automation is a prompt that runs on a schedule and posts the result somewhere. You write it once, in plain language:
-
-
-
-
- supermemory every Monday at 9am, post a digest of what shipped last week and what's still open, to product.
-
-
-
- Got it — scheduled. First digest posts Monday, 9:00 AM, to product.
-
-
-
-
-
- The automation wakes up at its set time — no one has to trigger it.
-
-
- It reads using only **org-shared** connections and channel memory — never a person's personal credentials, even if the person who created the automation has better personal access. This is what keeps a scheduled post from silently acting as a specific teammate.
-
-
- Before posting, it re-confirms it can still see the destination channel.
-
-
- If anything above is unclear — a connection broke, visibility can't be verified — it skips that run rather than posting a guess. Silence beats a wrong digest.
-
-
-
-**Who can target what:**
-
-| Destination | Who can create it | Reads from |
-|---|---|---|
-| Public channel | Any member | Org-shared connections, public channel memory |
-| Private channel | Admins only | Org-shared connections, that channel's memory |
-| DM to yourself | The owner of that DM | Your personal + org connections, your employee memory |
-
-Common shapes worth stealing:
-
-- A Monday-morning digest of open items and unanswered questions
-- A daily Sentry error recap in `#eng`
-- A weekly "what changed across our connected tools" summary
-
-Anyone can create and manage their own automations; admins can manage everyone's. Ask Company Brain in Slack to set one up, or manage the full list from the web app.
-
-## Proactiveness (chime-in)
-
-Chime-in is different from an automation: there's no schedule, and no one asked. Company Brain is simply present in a channel — because an admin invited it — and it speaks up when staying quiet would waste someone's time.
-
-**What actually earns a chime-in:**
-
-- It has to add something the room doesn't already have — a fact, a correction, a next step — not agreement or a restatement of what's already visible.
-- It has to come from somewhere it's genuinely allowed to look: [connected tools](/company-brain/connectors) or that room's own memory, same as any other answer.
-- If it isn't confident the answer is actually correct, it says nothing. A wrong guess is worse than silence, so uncertainty resolves to silence, not a hedge.
-
-
-```text Worth chiming in
-"is prod down? customers are pinging me"
-→ correlates against Sentry, replies with what's actually elevated right now
-```
-
-```text Not worth it
-"finally shipped this 🎉" (screenshot, no question)
-→ stays quiet — there's nothing to add
-```
-
-
-**Guardrails that keep it from becoming noise:**
-
-- **Rate-limited.** It won't speak repeatedly in the same thread or channel in a short window, even if it technically could add something each time.
-- **Invite-only rooms.** It never joins a channel on its own — only places an admin already invited it into.
-- **Same graph as a normal answer.** A private channel's chime-in only ever draws on that channel's memory and public channel memory — never another private channel, never someone else's employee memory.
-
-An explicit @mention always skips this judgment call entirely — naming it is you deciding it should speak, so it does.
-
-
-Automations and chime-in both write back to memory the same way a normal conversation does: a public channel's automation output lands in public channel memory, a private channel's chime-in stays scoped to that channel's memory.
-
-
-
-
- Real scenarios — support, incidents, digests, and more.
-
-
- Wire up the tools automations and chime-in draw from.
-
-
diff --git a/apps/docs/company-brain/connectors.mdx b/apps/docs/company-brain/connectors.mdx
deleted file mode 100644
index 388dbaa0..00000000
--- a/apps/docs/company-brain/connectors.mdx
+++ /dev/null
@@ -1,64 +0,0 @@
----
-title: "Connectors"
-sidebarTitle: "Connectors"
-description: "Bring knowledge in with data connectors, and act in live tools with tool connectors"
-icon: "plug"
----
-
-Company Brain has two kinds of connectors. They look similar on the connections page, but they do different jobs:
-
-| | Data connectors | Tool connectors |
-|---|---|---|
-| **What they do** | Bring knowledge *in* | Let the agent *act* in the tool |
-| **Examples** | Google Drive, Notion, OneDrive | GitHub, Linear, Sentry, Plain, PostHog, Granola |
-| **Result** | Docs land in public channel memory and stay searchable | Live reads and writes (list PRs, create issues, check errors) |
-| **When it runs** | Background sync on a schedule | In the moment you ask |
-
-## Data connectors
-
-Data connectors sync existing files and docs into **public channel memory** so answers are grounded in real material — roadmaps, specs, handbooks, design docs.
-
-How it works:
-
-1. An admin connects a source (Drive, Notion workspace, OneDrive, and similar).
-2. Company Brain fetches, chunks, embeds, and indexes the content in the background.
-3. It re-syncs on a schedule automatically — you don't re-upload when a doc changes.
-
-Connecting a data source is a **team-level action**. What comes in is visible org-wide, same as anything from a public channel — see the [permissions graph](/company-brain/permissions) for exactly who can read what.
-
-
-A data connector is only as useful as the docs you point it at. Start with the handful of sources people actually re-read — product specs, the handbook, the latest roadmap — rather than every folder in Drive.
-
-
-## Tool connectors
-
-Tool connectors are live integrations (MCP-based under the hood). They don't just index past content — they read and act in the tool *right now*:
-
-- **GitHub** — open PRs, recent commits, repo context
-- **Linear** — find or create issues, check status
-- **Sentry** — what's actually erroring in prod
-- **Plain** — customer support tickets and history
-- **PostHog** — product analytics
-- **Granola** — meeting notes and decisions
-- **Custom servers** — wire up your own MCP endpoint when the catalog doesn't cover a tool
-
-You can also connect tools at two scopes — **Organization (shared)** or **Personal (yours)**. The full rule of thumb lives on [The permissions graph](/company-brain/permissions): reads prefer your personal connection and fall back to the org one; writes always run under your own account so the action is attributed to you.
-
-If neither you nor the org has a tool connected, but a teammate does, Company Brain can ask them to **lease** temporary access for that one request — see [Leasing](/company-brain/permissions#leasing-borrowing-access-for-one-request).
-
-## Which one do I need?
-
-- **"What's in our Q2 roadmap?"** → data connector (Drive/Notion/OneDrive already synced)
-- **"What are my open PRs?"** or **"Create a Linear issue"** → tool connector (GitHub / Linear)
-- **"What did we decide in the Acme call?"** → tool connector that also brings knowledge in (Granola), or a data connector if notes live in Drive/Notion
-
-You almost always want both: data connectors for the long-lived knowledge base, tool connectors for the live work happening this week.
-
-
-
- Scheduled digests and unprompted replies that use these connections.
-
-
- Walkthroughs of support, incidents, PRs, meetings, and more.
-
-
diff --git a/apps/docs/company-brain/outside-slack.mdx b/apps/docs/company-brain/outside-slack.mdx
deleted file mode 100644
index ba968a85..00000000
--- a/apps/docs/company-brain/outside-slack.mdx
+++ /dev/null
@@ -1,52 +0,0 @@
----
-title: "Using Outside Slack"
-sidebarTitle: "Outside Slack"
-description: "Reach the same permissions graph from Claude Code, ChatGPT, Cursor, or any MCP client"
-icon: "globe"
----
-
-Slack is the default surface, not the only one. Company Brain speaks MCP, so the same graph — your employee memory, the private channels you're in, public channel memory — is reachable from any MCP client: Claude Code, ChatGPT, Cursor, or anything else that speaks the protocol.
-
-## Connect
-
-Same endpoint as [Supermemory MCP](/supermemory-mcp/mcp) — there's no separate Company Brain server to point at:
-
-```text
-https://mcp.supermemory.ai/mcp
-```
-
-OAuth by default — your client discovers the authorization server and prompts you to sign in. Prefer an API key instead? Any key starting with `sm_` skips OAuth entirely.
-
-
-What changes isn't the URL, it's what shows up once you're connected. If your account belongs to an org with Company Brain, you get more than your own project spaces — your employee memory, the private channels you're in, and public channel memory all become available as workspaces, carrying your role and the exact same read/write access Slack already enforces.
-
-
-## Pick a workspace
-
-Once connected, ask it what's available — it returns every container tag you have access to: your employee memory, each private channel memory you belong to, and public channel memory. Select one to make it the active workspace for the session; everything after that scopes to it automatically.
-
-**Example:** from Claude Code, "what can I access in Acme's Company Brain?" surfaces your options as a picker — your employee memory, `#eng`'s private channel memory if you're in it, public channel memory. Pick one, and every search or save for the rest of the session happens inside it — the same as asking from that room in Slack.
-
-## Tools
-
-| Tool | What it does |
-|---|---|
-| `listContainerTags` | Everything you're allowed to read, with names and counts |
-| `select-workspace` / `set-active-tag` | Pick which one is active for this session |
-| `recall` | Search the active workspace, plus a profile summary when you're in your employee memory |
-| `save-memory` | Write back to the active workspace |
-| `memory-graph` | An interactive, visual map of a workspace's memories |
-| `whoAmI` | Your role, access type, and active workspace — useful for sanity-checking what a client can actually see |
-
-## Same graph, same guardrails
-
-Nothing here is a side door. What you can reach follows the exact same [permissions graph](/company-brain/permissions) as Slack — an admin can restrict a member's connection to specific container tags the same way they'd scope a Slack channel invite, and every read or write is checked against that before it runs.
-
-
-
- What each container tag actually is, and who can read it.
-
-
- Base setup, auth, and personal project spaces on the same server.
-
-
diff --git a/apps/docs/company-brain/overview.mdx b/apps/docs/company-brain/overview.mdx
deleted file mode 100644
index d709e0e7..00000000
--- a/apps/docs/company-brain/overview.mdx
+++ /dev/null
@@ -1,99 +0,0 @@
----
-title: "What is Supermemory Company Brain?"
-sidebarTitle: "Overview"
-description: "A super agent, with all the knowledge and tools of your team"
-icon: "brain"
----
-
-import { SlackThread, SlackMessage, Mention, ChannelRef, AgentLink } from "/snippets/slack-message.mdx";
-
-Supermemory Company Brain is a super agent with shared memory for your team that you can **ask questions** and that can **act in your tools**. It pulls from the work you already do - Slack threads, docs, GitHub, Linear - And can pretty much act as a real employee in your team.
-
-
-
- Meetings, decisions, projects, and who owns what — kept current as your connected sources sync.
-
-
- Pulls your open PRs, finds a Linear issue, or answers in a Slack channel — not just recites text back.
-
-
-
-## A quick example of its capabilities
-
-It'll answer a question, actually go do the work, or just jump into a conversation on its own when it's got something worth saying — like a coworker would, not a search bar. You can configure how funny and unhinged it is, or how of it you want.
-
-### Ask it anything
-
-
-
-
- supermemory what did we decide about pricing for the company brain
-
-
-
- You and mahesh decided yesterday that it stays at **$400/mo**, usage based only. we landed on that in a product huddle
-
-
-
-### Put it to work
-
-
-
-
- supermemory is the Stripe webhook timeout from Sentry already tracked anywhere?
-
-
-
- nope, nothing yet — just opened **ENG-847** for it, added the sentry issue to it, and put it on Sam since they were the last one in `webhooks/stripe.ts` and their beautiful code broke it ☠️. here you go, should probably fix it asap.
-
-
-
-### Let it speak up on its own
-
-
-
- is prod down? a couple of customers are pinging me
-
-
-
- not fully down — `api/search` is just elevated, 42 errors in the last 15 min (SM-2041), and Kush is on it. probably that deploy from this morning. Only one user has complained on support and i already replied to them saying it's being investigated.
-
-
-
-You don't need to mention it. It speaks up when it has something to add. It's smart and proactive!
-
-## Same knowledge, useful everywhere
-
-It's your team's knowledge — it doesn't have to stay in Slack. Take it wherever you're actually working:
-
-- **Your coding agent** — ask Claude Code or Cursor mid-session what the team decided, why a file looks the way it does, or who to ping about it, without tabbing over to Slack.
-- **Your own tools, via MCP** — Company Brain speaks MCP, so if whatever you're building can speak MCP too, it can ask. Plug it into an internal tool, a script, whatever you need.
-
-Same permissions graph everywhere, no exceptions — asking from Claude Code doesn't get you anything asking from Slack wouldn't.
-
-```text
-> is the stripe webhook thing from earlier actually fixed?
-yep — Sam shipped it in ENG-847 about an hour ago, Sentry's been quiet since
-```
-
-This knowledge can be used wherever you and your teammates go — see [Using outside Slack](/company-brain/outside-slack) for how to connect.
-
-## Use it your way
-
-Company Brain isn't locked to one model or one voice. Two things you control directly:
-
-- **Any model, no markup** — bring your own LLM and pay nothing extra for inference.
-- **Its tonality** — configure how it talks, from buttoned-up professional to fully unhinged. Make it sound like your team, not a generic chatbot.
-
-## Where to go next
-
-Company Brain has a handful of ideas worth understanding before you set it up: Our permissioning setup, how to configure it, proactiveness, automations, and more.
-
-
-
- What's remembered where, and who can read it.
-
-
- Get your team's workspace running.
-
-
diff --git a/apps/docs/company-brain/permissions.mdx b/apps/docs/company-brain/permissions.mdx
deleted file mode 100644
index e51c6f55..00000000
--- a/apps/docs/company-brain/permissions.mdx
+++ /dev/null
@@ -1,91 +0,0 @@
----
-title: "The Permissions Graph"
-sidebarTitle: "Permissions"
-description: "What Company Brain remembers, who it's visible to, and how tool access is scoped"
-icon: "shield-check"
----
-
-Company Brain isn't split into "a shared brain" and "a private brain." It's a graph: memory is written to the narrowest room a conversation happened in, and what a given conversation can *read* depends on where it's happening and who's asking. Nothing here is silent — every install, channel read, and temporary access grant requires an explicit accept from a real person.
-
-## Three memories, not two
-
-
-
- One per person. Built from your DMs with the bot and what it learns about you over time. Only visible from your own DM.
-
-
- One per private channel. Scoped to that room — visible to anyone in it, to no one outside it.
-
-
- One per organization. Anything durable from a public channel lands here. The whole org can draw on it.
-
-
-
-A message writes to exactly one of these — whichever room it happened in.
-
-## What a conversation can read
-
-Writing is narrow; reading is broader, and it widens the more private the room is:
-
-| Asking from | Can read |
-|---|---|
-| A public channel | Public channel memory |
-| A private channel | That channel's memory + public channel memory |
-| A DM with the bot | Your employee memory + public channel memory + every private channel memory you belong to |
-
-```mermaid
-flowchart LR
- Pub["Public channel memory (the whole org)"]
- Priv["Private channel memory (that room's members)"]
- Emp["Employee memory (you, in DM)"]
-
- Priv -.reads.-> Pub
- Emp -.reads.-> Pub
- Emp -.reads.-> Priv
-```
-
-A DM is the widest seat in the room precisely because it's the most private one — the bot answers you there with everything *you* could see, stitched together. A public channel is the opposite: the whole org can read it, so it only ever draws on what the whole org is allowed to know.
-
-
-If you're not in a private channel, its memory doesn't exist for you — not even by inference in a DM. The bot only ever reads with the asker's own access, so it can't surface something you couldn't otherwise see.
-
-
-**Example:** you DM the bot asking "what did we decide about the Acme deal?" It can draw on the public `#sales` channel, the private `#acme-deal` channel if you're in it, and anything it's learned about you directly — and it'll cite which one the answer came from. Ask the same question in `#general`, a public channel, and it can only answer from what `#general` and other public channels already know — the private `#acme-deal` context simply isn't in scope there.
-
-## Tool access follows you, not the connection
-
-Tools like GitHub and Linear can be connected two ways — **Organization (shared)**, set up once by an admin as a fallback the whole team can read from, or **Personal (yours)**, your own connection for your own reads and actions. Both show up on the same connections page; it's one tool catalog, connected at two possible scopes.
-
-Whichever scope answered, the result is still bounded by what *you* could already see or do in that tool yourself — Company Brain never gets a standing key to "everything Linear knows." If you're not on a private Linear team, the bot can't surface those issues to you either, even through the org-shared connection.
-
-| | Reads | Writes |
-|---|---|---|
-| **Behavior** | Try your personal connection first, then fall back to org-shared | Always run under your own connection |
-| **Why** | Gives you the fullest access you're entitled to | Attributes the action to a real person, never a shared service account |
-
-Admins can also act through the org-shared connection directly, for the cases where that's the point.
-
-## Leasing: borrowing access for one request
-
-Sometimes a request needs a tool neither you nor the org has connected — but a teammate has it connected personally. Rather than failing, Company Brain can ask that teammate directly: it posts a card in Slack asking them to approve or deny lending access for that one request.
-
-- Nothing is granted silently — a real person has to accept the card.
-- Access is short-lived and scoped to the single request that triggered it, not standing access to your account.
-- The teammate can say no, and the request simply doesn't go through.
-
-
-Leasing is a fallback of last resort — it only comes up when nobody's connected the tool at the org level yet. See [Connectors](/company-brain/connectors) to close that gap for good.
-
-
-## API keys inherit the same graph
-
-A scoped or agent API key can only reach what its owner could already reach by asking directly. A member can't mint a key that reads another member's employee memory or a private channel they're not in — the graph above applies identically whether a person is asking or a key is.
-
-
-
- Set up the data and tool connections this page describes.
-
-
- How scheduled runs and unprompted replies respect the same graph.
-
-
diff --git a/apps/docs/company-brain/setup.mdx b/apps/docs/company-brain/setup.mdx
deleted file mode 100644
index 1244c643..00000000
--- a/apps/docs/company-brain/setup.mdx
+++ /dev/null
@@ -1,87 +0,0 @@
----
-title: "Setup and Onboarding"
-sidebarTitle: "Setup"
-description: "Creating a team workspace and installing it into Slack"
-icon: "rocket"
----
-
-Setting up Company Brain is two admin steps: create the workspace, then install it into Slack. Everyone else joins on their own after that — see [Greeting new teammates](/company-brain/use-cases/greeting).
-
-## 1. Create your team workspace
-
-Creating a workspace sets up your shared **Team Brain** and your private **My Brain** in one step.
-
-
-
- Head to [app.supermemory.ai](https://app.supermemory.ai) and create an account.
-
-
- On the **About** step, switch from **Personal** to **Team**.
-
-
- Team workspaces are invite-only during the private beta. Not invited yet? Email **support@supermemory.com**, or start Personal and invite your team once you're in.
-
-
- 
-
-
- Enter your domain (for example `acme.com`) and confirm. Supermemory researches the company from there and seeds a starting profile, before any source finishes syncing.
-
- 
-
-
- All three run in parallel with research, and none of them block it:
-
- - **Add to Slack** — kicks off the install flow below.
- - **Connect apps** — Linear, Granola, Sentry, and more.
- - **Invite teammates** — now, not later. No per-seat pricing, so invite everyone in your Slack.
-
- 
-
-
- Supermemory's already learned a real amount about your company by the time research finishes. Watch Slack for a DM from it walking you through what it can do.
-
- 
-
-
-
-
-**Try it:** ask `What does {your company} do?` — you should get a real answer from the seeded profile.
-
-
-## 2. Install into Slack (admin)
-
-
-
- Go to [app.slack.com](https://app.slack.com) to create one first — Company Brain installs into an existing workspace, it doesn't create one for you.
-
- 
-
-
-
-
-
- Click **Install to Slack**. Not an admin? This triggers Slack's own request-to-install flow instead.
-
-
- The web app hands off immediately — "we've DM'd you in Slack."
-
-
- The agent creates `#company-brain`, posts an intro there, and announces itself once in `#general`.
-
-
- You approve each channel with a tap — it never joins one silently.
-
-
- Invite people with a picker, a workspace-wide toggle, or email.
-
-
-
-
-
- What member join looks like from a new hire's side.
-
-
- What each person can see once they're in.
-
-
diff --git a/apps/docs/company-brain/use-cases/acting-in-tools.mdx b/apps/docs/company-brain/use-cases/acting-in-tools.mdx
deleted file mode 100644
index 71d8d8f1..00000000
--- a/apps/docs/company-brain/use-cases/acting-in-tools.mdx
+++ /dev/null
@@ -1,58 +0,0 @@
----
-title: "Acting in Tools"
-sidebarTitle: "Acting in Tools"
-description: "List open PRs, create Linear issues — actions run under your own account"
-icon: "wrench"
----
-
-import { SlackThread, SlackMessage, Mention, AgentLink } from "/snippets/slack-message.mdx";
-
-## The scenario
-
-You don't just want to *know* something — you want Company Brain to do the next step in GitHub or Linear for you.
-
-## What happens
-
-### Read from a tool
-
-
-
-
- supermemory what are my open PRs in the web repo?
-
-
-
- You have **3 open PRs** on `supermemory/web`:
- - `#1199` staff custom MCP connection cards — review requested
- - `#1197` company brain onboarding research UI — changes requested
- - `#1181` brain connections board — approved, not merged
-
-
-
-### Write to a tool
-
-
-
-
- supermemory create a Linear issue: fix the onboarding redirect
-
-
-
- Created **ENG-842** — *Fix the onboarding redirect* in Engineering, assigned to you. Open in Linear
-
-
-
-## What's really going on
-
-Both turns use [tool connectors](/company-brain/connectors) (GitHub, Linear). Reads try your **personal** connection first and fall back to the org-shared one. **Writes always run under your own account** — so the Linear issue is attributed to you, never silently as "the org."
-
-If you haven't connected the tool and neither has the org, Company Brain can ask a teammate to [lease](/company-brain/permissions#leasing-borrowing-access-for-one-request) temporary access for that one request.
-
-
-
- Personal vs org tools, and how leasing works.
-
-
- Connect GitHub, Linear, and the rest.
-
-
diff --git a/apps/docs/company-brain/use-cases/greeting.mdx b/apps/docs/company-brain/use-cases/greeting.mdx
deleted file mode 100644
index 1a0b8af9..00000000
--- a/apps/docs/company-brain/use-cases/greeting.mdx
+++ /dev/null
@@ -1,53 +0,0 @@
----
-title: "Greeting New Teammates"
-sidebarTitle: "Greeting Teammates"
-description: "Connect card, welcome DM, and first answer — activation on day one"
-icon: "user-plus"
----
-
-import { SlackThread, SlackMessage } from "/snippets/slack-message.mdx";
-
-## The scenario
-
-A new hire joins the Slack workspace. They shouldn't need a web signup form or a long handbook read before Company Brain is useful — the whole first experience happens in Slack.
-
-## What happens
-
-They get a connect card, tap **Connect me**, and receive a welcome DM:
-
-
-
-
-
- Welcome to **Acme**. Here's what I know, what I can access, and what I keep private.
-
- Try one of these:
- 1. What does Acme do?
- 2. Who owns onboarding?
- 3. Where do we track bugs?
-
-
- What does Acme do?
-
-
-
- Acme builds memory infrastructure for AI apps — shared context for teams and agents. *(from the company profile your admin seeded at setup)*
-
-
-
-Right after the first answer, they're prompted to connect personal tools (Linear, Notion) so day-two questions can hit live data.
-
-## What's really going on
-
-This is the [member join flow](/company-brain/setup) told as a scenario. Tapping **Connect me** creates a passwordless account from their Slack email, provisions their private [employee memory](/company-brain/permissions), and consumes a seat. The three starter questions are seeded so the first useful answer happens on the first tap — that's the activation moment.
-
-No web app required for the new hire. Admins still do the one-time workspace + Slack install on the web.
-
-
-
- The full admin + member flow.
-
-
- Employee memory vs. public and private channel memory.
-
-
diff --git a/apps/docs/company-brain/use-cases/incidents.mdx b/apps/docs/company-brain/use-cases/incidents.mdx
deleted file mode 100644
index dcd4b392..00000000
--- a/apps/docs/company-brain/use-cases/incidents.mdx
+++ /dev/null
@@ -1,48 +0,0 @@
----
-title: "Incidents & Downtime Chatter"
-sidebarTitle: "Incidents"
-description: "Answer 'is prod down?' from live Sentry, and post scheduled error digests"
-icon: "triangle-alert"
----
-
-import { SlackThread, SlackMessage, AgentLink } from "/snippets/slack-message.mdx";
-
-## The scenario
-
-Someone drops a vague "is prod down?" in `#eng`. Company Brain correlates it with what's actually failing right now — and a separate automation keeps a daily error digest flowing without anyone asking.
-
-## What happens
-
-
-
- is prod down? a couple of customers are pinging me
-
-
-
- Not a full outage — **`api/search` is elevated** (42 errors in the last 15m, mostly `timeout on vectorize`). Sentry issue SM-2041. Deploy from this morning is the likely culprit; rollback candidate is `af61880`.
-
-
-
-Or, without anyone asking, a scheduled automation posts every morning:
-
-
-
-
- **Daily error digest** — 3 issues new since yesterday, 1 still spiking (`api/search` timeout). Full list in Sentry.
-
-
-
-## What's really going on
-
-The first exchange is a [chime-in](/company-brain/automations) (or an @mention — either works) that hits the **Sentry** [tool connector](/company-brain/connectors) for live error data. The second is an [automation](/company-brain/automations): a recurring prompt on a cron that posts to a channel using org-shared connections only, so it never runs as a specific person.
-
-If the channel is private, only an admin can target it with an automation, and the bot fails closed if it can't verify visibility.
-
-
-
- Connect Sentry (and friends) for live incident context.
-
-
- Schedule digests and understand chime-in.
-
-
diff --git a/apps/docs/company-brain/use-cases/knowledge-recall.mdx b/apps/docs/company-brain/use-cases/knowledge-recall.mdx
deleted file mode 100644
index 68aa29f2..00000000
--- a/apps/docs/company-brain/use-cases/knowledge-recall.mdx
+++ /dev/null
@@ -1,45 +0,0 @@
----
-title: "Answering from Your Docs"
-sidebarTitle: "From Docs"
-description: "Ask about roadmaps, specs, and handbooks in plain language"
-icon: "book"
----
-
-import { SlackThread, SlackMessage, Mention } from "/snippets/slack-message.mdx";
-
-## The scenario
-
-The Q2 roadmap lives in Notion. Nobody wants to dig for the link mid-conversation — they just ask.
-
-## What happens
-
-
-
-
- supermemory what's in our Q2 roadmap?
-
-
-
- Three themes for Q2:
- 1. **Company Brain GA** — Slack bot, connectors, automations
- 2. **Memory Router v2** — lower latency, better multi-tenant isolation
- 3. **Enterprise SSO + audit log**
-
- Full doc: *Q2 Roadmap* in Notion (last updated Jun 3).
-
-
-
-## What's really going on
-
-This is a [data connector](/company-brain/connectors) (Notion, Google Drive, or OneDrive) feeding [public channel memory](/company-brain/permissions). Content is fetched, chunked, embedded, and re-synced on a schedule — so when the roadmap changes in Notion, answers stay current without anyone re-uploading.
-
-Same pattern works for handbooks, design docs, RFCs, and "where do we document X?" style questions. If it doesn't know, it says so rather than guessing.
-
-
-
- Bring Drive, Notion, and OneDrive into public channel memory.
-
-
- Who can see what once it's indexed.
-
-
diff --git a/apps/docs/company-brain/use-cases/long-horizon-research.mdx b/apps/docs/company-brain/use-cases/long-horizon-research.mdx
deleted file mode 100644
index a7f56d40..00000000
--- a/apps/docs/company-brain/use-cases/long-horizon-research.mdx
+++ /dev/null
@@ -1,49 +0,0 @@
----
-title: "Long-Horizon Research"
-sidebarTitle: "Long-Horizon Research"
-description: "Questions that need many sources synthesized into one answer"
-icon: "telescope"
----
-
-import { SlackThread, SlackMessage, Mention } from "/snippets/slack-message.mdx";
-
-## The scenario
-
-Some questions aren't a quick lookup. They need pulling information from a lot of distinct places — docs, tickets, meetings, code, past Slack threads — and synthesizing it into one coherent answer. Closer to a research project than "what's the pricing?"
-
-## What it will look like
-
-
-
-
- supermemory prepare a brief on how we've handled enterprise SSO requests over the last two quarters — who asked, what we promised, what's still open, and what engineering thinks the real effort is
-
-
-
- **Enterprise SSO — two-quarter brief**
-
- - **Demand:** 6 serious asks (Acme, Globex, Initech, …). Three converted to paid pilots.
- - **Promises made:** Okta + Azure AD for pilots; custom SAML called "roadmap" in two decks.
- - **Still open:** Globex blocked on SCIM; Initech waiting on audit-log export.
- - **Eng view:** ~6 weeks for Okta/Azure path (from `#eng` thread Mar 18 + Linear ENG-610); SCIM is the long pole.
-
- Sources: Q1/Q2 enterprise notes, Linear ENG-610, Granola "SSO planning", `#sales` threads. Want this as a Linear doc?
-
-
-
-## What's really going on
-
-Today, a single turn can already hit multiple [connectors](/company-brain/connectors) and channel memory in one answer. Long-horizon research is for the cases where that isn't enough — the work needs more time, more parallel digging, and a structured synthesis step before it replies.
-
-We're deliberately not documenting an internal "spawn N children" mechanism here. What matters for you: ask a research-shaped question, get a sourced brief back, without you having to run six separate searches.
-
-Until it ships, break big questions into smaller ones (docs, then tickets, then "summarize what we have") — Company Brain already handles each of those well.
-
-
-
- What single-turn knowledge recall looks like today.
-
-
- Pulling decisions out of synced notes.
-
-
diff --git a/apps/docs/company-brain/use-cases/meeting-recall.mdx b/apps/docs/company-brain/use-cases/meeting-recall.mdx
deleted file mode 100644
index 0192c24c..00000000
--- a/apps/docs/company-brain/use-cases/meeting-recall.mdx
+++ /dev/null
@@ -1,40 +0,0 @@
----
-title: "Meeting Recall"
-sidebarTitle: "Meeting Recall"
-description: "Ask what was decided in a meeting and get the answer from synced notes"
-icon: "calendar-check"
----
-
-import { SlackThread, SlackMessage, Mention } from "/snippets/slack-message.mdx";
-
-## The scenario
-
-Someone missed the Acme call — or was there and forgot the outcome. They ask in Slack and get the decision, with a path back to the source notes.
-
-## What happens
-
-
-
-
- supermemory what did we decide in the meeting with Acme?
-
-
-
- Acme is moving to annual billing at the current rate, with a 90-day pilot on the enterprise SSO add-on. Follow-up owned by **Priya**, due Friday. *(from Granola notes, Acme QBR — Jun 11)*
-
-
-
-## What's really going on
-
-Meeting notes come in through a [connector](/company-brain/connectors) — Granola for live meeting notes, or Drive/Notion if notes land there. Once synced, they live in [public channel memory](/company-brain/permissions), so anyone on the team can ask about them. The answer cites the source so you can open the original notes and verify.
-
-Ask about a decision, an owner, a date, or "what did we promise them" — plain language is fine.
-
-
-
- Why meeting notes land in public channel memory.
-
-
- Connect Granola, Drive, or Notion.
-
-
diff --git a/apps/docs/company-brain/use-cases/meeting-scheduling.mdx b/apps/docs/company-brain/use-cases/meeting-scheduling.mdx
deleted file mode 100644
index 87bad5f6..00000000
--- a/apps/docs/company-brain/use-cases/meeting-scheduling.mdx
+++ /dev/null
@@ -1,43 +0,0 @@
----
-title: "Meeting Scheduling"
-sidebarTitle: "Scheduling"
-description: "Find free time and send a calendar invite from Slack"
-icon: "calendar-plus"
----
-
-import { SlackThread, SlackMessage, Mention } from "/snippets/slack-message.mdx";
-
-
-**Coming soon.** Calendar scheduling isn't in Company Brain yet — there's no calendar connector in the catalog today. This page shows the experience we're building toward, using a real exchange from our own team.
-
-
-## The scenario
-
-A teammate needs help and doesn't want to play calendar ping-pong. They ask in Slack; Company Brain checks availability and offers to book the slot.
-
-## What it will look like
-
-
-
- Dhravya are you free this afternoon? need some help with dev setup
-
-
-
- Dhravya is free at **2:00 PM**. Sending an invite to block **20 mins** on both your calendars.
-
-
-
-## What's really going on
-
-When this ships, it will be a [tool connector](/company-brain/connectors) against the calendar — same personal-vs-org rules and [write-under-your-account](/company-brain/permissions) attribution as Linear or GitHub. Creating an invite is a write, so it runs as the person who has the calendar connected (or via an explicit [lease](/company-brain/permissions#leasing-borrowing-access-for-one-request) if someone else is lending access for that one request).
-
-Until then: ask Company Brain for *context* around scheduling ("who's the right person for dev setup?" / "when did we last pair on this?") and book the time the usual way.
-
-
-
- How personal tools and leasing will apply to calendar.
-
-
- Back to all scenarios — including what's shipped today.
-
-
diff --git a/apps/docs/company-brain/use-cases/overview.mdx b/apps/docs/company-brain/use-cases/overview.mdx
deleted file mode 100644
index 13742132..00000000
--- a/apps/docs/company-brain/use-cases/overview.mdx
+++ /dev/null
@@ -1,47 +0,0 @@
----
-title: "What You Can Do"
-sidebarTitle: "Overview"
-description: "Real scenarios for Company Brain — from Slack answers to sandbox debugging"
-icon: "sparkles"
----
-
-Company Brain is most useful when it shows up in the work you already do. These walkthroughs are short, concrete scenarios — each one is a real exchange, what the bot is actually doing under the hood, and which concept page to read if you want the full picture.
-
-## Shipped today
-
-
-
- Customer question in Slack; Company Brain chimes in with the answer.
-
-
- "Is prod down?" answered from live Sentry, plus scheduled digests.
-
-
- "What did we decide with Acme?" from synced meeting notes.
-
-
- Roadmaps, specs, and handbooks — asked in plain language.
-
-
- List open PRs, create a Linear issue — under your own account.
-
-
- Connect card, welcome DM, first answer — activation on day one.
-
-
- Actually run the failing test in an isolated workspace.
-
-
-
-## Coming soon
-
-
-
- Questions that need many sources synthesized into one answer.
-
-
- Find free time and send a calendar invite from Slack.
-
-
-
-If you're still setting things up, start with [What is Company Brain?](/company-brain/overview) and work through the Concepts section first — the walkthroughs assume those ideas.
diff --git a/apps/docs/company-brain/use-cases/sandbox-debugging.mdx b/apps/docs/company-brain/use-cases/sandbox-debugging.mdx
deleted file mode 100644
index c28e4a8b..00000000
--- a/apps/docs/company-brain/use-cases/sandbox-debugging.mdx
+++ /dev/null
@@ -1,51 +0,0 @@
----
-title: "Sandbox Debugging"
-sidebarTitle: "Sandbox"
-description: "Hand it a failing test — it runs the code in an isolated workspace and reports back"
-icon: "terminal"
----
-
-import { SlackThread, SlackMessage, Mention } from "/snippets/slack-message.mdx";
-
-## The scenario
-
-A test is failing and the stack trace alone isn't enough. You want Company Brain to actually run the code, not just describe what it *would* do.
-
-## What happens
-
-
-
-
- supermemory the `permissions.lease` unit test is failing on main — can you reproduce and tell me why?
-
-
-
- Reproduced in a sandbox against `main`.
-
- **Failure:** `permissions.lease` expects temporary access to expire in 15 minutes, but the fixture still asserts 30.
- **Cause:** the default was shortened in `#1188`; the unit test wasn't updated.
- **Fix:** point the assertion at the shared default so it can't drift again.
-
-
-
-## What's really going on
-
-Company Brain spins up an **isolated workspace**, checks out what it needs, runs the command, and reads the output. It's not guessing from static code alone — it's executing.
-
-Guardrails are intentional, so it's safe to hand real tasks to:
-
-- No `git push`, no deploys
-- No elevated privileges (`sudo` and similar are blocked)
-- No reaching arbitrary internal network addresses
-- No long-running dev servers
-
-Think of it as a sealed workbench: useful for reproduce / inspect / explain loops, not for shipping changes on your behalf.
-
-
-
- When the next step is a Linear issue or a PR lookup.
-
-
- All the scenario walkthroughs.
-
-
diff --git a/apps/docs/company-brain/use-cases/support-escalation.mdx b/apps/docs/company-brain/use-cases/support-escalation.mdx
deleted file mode 100644
index 60c2837f..00000000
--- a/apps/docs/company-brain/use-cases/support-escalation.mdx
+++ /dev/null
@@ -1,101 +0,0 @@
----
-title: "From Support Ticket to Code Fix"
-sidebarTitle: "Escalation"
-description: "A Plain ticket gets triaged in Slack, and an @mention hands the fix to Cursor"
-icon: "bug"
----
-
-import { SlackThread, SlackMessage, Mention, FileAttachment, AgentLink, SlackUnfurl, SlackButton } from "/snippets/slack-message.mdx";
-
-## The scenario
-
-A customer files a ticket through Plain. It lands in `#support`, gets triaged with context Company Brain already has lying around, and — instead of someone manually filing a bug and waiting — an @mention hands the whole thing straight to Cursor.
-
-## What happens
-
-
-
-
- New conversation: rewriteQuery param not working
-
- **Jordan Alvarez** (acme-corp.io) sent a **new message**.
-
- hi team, just tried the `rewriteQuery` param on the v3 search endpoint and it doesn't seem to actually do anything — tried a few different values, results look identical either way. can someone take a look
-
-
-
-
- Confirmed, this is a real one — a couple of people have also flagged it on GitHub over the last week.
-
-
- Quick context: v3 search is deprecated, but we've committed to legacy support through end of year, so it's still worth fixing rather than telling people to migrate. Most likely cause is a change Adam shipped last week to cut down query-rewrite costs — looks like it short-circuits before `rewriteQuery` gets applied in some cases.
-
-
- cursor can you take this one? Full context attached.
-
-
-
-
-
-
- Agent thread started
-
- Reproducing against the v3 search test suite now.
-
-
-
- Fixed — `rewriteQuery` was getting skipped by the new cost short-circuit whenever a query was already cached. Pushed on #2312.
-
-
- **Resolution:**
-
- • Scoped the short-circuit to skip only the rewrite step, not the whole `rewriteQuery` path
-
- • Added a regression test covering `rewriteQuery` against a cache hit
-
-
- **Repository:** `supermemoryai/mono`
-
-
- Open in Web
- Open in Desktop
-
-
-
- Dhravya I'll let you review that and let the customer know we have a fix ready.
-
- Please do it ASAP — it's an enterprise customer!
-
-
-
-## What's really going on
-
-The first two turns are the same pattern as [Automatic Support](/company-brain/use-cases/support): the bot is already a member of `#support`, so it [chimes in](/company-brain/automations) unprompted, correlating the ticket against known GitHub issues and whatever it knows about the codebase and the v3 deprecation timeline.
-
-The handoff to Cursor is different. That's not a chime-in — it's an explicit `@mention`, and Cursor is wired in as a [tool connector](/company-brain/connectors) (a custom MCP server, same as GitHub or Linear under the hood) that can act, not just answer. Naming it by name is what triggers the write: Company Brain hands off the attached context and Cursor opens its own agent thread against the repo, the same way a mention of GitHub or Linear in [Acting in Tools](/company-brain/use-cases/acting-in-tools) triggers a write rather than a read. Nothing happens in the codebase without that explicit ask.
-
-Whether that handoff is even possible follows the same [permissions](/company-brain/permissions) rules as any other tool: it runs under whichever connection — personal or org-shared — is actually wired up for Cursor, and it's scoped to what that connection can see.
-
-
-
- How @mentions trigger writes instead of reads.
-
-
- Wire up Plain, GitHub, and custom MCP servers like Cursor.
-
-
diff --git a/apps/docs/company-brain/use-cases/support.mdx b/apps/docs/company-brain/use-cases/support.mdx
deleted file mode 100644
index 8d2a2791..00000000
--- a/apps/docs/company-brain/use-cases/support.mdx
+++ /dev/null
@@ -1,39 +0,0 @@
----
-title: "Automatic Support"
-sidebarTitle: "Support"
-description: "Company Brain chimes in on customer questions with answers from docs and tickets"
-icon: "headset"
----
-
-import { SlackThread, SlackMessage } from "/snippets/slack-message.mdx";
-
-## The scenario
-
-A customer question lands in `#support`. Nobody has to @mention the bot — it already has the answer from past tickets and the help docs.
-
-## What happens
-
-
-
- customer on the Pro plan is asking if they can export their full memory graph as CSV — do we support that?
-
-
-
- Yes — **Settings → Export → Full graph (CSV)**. Available on Pro and above. Same answer went out on ticket PLN-1842 last week if you want the exact wording.
-
-
-
-## What's really going on
-
-This is [proactiveness (chime-in)](/company-brain/automations) plus a connected support tool (Plain) and public channel memory. The bot is already a member of `#support` (an admin invited it — it never joins on its own). It decided the answer was clear enough to speak without being asked, pulled the export path from docs in public channel memory, and cited a recent ticket from Plain.
-
-Same channel scope rules apply: a public support channel writes durable learnings back to public channel memory; a private support channel keeps them scoped to that room's own memory. See [Permissions](/company-brain/permissions).
-
-
-
- How chime-in decides when to speak.
-
-
- Wire up Plain and your help docs.
-
-
diff --git a/apps/docs/docs.json b/apps/docs/docs.json
index 663c9b40..75d91754 100644
--- a/apps/docs/docs.json
+++ b/apps/docs/docs.json
@@ -399,38 +399,6 @@
}
],
"tab": "Plugins and MCP"
- },
- {
- "tab": "Company Brain",
- "groups": [
- {
- "group": "Concepts",
- "pages": [
- "company-brain/overview",
- "company-brain/setup",
- "company-brain/permissions",
- "company-brain/connectors",
- "company-brain/automations",
- "company-brain/outside-slack"
- ]
- },
- {
- "group": "What you can do",
- "pages": [
- "company-brain/use-cases/overview",
- "company-brain/use-cases/support",
- "company-brain/use-cases/incidents",
- "company-brain/use-cases/support-escalation",
- "company-brain/use-cases/meeting-recall",
- "company-brain/use-cases/knowledge-recall",
- "company-brain/use-cases/acting-in-tools",
- "company-brain/use-cases/greeting",
- "company-brain/use-cases/sandbox-debugging",
- "company-brain/use-cases/long-horizon-research",
- "company-brain/use-cases/meeting-scheduling"
- ]
- }
- ]
}
]
},
@@ -959,6 +927,11 @@
"destination": "/overview/analytics",
"permanent": true,
"source": "/analytics"
+ },
+ {
+ "destination": "/overview/what-is-supermemory",
+ "permanent": true,
+ "source": "/company-brain/:slug*"
}
],
"styling": {
diff --git a/apps/docs/images/company-brain/cursor-icon.png b/apps/docs/images/company-brain/cursor-icon.png
deleted file mode 100644
index cd75c37d..00000000
Binary files a/apps/docs/images/company-brain/cursor-icon.png and /dev/null differ
diff --git a/apps/docs/images/company-brain/dhravya-slack-icon.jpg b/apps/docs/images/company-brain/dhravya-slack-icon.jpg
deleted file mode 100644
index 42def4ae..00000000
Binary files a/apps/docs/images/company-brain/dhravya-slack-icon.jpg and /dev/null differ
diff --git a/apps/docs/images/company-brain/plain-icon.png b/apps/docs/images/company-brain/plain-icon.png
deleted file mode 100644
index b15aa9b8..00000000
Binary files a/apps/docs/images/company-brain/plain-icon.png and /dev/null differ
diff --git a/apps/docs/images/company-brain/signup-company-domain.png b/apps/docs/images/company-brain/signup-company-domain.png
deleted file mode 100644
index 9bbdf7db..00000000
Binary files a/apps/docs/images/company-brain/signup-company-domain.png and /dev/null differ
diff --git a/apps/docs/images/company-brain/signup-research-complete.png b/apps/docs/images/company-brain/signup-research-complete.png
deleted file mode 100644
index 905fdb41..00000000
Binary files a/apps/docs/images/company-brain/signup-research-complete.png and /dev/null differ
diff --git a/apps/docs/images/company-brain/signup-research-connect.png b/apps/docs/images/company-brain/signup-research-connect.png
deleted file mode 100644
index 90038254..00000000
Binary files a/apps/docs/images/company-brain/signup-research-connect.png and /dev/null differ
diff --git a/apps/docs/images/company-brain/signup-team-toggle.png b/apps/docs/images/company-brain/signup-team-toggle.png
deleted file mode 100644
index 60bc734d..00000000
Binary files a/apps/docs/images/company-brain/signup-team-toggle.png and /dev/null differ
diff --git a/apps/docs/images/company-brain/slack-create-workspace.png b/apps/docs/images/company-brain/slack-create-workspace.png
deleted file mode 100644
index 5b8d8593..00000000
Binary files a/apps/docs/images/company-brain/slack-create-workspace.png and /dev/null differ
diff --git a/apps/docs/images/company-brain/supermemory-slack-icon.png b/apps/docs/images/company-brain/supermemory-slack-icon.png
deleted file mode 100644
index 5dde938c..00000000
Binary files a/apps/docs/images/company-brain/supermemory-slack-icon.png and /dev/null differ
diff --git a/apps/docs/images/intro-company-brain-card.jpg b/apps/docs/images/intro-company-brain-card.jpg
deleted file mode 100644
index 4a11fc83..00000000
Binary files a/apps/docs/images/intro-company-brain-card.jpg and /dev/null differ
diff --git a/apps/docs/images/intro-company-brain.jpg b/apps/docs/images/intro-developer-platform.jpg
similarity index 100%
rename from apps/docs/images/intro-company-brain.jpg
rename to apps/docs/images/intro-developer-platform.jpg
diff --git a/apps/docs/index.mdx b/apps/docs/index.mdx
index 8b85ca51..6b3eee98 100644
--- a/apps/docs/index.mdx
+++ b/apps/docs/index.mdx
@@ -47,38 +47,21 @@ export const HeroCard = ({ title, description, href, children }) => {
>
Quickstart
-
- Set up your company brain
-
-
+
-
-
-
diff --git a/apps/docs/integrations/hermes.mdx b/apps/docs/integrations/hermes.mdx
index d45811cb..7e5c82c7 100644
--- a/apps/docs/integrations/hermes.mdx
+++ b/apps/docs/integrations/hermes.mdx
@@ -12,7 +12,7 @@ Hermes also includes built-in **`MEMORY.md`** and **`USER.md`**. supermemory add
## Get Your API Key
-Create a supermemory API key from the [app with plugins deep link](https://app.supermemory.ai/?plugins=true) (or the [API Keys](https://console.supermemory.ai/keys) page in the console). During `hermes memory setup` you can paste it when prompted, or persist it in your environment:
+Create a supermemory API key from the [API Keys](https://console.supermemory.ai/keys) page in the console. During `hermes memory setup` you can paste it when prompted, or persist it in your environment:
## Install the memory provider
diff --git a/apps/docs/integrations/openclaw.mdx b/apps/docs/integrations/openclaw.mdx
index 5704d3d4..50b3011d 100644
--- a/apps/docs/integrations/openclaw.mdx
+++ b/apps/docs/integrations/openclaw.mdx
@@ -28,7 +28,7 @@ openclaw supermemory setup
openclaw gateway restart
```
-Enter your API key from [app.supermemory.ai](https://app.supermemory.ai/?view=integrations). That's it.
+Enter your API key from the [API Keys](https://console.supermemory.ai/keys) page in the console. That's it.
@@ -166,7 +166,7 @@ openclaw supermemory wipe # Delete all memories (requires confirma
openclaw supermemory setup
```
- 3. When prompted, paste your API key from [app.supermemory.ai](https://app.supermemory.ai/?view=integrations). The key starts with `sm_`.
+ 3. When prompted, paste your API key from the [API Keys](https://console.supermemory.ai/keys) page in the console. The key starts with `sm_`.
4. Restart OpenClaw to activate the plugin:
diff --git a/apps/docs/integrations/opencode.mdx b/apps/docs/integrations/opencode.mdx
index 3cce46d7..86872de7 100644
--- a/apps/docs/integrations/opencode.mdx
+++ b/apps/docs/integrations/opencode.mdx
@@ -37,7 +37,7 @@ Check the connection any time:
bunx opencode-supermemory@latest status
```
-Or set an API key manually from [app.supermemory.ai](https://app.supermemory.ai/?view=integrations) / [API Keys](https://console.supermemory.ai/keys):
+Or set an API key manually from the [API Keys](https://console.supermemory.ai/keys) page in the console:
diff --git a/apps/docs/overview/comparison.mdx b/apps/docs/overview/comparison.mdx
index 669887d2..bb1e36cf 100644
--- a/apps/docs/overview/comparison.mdx
+++ b/apps/docs/overview/comparison.mdx
@@ -91,7 +91,7 @@ If you are migrating from a specific tool, use the [migration guides](/migration
- There's no concept of Profiles since they don't have the same underlying learning model and store engine
- You still have to build the entire thing around it, on their abstraction. Low configurability and doesn't support many use cases (Extractors, retrieval, etc.)
-**Supermemory instead:** memory is a first-class data model (documents → derived memories → graph → profiles), not a convenience wrapper. Same store from API, MCP, plugins, and Company Brain, all primitives built in for you to compose for your use case. See [How it works](/concepts/how-it-works) and [Graph memory](/concepts/graph-memory).
+**Supermemory instead:** memory is a first-class data model (documents → derived memories → graph → profiles), not a convenience wrapper. Same store from API, MCP, and plugins, all primitives built in for you to compose for your use case. See [How it works](/concepts/how-it-works) and [Graph memory](/concepts/graph-memory).
vs Pure RAG / document search products
diff --git a/apps/docs/overview/use-cases.mdx b/apps/docs/overview/use-cases.mdx
index 34090d04..8f306980 100644
--- a/apps/docs/overview/use-cases.mdx
+++ b/apps/docs/overview/use-cases.mdx
@@ -31,7 +31,7 @@ Supermemory is one context engine. These are the shapes teams ship on top of it.
Drive, Notion, Gmail, OneDrive, S3, GitHub, web crawler — sync sources, then ask questions with managed SuperRAG.
- Policies, wikis, and internal docs as shared memory for the team — API or Company Brain.
+ Policies, wikis, and internal docs as shared memory for the team.
Papers, notes, and long documents with multimodal ingestion (PDF, images, audio/video) and hybrid search.
@@ -59,7 +59,6 @@ Deep dive lives in Developer Platform concepts ([container tags](/concepts/conta
|---|---|
| Call the Memory API from your app | [Quickstart](/quickstart) |
| Use Claude / Cursor / coding agents | [Plugins & MCP](/supermemory-mcp/mcp) |
-| Give the whole company a knowledge brain | Company Brain (from [docs home](/)) |
| Keep data on your machines | [Self-hosting](/self-hosting/overview) |
## Related
diff --git a/apps/docs/overview/what-is-supermemory.mdx b/apps/docs/overview/what-is-supermemory.mdx
index 273d2119..c1a319f9 100644
--- a/apps/docs/overview/what-is-supermemory.mdx
+++ b/apps/docs/overview/what-is-supermemory.mdx
@@ -78,17 +78,6 @@ It provides all the building blocks — Memory, Retrieval, Profiles, Connectors,
style={{ transform: "scale(0.85)" }}
/>
-
-
-
With supermemory, developers can provide perfect recall about their users to build AI agents that are more intelligent, more personalized, and more consistent.
@@ -126,7 +115,7 @@ For the full category argument (vs DIY vectors, thin memory wrappers, pure RAG),
- **Memory is a graph, not a blob store** — facts [update, connect, and forget](/concepts/graph-memory) in real time; not nearest-neighbor chunks alone
- **User profiles built in** — static + dynamic context the agent should [always know](/concepts/user-profiles), ~ready for the prompt
- **Memory + SuperRAG in one engine** — personalize *and* ground on the same `containerTag` / context pool
-- **Every door, one store** — API, [MCP](/supermemory-mcp/mcp), plugins, [SMFS](/smfs/overview), connectors, and Company Brain share the same memories
+- **Every door, one store** — API, [MCP](/supermemory-mcp/mcp), plugins, [SMFS](/smfs/overview), and connectors share the same memories
- **Multimodal by default** — text, chats, PDFs, images, video, code via [extractors](/concepts/content-types) and [connectors](/connectors/overview)
- **Run it your way** — managed cloud or [self-host](/self-hosting/overview) as a single binary (including offline)
diff --git a/apps/docs/quickstart.mdx b/apps/docs/quickstart.mdx
index 5aaa31cf..7edb05e1 100644
--- a/apps/docs/quickstart.mdx
+++ b/apps/docs/quickstart.mdx
@@ -17,7 +17,7 @@ Same `containerTag` for everything. One engine, three ways out.
Grab a key from the [developer console](https://console.supermemory.ai) — **API Keys → Create API Key**.
-**console.supermemory.ai** is where keys and usage live. **app.supermemory.ai** is the consumer product on the same engine — not where you mint API keys.
+**console.supermemory.ai** is where keys and usage live.
```bash TypeScript
diff --git a/apps/docs/supermemory-mcp/setup.mdx b/apps/docs/supermemory-mcp/setup.mdx
index 0110e58d..6b444f54 100644
--- a/apps/docs/supermemory-mcp/setup.mdx
+++ b/apps/docs/supermemory-mcp/setup.mdx
@@ -57,8 +57,6 @@ Add the server to `~/.cursor/mcp.json`:
}
```
-You can also use the install option in [app.supermemory.ai](https://app.supermemory.ai).
-
### Other MCP clients
Add `https://mcp.supermemory.ai/mcp` as a remote HTTP MCP server and complete the OAuth flow opened by your client. Exact menu names and configuration locations vary between clients.
diff --git a/apps/web/.env.example b/apps/web/.env.example
index ea6cacb9..c5698351 100644
--- a/apps/web/.env.example
+++ b/apps/web/.env.example
@@ -1,3 +1 @@
-NEXT_PUBLIC_BACKEND_URL=https://api.supermemory.ai
-NEXT_PUBLIC_POSTHOG_KEY=
-NEXT_PUBLIC_AGENTID_AUTH_ENABLED=
+NEXT_PUBLIC_CONSOLE_URL=
diff --git a/apps/web/README.md b/apps/web/README.md
index 9cd849fb..5b4a60b8 100644
--- a/apps/web/README.md
+++ b/apps/web/README.md
@@ -1 +1,5 @@
-# supermemory Consumer
\ No newline at end of file
+# @repo/web
+
+Serves `app.supermemory.ai`. Every request is forwarded to the console: plugin and OAuth paths get an immediate redirect with the query string intact, and everything else shows a short notice before moving on.
+
+Set `NEXT_PUBLIC_CONSOLE_URL` to point at a different console origin during local development.
diff --git a/apps/web/app/(app)/brain-home/page.tsx b/apps/web/app/(app)/brain-home/page.tsx
deleted file mode 100644
index 187ed230..00000000
--- a/apps/web/app/(app)/brain-home/page.tsx
+++ /dev/null
@@ -1,992 +0,0 @@
-"use client"
-
-import { Suspense } from "react"
-import { useSearchParams } from "next/navigation"
-import { GoogleDrive, Notion } from "@ui/assets/icons"
-import { cn } from "@lib/utils"
-import { dmSans125ClassName, dmSansClassName } from "@/lib/fonts"
-import { ArrowRight, Mail, MessageSquare, Plus, Sparkles } from "lucide-react"
-import { AnimatedGradientBackground } from "@/components/animated-gradient-background"
-import { Header } from "@/components/header"
-import { HomeChatComposer } from "@/components/chat/home-chat-composer"
-import {
- RecommendedRail,
- SourcesHealthRail,
-} from "@/components/brain-home/widgets"
-
-const modalCardStyle = {
- boxShadow:
- "0 2.842px 14.211px 0 rgba(0, 0, 0, 0.25), 0.711px 0.711px 0.711px 0 rgba(255, 255, 255, 0.10) inset",
-}
-
-const inputBevelStyle = {
- boxShadow:
- "0px 1px 2px 0px rgba(0,43,87,0.1), inset 0px 0px 0px 1px rgba(43,49,67,0.08), inset 0px 1px 1px 0px rgba(0,0,0,0.08), inset 0px 2px 4px 0px rgba(0,0,0,0.02)",
-}
-
-type Space = {
- id: string
- name: string
- icon: React.ReactNode
- itemCount: number
- lastSync: string
-}
-
-const _SPACES: Space[] = [
- {
- id: "drive",
- name: "My Drive",
- icon: ,
- itemCount: 287,
- lastSync: "2h ago",
- },
- {
- id: "notion",
- name: "Company Notion",
- icon: ,
- itemCount: 142,
- lastSync: "12m ago",
- },
- {
- id: "gmail",
- name: "Gmail",
- icon: ,
- itemCount: 1843,
- lastSync: "Just now",
- },
-]
-
-type Stat = {
- label: string
- value: string
- delta?: string
- deltaTint?: "up" | "down" | "neutral"
-}
-
-const STATS: Stat[] = [
- {
- label: "Items ingested",
- value: "2,272",
- delta: "+148 this week",
- deltaTint: "up",
- },
- {
- label: "Agent sessions",
- value: "184",
- delta: "+42 vs last wk",
- deltaTint: "up",
- },
- {
- label: "Active contributors",
- value: "4",
- delta: "of 6 invited",
- deltaTint: "neutral",
- },
- {
- label: "Top space",
- value: "Gmail",
- delta: "1,843 items",
- deltaTint: "neutral",
- },
-]
-
-type AgentSeries = {
- key: string
- label: string
- color: string
-}
-
-const AGENT_SERIES: AgentSeries[] = [
- { key: "cursor", label: "Cursor", color: "#4BA0FA" },
- { key: "claudeCode", label: "Claude Code", color: "#FF8A47" },
- { key: "claudeDesktop", label: "Claude Desktop", color: "#B19CFF" },
- { key: "chatgpt", label: "ChatGPT", color: "#10A37F" },
- { key: "other", label: "Other", color: "#525D6E" },
-]
-
-const SESSIONS_BY_DAY: {
- label: string
- values: Record
-}[] = [
- {
- label: "Mon",
- values: {
- cursor: 8,
- claudeCode: 4,
- claudeDesktop: 3,
- chatgpt: 2,
- other: 1,
- },
- },
- {
- label: "Tue",
- values: {
- cursor: 10,
- claudeCode: 6,
- claudeDesktop: 4,
- chatgpt: 3,
- other: 1,
- },
- },
- {
- label: "Wed",
- values: {
- cursor: 12,
- claudeCode: 9,
- claudeDesktop: 5,
- chatgpt: 4,
- other: 1,
- },
- },
- {
- label: "Thu",
- values: {
- cursor: 9,
- claudeCode: 5,
- claudeDesktop: 4,
- chatgpt: 3,
- other: 1,
- },
- },
- {
- label: "Fri",
- values: {
- cursor: 14,
- claudeCode: 10,
- claudeDesktop: 6,
- chatgpt: 4,
- other: 2,
- },
- },
- {
- label: "Sat",
- values: {
- cursor: 5,
- claudeCode: 3,
- claudeDesktop: 2,
- chatgpt: 1,
- other: 1,
- },
- },
- {
- label: "Sun",
- values: {
- cursor: 17,
- claudeCode: 12,
- claudeDesktop: 7,
- chatgpt: 4,
- other: 1,
- },
- },
-]
-
-const RECENT_ANSWERS = [
- {
- question: "What did we decide about pricing?",
- answer: "Pro stays at $20/mo. No overages, top-up only.",
- who: "You",
- when: "2h ago",
- },
- {
- question: "What's blocking the Acme deal?",
- answer: "MSA review — Jane drafting a net-30 counter.",
- who: "You",
- when: "4h ago",
- },
- {
- question: "Who owns the onboarding rewrite?",
- answer: "Design team. Ship target Friday.",
- who: "Sarah Kim",
- when: "Yesterday",
- },
-]
-
-const WEEKLY_DIGEST = {
- range: "Mon – Fri",
- headline:
- "Your brain captured 642 items, surfaced 12 decisions, and answered 184 questions across the team.",
- bullets: [
- {
- label: "5 deadlines coming up next week",
- tint: "text-[#4BA0FA]",
- },
- {
- label: "2 conflicts surfaced between Notion and Slack",
- tint: "text-[#FF8A47]",
- },
- {
- label: "Sarah Kim led contributions with 14 docs",
- tint: "text-[#A1A1AA]",
- },
- ],
-}
-
-const TEAM_THIS_WEEK = [
- {
- name: "Sarah Kim",
- email: "sarah@acme.com",
- contributions: 14,
- summary: "14 docs · 3 spaces",
- color: "#FF8A47",
- },
- {
- name: "Jane Doe",
- email: "jane@acme.com",
- contributions: 11,
- summary: "11 docs · 2 spaces",
- color: "#4BA0FA",
- },
- {
- name: "Mahesh S.",
- email: "mahesh@acme.com",
- contributions: 9,
- summary: "9 docs · 1 space",
- color: "#A1A1AA",
- },
- {
- name: "Alex Chen",
- email: "alex@acme.com",
- contributions: 7,
- summary: "7 docs · 2 spaces",
- color: "#10A37F",
- },
-]
-
-const TEAM_RECENT = [
- { who: "Sarah Kim", what: "added a memo to acme-deal-q2", when: "14m" },
- { who: "Jane Doe", what: "updated the Acme MSA draft", when: "1h" },
- { who: "You", what: 'asked "What did we decide about pricing?"', when: "2h" },
- {
- who: "Sarah Kim",
- what: "connected Notion to Sales space",
- when: "Yesterday",
- },
-]
-
-const ACTIVITY = [
- {
- when: "2m",
- text: "23 new docs ingested from Drive",
- source: "drive",
- },
- {
- when: "14m",
- text: "Jane added a memo to acme-deal-q2",
- source: "notion",
- },
- {
- when: "1h",
- text: "Decision surfaced: pricing locked at $20 Pro",
- source: "slack",
- },
- {
- when: "3h",
- text: "14 Notion pages updated by Sarah Kim",
- source: "notion",
- },
- {
- when: "5h",
- text: "New entity formed: pricing-v3",
- source: "system",
- },
- {
- when: "Yesterday",
- text: "MSA contract uploaded · auto-tagged contracts/MSA",
- source: "drive",
- },
-]
-
-const _RECENT_ITEMS: Record = {
- drive: [
- { title: "Q2 Roadmap.docx", meta: "Edited 1h ago · Jane" },
- { title: "Acme · MSA draft v3.pdf", meta: "Added 2h ago" },
- { title: "Pricing model.xlsx", meta: "Edited 4h ago · Mahesh" },
- { title: "Customer feedback Q1.docx", meta: "Yesterday" },
- { title: "Brand assets / logos", meta: "2 days ago" },
- ],
- notion: [
- { title: "Engineering / Weekly sync", meta: "Updated 12m ago" },
- { title: "Sales / Acme account", meta: "Updated 1h ago" },
- { title: "Brand / Voice & tone", meta: "Yesterday" },
- { title: "Onboarding rewrite spec", meta: "2 days ago" },
- ],
- gmail: [
- { title: "Re: Acme contract review", meta: "Just now · jane@acme.com" },
- { title: "Customer feedback digest", meta: "10m ago" },
- { title: "Re: Pricing decision", meta: "1h ago" },
- { title: "Onboarding ship plan", meta: "3h ago" },
- ],
-}
-
-export default function BrainHomePage() {
- return (
-
-
-
- )
-}
-
-function BrainHomeInner() {
- const searchParams = useSearchParams()
- const empty = searchParams?.get("empty") === "1"
-
- return (
-
-
-
-
- Invalid Referral
-
-
- This referral link is not valid or has expired.
-
-
-
-
-
-
-
-
-
- )
- }
-
- return (
-
-
- {/* Welcome Card */}
-
-
-
-
-
-
- You're invited to supermemory!
-
-
- {referralData.referrerName} invited you to join the future of
- memory management.
-
-
-
-
-
-
- What is supermemory?
-
-
- supermemory is an AI-powered personal knowledge base that
- helps you store, organize, and interact with all your digital
- memories - from documents and links to conversations and
- ideas.
-
-
-
-
-
- Learn more about supermemory
-
-
-
-
-
-
- {/* Share Card */}
-
-
-
- Share with friends
-
-
- Help others discover supermemory and earn priority access.
-
-
-
-
-
-
-
- {referralLink}
-
-
-
-
-
-
-
-
-
-
-
- )
-}
diff --git a/apps/web/app/ref/page.tsx b/apps/web/app/ref/page.tsx
deleted file mode 100644
index 9c97cdd6..00000000
--- a/apps/web/app/ref/page.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-"use client"
-
-import { Button } from "@ui/components/button"
-import {
- Card,
- CardContent,
- CardDescription,
- CardHeader,
- CardTitle,
-} from "@ui/components/card"
-import { ShareIcon } from "lucide-react"
-import Link from "next/link"
-
-export default function ReferralHomePage() {
- return (
-
-
-
-
-
-
-
- Missing Referral Code
-
-
- It looks like you're missing a referral code. Get one from a friend
- or join directly!
-
-
-
-
-
-
- What is supermemory?
-
-
- supermemory is an AI-powered personal knowledge base that helps
- you store, organize, and interact with all your digital
- memories.
-
- {state.preview.isOrgMember
- ? `Link Slack to ${state.preview.orgName}`
- : `This account isn't in ${state.preview.orgName}`}
-
-
- {state.preview.isOrgMember
- ? "Company Brain will recognize you by your Slack identity, even when your emails differ."
- : `Switch to a Supermemory account that belongs to ${state.preview.orgName}, or ask an admin to add ${state.preview.signedInEmail}.`}
-