chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,160 @@
|
||||
:root {
|
||||
--abyss: #000000;
|
||||
--iron: #181818;
|
||||
--charcoal: #202020;
|
||||
--ash: #7d7d7d;
|
||||
--steel: #969696;
|
||||
--mist: #e6e6e6;
|
||||
--white: #ffffff;
|
||||
--gold: #ffc000;
|
||||
--gold-deep: #917300;
|
||||
--gold-soft: #ffce3e;
|
||||
--cyan: #29abe2;
|
||||
--blue: #3860be;
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: var(--abyss);
|
||||
color: var(--white);
|
||||
font-family: var(--font-archivo), "Helvetica Neue", Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
|
||||
a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
transition: color 160ms ease;
|
||||
}
|
||||
a:hover {
|
||||
color: var(--blue);
|
||||
}
|
||||
|
||||
button {
|
||||
font-family: inherit;
|
||||
cursor: pointer;
|
||||
background: none;
|
||||
border: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
::selection {
|
||||
background: var(--gold);
|
||||
color: var(--abyss);
|
||||
}
|
||||
|
||||
/* Reveal animation */
|
||||
.reveal {
|
||||
opacity: 0;
|
||||
transform: translateY(32px);
|
||||
transition: opacity 600ms ease,
|
||||
transform 600ms cubic-bezier(0.2, 0.8, 0.2, 1);
|
||||
}
|
||||
.reveal.is-visible {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
animation-duration: 0.001ms !important;
|
||||
transition-duration: 0.001ms !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Buttons shared */
|
||||
.btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 18px 28px;
|
||||
font-size: 14.4px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.2px;
|
||||
text-transform: uppercase;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 0;
|
||||
transition:
|
||||
background 200ms ease,
|
||||
color 200ms ease,
|
||||
border-color 200ms ease,
|
||||
opacity 200ms ease;
|
||||
cursor: pointer;
|
||||
}
|
||||
.btn--accent {
|
||||
background: var(--gold);
|
||||
color: var(--abyss);
|
||||
padding: 22px 32px;
|
||||
font-size: 16px;
|
||||
}
|
||||
.btn--accent:hover {
|
||||
background: var(--gold-deep);
|
||||
color: var(--white);
|
||||
}
|
||||
.btn--ghost {
|
||||
background: transparent;
|
||||
color: var(--white);
|
||||
border-color: rgba(255, 255, 255, 0.5);
|
||||
opacity: 0.85;
|
||||
}
|
||||
.btn--ghost:hover {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
border-color: var(--white);
|
||||
color: var(--white);
|
||||
opacity: 1;
|
||||
}
|
||||
.btn--small {
|
||||
padding: 10px 14px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
/* Shared section head */
|
||||
.section-head {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto 56px;
|
||||
padding: 0 40px;
|
||||
}
|
||||
.section-eyebrow {
|
||||
display: inline-block;
|
||||
font-size: 12px;
|
||||
letter-spacing: 0.96px;
|
||||
color: var(--gold);
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 16px;
|
||||
padding: 6px 10px;
|
||||
border: 1px solid var(--gold);
|
||||
}
|
||||
.section-title {
|
||||
font-size: clamp(32px, 5vw, 72px);
|
||||
font-weight: 900;
|
||||
line-height: 0.98;
|
||||
letter-spacing: -0.01em;
|
||||
margin: 0 0 24px;
|
||||
text-transform: uppercase;
|
||||
text-wrap: balance;
|
||||
}
|
||||
.section-lede {
|
||||
max-width: 680px;
|
||||
font-size: 16px;
|
||||
letter-spacing: 0.12px;
|
||||
color: var(--steel);
|
||||
text-transform: uppercase;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.section-head {
|
||||
padding: 0 20px;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
import type { Metadata, Viewport } from "next";
|
||||
import { Archivo, JetBrains_Mono } from "next/font/google";
|
||||
import "./globals.css";
|
||||
|
||||
const archivo = Archivo({
|
||||
subsets: ["latin"],
|
||||
weight: ["400", "500", "700", "900"],
|
||||
variable: "--font-archivo",
|
||||
display: "swap",
|
||||
});
|
||||
|
||||
const jetbrains = JetBrains_Mono({
|
||||
subsets: ["latin"],
|
||||
weight: ["400", "500"],
|
||||
variable: "--font-mono",
|
||||
display: "swap",
|
||||
});
|
||||
|
||||
export const metadata: Metadata = {
|
||||
metadataBase: new URL("https://agentmemory.dev"),
|
||||
title: "AGENTMEMORY — PERSISTENT MEMORY FOR AI CODING AGENTS",
|
||||
description:
|
||||
"The memory layer your coding agent should have had from day one. 95.2% retrieval R@5. 92% fewer tokens. 0 external databases. Works with every agent.",
|
||||
icons: {
|
||||
icon: [{ url: "/icon.svg", type: "image/svg+xml" }],
|
||||
apple: "/icon.svg",
|
||||
},
|
||||
openGraph: {
|
||||
title: "agentmemory",
|
||||
description:
|
||||
"Persistent memory for AI coding agents. Runs locally. Zero external databases.",
|
||||
type: "website",
|
||||
url: "/",
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
title: "agentmemory",
|
||||
description:
|
||||
"Persistent memory for AI coding agents. Runs locally. Zero external databases.",
|
||||
},
|
||||
};
|
||||
|
||||
export const viewport: Viewport = {
|
||||
themeColor: "#000000",
|
||||
width: "device-width",
|
||||
initialScale: 1,
|
||||
};
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<html lang="en" className={`${archivo.variable} ${jetbrains.variable}`}>
|
||||
<body>{children}</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
import { ImageResponse } from "next/og";
|
||||
|
||||
export const alt = "agentmemory — persistent memory for AI coding agents";
|
||||
export const size = { width: 1200, height: 630 };
|
||||
export const contentType = "image/png";
|
||||
|
||||
export default function Image() {
|
||||
return new ImageResponse(
|
||||
(
|
||||
<div
|
||||
style={{
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
justifyContent: "space-between",
|
||||
padding: "72px 80px",
|
||||
background:
|
||||
"radial-gradient(ellipse at 20% 0%, #1a1407 0%, #0a0a0a 55%, #000 100%)",
|
||||
color: "#fff",
|
||||
fontFamily: "system-ui, -apple-system, sans-serif",
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
gap: 16,
|
||||
fontSize: 20,
|
||||
letterSpacing: 3,
|
||||
fontWeight: 700,
|
||||
color: "#f3b840",
|
||||
textTransform: "uppercase",
|
||||
}}
|
||||
>
|
||||
<div
|
||||
style={{
|
||||
width: 14,
|
||||
height: 14,
|
||||
background: "#f3b840",
|
||||
boxShadow: "0 0 24px #f3b840",
|
||||
}}
|
||||
/>
|
||||
<span>AGENTMEMORY</span>
|
||||
</div>
|
||||
|
||||
<div style={{ display: "flex", flexDirection: "column", gap: 28 }}>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
fontSize: 128,
|
||||
fontWeight: 900,
|
||||
lineHeight: 0.95,
|
||||
letterSpacing: -3,
|
||||
textTransform: "uppercase",
|
||||
}}
|
||||
>
|
||||
<span>AGENT</span>
|
||||
<span style={{ color: "#f3b840" }}>MEMORY</span>
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
fontSize: 32,
|
||||
color: "#b8b8b8",
|
||||
letterSpacing: 0.5,
|
||||
maxWidth: 900,
|
||||
lineHeight: 1.35,
|
||||
}}
|
||||
>
|
||||
Persistent memory for AI coding agents. Runs locally. Zero external
|
||||
databases.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
style={{
|
||||
display: "flex",
|
||||
gap: 48,
|
||||
fontSize: 22,
|
||||
color: "#888",
|
||||
letterSpacing: 2,
|
||||
textTransform: "uppercase",
|
||||
fontWeight: 700,
|
||||
borderTop: "1px solid #222",
|
||||
paddingTop: 28,
|
||||
}}
|
||||
>
|
||||
<div style={{ display: "flex", gap: 10 }}>
|
||||
<span style={{ color: "#f3b840" }}>95.2%</span>
|
||||
<span>RETRIEVAL R@5</span>
|
||||
</div>
|
||||
<div style={{ display: "flex", gap: 10 }}>
|
||||
<span style={{ color: "#f3b840" }}>92%</span>
|
||||
<span>FEWER TOKENS</span>
|
||||
</div>
|
||||
<div style={{ display: "flex", gap: 10 }}>
|
||||
<span style={{ color: "#f3b840" }}>0</span>
|
||||
<span>EXTERNAL DBs</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
{ ...size },
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
import { ScrollProgress } from "@/components/ScrollProgress";
|
||||
import { Nav } from "@/components/Nav";
|
||||
import { Hero } from "@/components/Hero";
|
||||
import { Stats } from "@/components/Stats";
|
||||
import { Primitives } from "@/components/Primitives";
|
||||
import { Features } from "@/components/Features";
|
||||
import { CommandCenter } from "@/components/CommandCenter";
|
||||
import { LiveTerminal } from "@/components/LiveTerminal";
|
||||
import { Compare } from "@/components/Compare";
|
||||
import { Testimonials } from "@/components/Testimonials";
|
||||
import { Agents } from "@/components/Agents";
|
||||
import { Install } from "@/components/Install";
|
||||
import { Footer } from "@/components/Footer";
|
||||
import { getProjectMeta } from "@/lib/meta";
|
||||
|
||||
export default function Page() {
|
||||
const meta = getProjectMeta();
|
||||
return (
|
||||
<>
|
||||
<ScrollProgress />
|
||||
<Nav />
|
||||
<main id="top">
|
||||
<Hero />
|
||||
<Stats
|
||||
mcpTools={meta.mcpTools}
|
||||
hooks={meta.hooks}
|
||||
testsPassing={meta.testsPassing}
|
||||
/>
|
||||
<Primitives />
|
||||
<Features
|
||||
hooks={meta.hooks}
|
||||
mcpTools={meta.mcpTools}
|
||||
restEndpoints={meta.restEndpoints}
|
||||
/>
|
||||
<CommandCenter />
|
||||
<LiveTerminal mcpTools={meta.mcpTools} hooks={meta.hooks} />
|
||||
<Compare />
|
||||
<Testimonials />
|
||||
<Agents />
|
||||
<Install />
|
||||
</main>
|
||||
<Footer />
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
export const alt = "agentmemory — persistent memory for AI coding agents";
|
||||
export const size = { width: 1200, height: 630 };
|
||||
export const contentType = "image/png";
|
||||
|
||||
export { default } from "./opengraph-image";
|
||||
Reference in New Issue
Block a user