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 ( -
- +