diff --git a/client/src/index.css b/client/src/index.css
index aefd80e..892eac9 100644
--- a/client/src/index.css
+++ b/client/src/index.css
@@ -136,6 +136,7 @@
body {
@apply font-sans antialiased bg-background text-foreground;
+ overflow-x: hidden;
}
html {
@@ -379,6 +380,19 @@
background-size: 60px 60px;
}
+.xmem-grid {
+ background-image:
+ linear-gradient(rgba(255, 255, 255, 0.045) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(255, 255, 255, 0.045) 1px, transparent 1px),
+ linear-gradient(135deg, rgba(184, 255, 101, 0.08), transparent 34%, rgba(61, 216, 255, 0.07) 66%, transparent);
+ background-size: 72px 72px, 72px 72px, 100% 100%;
+}
+
+::selection {
+ background: rgba(184, 255, 101, 0.28);
+ color: white;
+}
+
/* Dot pattern */
.dot-pattern {
background-image: radial-gradient(circle, rgba(255,255,255,0.08) 1px, transparent 1px);
diff --git a/client/src/pages/home.tsx b/client/src/pages/home.tsx
index 3e25689..cd456eb 100644
--- a/client/src/pages/home.tsx
+++ b/client/src/pages/home.tsx
@@ -1,88 +1,577 @@
-import { useEffect, useState } from "react";
-import { Canvas } from "@react-three/fiber";
-import { Stars } from "@react-three/drei";
-import { motion, useScroll, useTransform } from "framer-motion";
-import { HeroScene } from "../components/three-d/HeroScene";
+import { motion } from "framer-motion";
+import { Link } from "wouter";
+import {
+ ArrowRight,
+ BadgeCheck,
+ BrainCircuit,
+ Check,
+ ChevronRight,
+ Code2,
+ DatabaseZap,
+ FileSearch,
+ GitBranch,
+ Github,
+ KeyRound,
+ Layers3,
+ LockKeyhole,
+ Network,
+ PlugZap,
+ Radar,
+ ScanSearch,
+ ShieldCheck,
+ Sparkles,
+ TerminalSquare,
+ Workflow,
+ X,
+ Zap,
+} from "lucide-react";
import { Navbar } from "../sections/Navbar";
-import { HeroSection } from "../sections/HeroSection";
-import { ProblemSection } from "../sections/ProblemSection";
-import { SolutionSection } from "../sections/SolutionSection";
-import { DemoSection } from "../sections/Demo";
-import { SecondBrainSection } from "../sections/SecondBrainSection";
-import { BenchmarkSection } from "../sections/BenchmarkSection";
-import { SystemArchitectureSection } from "../sections/SystemArchitectureSection";
-import { HowItWorksSection } from "../sections/HowItWorksSection";
-import { AgenticSection } from "../sections/AgenticSection";
-import { EnterpriseSection } from "../sections/EnterpriseSection";
-import { DeveloperSection } from "../sections/DeveloperSection";
-import { ConnectorsSection } from "../sections/ConnectorsSection";
-import { UseCasesSection } from "../sections/UseCasesSection";
-import { VisionSection } from "../sections/VisionSection";
-import { CTASection } from "../sections/CTASection";
import { Footer } from "../sections/Footer";
-import { BrainOverlay } from "../components/BrainOverlay";
-export default function Home() {
- const [viewportHeight, setViewportHeight] = useState(() =>
- typeof window === "undefined" ? 800 : window.innerHeight,
- );
- const { scrollY } = useScroll();
- const canvasOpacity = useTransform(
- scrollY,
- [viewportHeight * 0.8, viewportHeight * 1.18],
- [1, 0],
+const primitives = [
+ {
+ eyebrow: "01",
+ title: "Persistent Memory",
+ copy: "Store preferences, project context, decisions, snippets, and temporal events as durable memory objects.",
+ icon: BrainCircuit,
+ },
+ {
+ eyebrow: "02",
+ title: "Judge Before Write",
+ copy: "Classify, merge, contradict, and promote memories before they pollute your agent context.",
+ icon: ShieldCheck,
+ },
+ {
+ eyebrow: "03",
+ title: "Codebase Scanner",
+ copy: "Index repositories into queryable code memory so assistants answer with source-aware context.",
+ icon: ScanSearch,
+ },
+ {
+ eyebrow: "04",
+ title: "Context Importer",
+ copy: "Turn shared AI chats, notes, and long conversations into reusable memory for every next session.",
+ icon: FileSearch,
+ },
+ {
+ eyebrow: "05",
+ title: "MCP Ready",
+ copy: "Bring memory into Claude, Cursor, Codex, OpenCode, browser workflows, and custom agent runtimes.",
+ icon: PlugZap,
+ },
+ {
+ eyebrow: "06",
+ title: "Memory Domains",
+ copy: "Profile, temporal, summary, code, and snippet domains keep retrieval precise instead of mushy.",
+ icon: Layers3,
+ },
+];
+
+const stackRows = [
+ ["State", "Threads, users, tools, and handoffs persist without manual session plumbing."],
+ ["Memory", "Facts evolve as users and projects change, with stale context retired instead of repeated."],
+ ["Retrieval", "Hybrid recall gives agents the right memory object, not a random chunk dump."],
+ ["Connectors", "Browser extension, MCP clients, imports, and scanner routes feed one memory plane."],
+ ["Control", "Developers can inspect, edit, route, and govern what an agent is allowed to remember."],
+];
+
+const oldStack = [
+ "Vector DB for chunks",
+ "Redis for session state",
+ "Custom prompt stuffing",
+ "Separate browser extension",
+ "Manual contradiction logic",
+ "No shared agent profile",
+];
+
+const newStack = [
+ "One API for ingest and recall",
+ "Memory domains built in",
+ "Judge-before-write pipeline",
+ "Code and chat importers",
+ "MCP and extension surface",
+ "Queryable profile layer",
+];
+
+const useCases = [
+ {
+ title: "Coding agents",
+ copy: "Remember repo architecture, implementation decisions, TODOs, and the user's preferred review style.",
+ icon: Code2,
+ },
+ {
+ title: "Research assistants",
+ copy: "Carry source trails, entities, claims, and open questions across long-running investigations.",
+ icon: Radar,
+ },
+ {
+ title: "Support copilots",
+ copy: "Recall customer preferences, account state, prior resolutions, and unresolved blockers.",
+ icon: BadgeCheck,
+ },
+ {
+ title: "Personal AI stacks",
+ copy: "Share a coherent memory across ChatGPT, Claude, Cursor, Codex, and your own tools.",
+ icon: Network,
+ },
+];
+
+const metrics = [
+ ["5", "memory domains"],
+ ["1", "shared context plane"],
+ ["MCP", "agent interface"],
+ ["OSS", "developer owned"],
+];
+
+function SectionLabel({
+ children,
+ icon: Icon,
+}: {
+ children: React.ReactNode;
+ icon: typeof BrainCircuit;
+}) {
+ return (
+
+
+ {children}
+
);
+}
- useEffect(() => {
- const onResize = () => setViewportHeight(window.innerHeight);
- window.addEventListener("resize", onResize);
- return () => window.removeEventListener("resize", onResize);
- }, []);
+function HeroMemoryMap() {
+ const nodes = [
+ ["Profile", "left-[8%] top-[20%]", "border-[#b8ff65]/45 text-[#dfffaa]"],
+ ["Code", "left-[18%] bottom-[19%]", "border-[#3dd8ff]/45 text-[#aeeeff]"],
+ ["Temporal", "right-[11%] top-[23%]", "border-[#ff6b4a]/45 text-[#ffc0b2]"],
+ ["Summary", "right-[20%] bottom-[18%]", "border-white/25 text-white/70"],
+ ["MCP", "left-[45%] top-[12%]", "border-[#f7d56d]/45 text-[#ffe8a6]"],
+ ];
return (
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+ animate={{ rotate: 360 }}
+ transition={{ duration: 44, repeat: Infinity, ease: "linear" }}
+ className="absolute left-1/2 top-[46%] h-[430px] w-[430px] -translate-x-1/2 -translate-y-1/2 rounded-full border border-dashed border-[#b8ff65]/20"
+ />
+
+ {nodes.map(([label, position, color]) => (
+
+ {label}
+
+ ))}
+
+
+
+ );
+}
+
+function HeroSection() {
+ return (
+
+
+
+
+
+
+ Open-source memory infrastructure for agents
+
+
+
+ XMem
+
+ gives every agent a past.
+
+
+
+
+ A unified memory plane for LLM apps, coding agents, MCP clients, and browser workflows. XMem stores the durable context, judges what should change, and retrieves the exact memory your agent needs next.
+
+
+
+
+
+
+ quickstart.ts
+ memory.create
+
+
+ {`import { XMem } from "@xmem/sdk";
+
+const memory = new XMem({ apiKey: process.env.XMEM_API_KEY });
+
+await memory.remember({
+ user: "ishaan",
+ domain: "code",
+ text: "The scanner route uses repository-aware retrieval."
+});
+
+const context = await memory.recall("What should Codex know before editing?");`}
+
+
+
+
+ );
+}
+
+function MetricsBand() {
+ return (
+
+
+ {metrics.map(([value, label]) => (
+
+ ))}
+
+
+ );
+}
+
+function PrimitiveSection() {
+ return (
+
+
+
+
+
+
+ Product primitives
+
+
+ Memory should be infrastructure, not a prompt hack.
+
+
+
+ The new landing page leads with the system XMem actually gives builders: ingest, judge, store, retrieve, and share context across every place an agent works.
+
+
+
+
+ {primitives.map(({ eyebrow, title, copy, icon: Icon }) => (
+
+
+ {title}
+ {copy}
+
+ ))}
+
+
+
+ );
+}
+
+function StackComparisonSection() {
+ return (
+
+
+
+
+
Unified API
+
+ Replace the context glue with one memory control plane.
+
+
+ Inspired by the best current infra pages, this section makes the problem visual: most teams wire together state, RAG, memory, and tools. XMem turns those pieces into one inspectable graph.
+
+
+
+
+
+
+
DIY memory stack
+
+
+
+ {oldStack.map((item) => (
+
+
+ {item}
+
+ ))}
+
+
+
+
+
+
XMem plane
+
+
+
+ {newStack.map((item) => (
+
+
+ {item}
+
+ ))}
+
+
+
+
+
+
+
+ {stackRows.map(([label, copy]) => (
+
+
+
+
+
{label}
+
{copy}
+
+ ))}
+
+
+
+
+ );
+}
+
+function DemoSection() {
+ return (
+
+
+
+
+
Builder workflow
+
+ Import context once. Reuse it everywhere.
+
+
+ The landing page now shows a practical loop: scan a repo, import conversations, attach MCP, and give the next agent a clean memory bundle instead of a pasted wall of text.
+
+
+
+ {[
+ ["scan", "Index a repository"],
+ ["remember", "Promote durable facts"],
+ ["recall", "Retrieve current context"],
+ ["handoff", "Share it with the next agent"],
+ ].map(([cmd, copy]) => (
+
+ ))}
+
+
+
+
+
+ XMem browser extension
+ live asset
+
+
+
+
+
+
+ );
+}
+
+function DeveloperSection() {
+ return (
+
+
+
+
+
+
+ Developer surface
+
+
+ A memory layer developers can reason about.
+
+
+ The page avoids vague AI magic and shows concrete surfaces: commands, memory objects, domains, routing, and inspection.
+
+
+
+
+
+
+
+
+ memory.json
+
+
+ {`{
+ "domain": "profile",
+ "confidence": 0.92,
+ "source": "context-importer",
+ "memory": {
+ "fact": "Prefers concise PR summaries.",
+ "scope": "developer_workflow",
+ "expires": null
+ },
+ "judge": "merge_with_existing"
+}`}
+
+
+
+
+
+ {useCases.map(({ title, copy, icon: Icon }) => (
+
+
+ {title}
+ {copy}
+
+ ))}
+
+
+
+ );
+}
+
+function SecuritySection() {
+ return (
+
+
+
+
Control
+
+ Memory is powerful only when teams can govern it.
+
+
+ XMem's pitch is developer ownership: open-source infrastructure, inspectable objects, domain routing, and enough structure to keep agents from remembering the wrong thing forever.
+
+
+
+
+ {[
+ ["Open source", "Own the memory pipeline and deploy where your users need it."],
+ ["Inspectable", "Search, edit, and reason about memory objects instead of hidden state."],
+ ["Portable", "Use the same context across agents, tools, and model providers."],
+ ].map(([title, copy]) => (
+
+ ))}
+
+
+
+ );
+}
+
+function CTASection() {
+ return (
+
+
+
+
+ Stop resetting your agents to zero.
+
+
+ Give your next coding assistant, support bot, or research agent a memory layer it can carry across sessions.
+
+
+
+
+ Start building
+
+
+
+ Read docs
+
+
+
+
+
+ );
+}
+
+export default function Home() {
+ return (
+
+
+
-
-
+
+
+
-
-
-
-
-
-
-
-
-
+
-
-
+
+
);
}
diff --git a/client/src/sections/Navbar.tsx b/client/src/sections/Navbar.tsx
index d9771fc..d590f8e 100644
--- a/client/src/sections/Navbar.tsx
+++ b/client/src/sections/Navbar.tsx
@@ -1,6 +1,5 @@
import { Link } from "wouter";
import { useEffect, useState } from "react";
-import { motion } from "framer-motion";
import { useAuth } from "@/contexts/AuthContext";
import {
DropdownMenu,
@@ -67,7 +66,7 @@ function GitHubStarButton() {
href={GITHUB_REPO_URL}
target="_blank"
rel="noopener noreferrer"
- className="flex items-center gap-2 rounded-md border border-white/10 bg-white/[0.03] px-3 py-1.5 text-sm text-white/80 transition-all hover:border-white/20 hover:bg-white/[0.07] hover:text-white"
+ className="hidden items-center gap-2 rounded-md border border-white/10 bg-white/[0.03] px-3 py-1.5 text-sm text-white/80 transition-all hover:border-white/20 hover:bg-white/[0.07] hover:text-white sm:flex"
>
Star
@@ -158,10 +157,7 @@ export function Navbar() {
};
return (
-
Log in
- Get Started
+ Start
+ Get Started
>
)}
-
+
);
}
diff --git a/docs/pr-screenshots/landing-desktop.png b/docs/pr-screenshots/landing-desktop.png
new file mode 100644
index 0000000..70854e4
Binary files /dev/null and b/docs/pr-screenshots/landing-desktop.png differ
diff --git a/docs/pr-screenshots/landing-mobile.png b/docs/pr-screenshots/landing-mobile.png
new file mode 100644
index 0000000..479f93d
Binary files /dev/null and b/docs/pr-screenshots/landing-mobile.png differ