diff --git a/landing/.gitignore b/landing/.gitignore
new file mode 100644
index 00000000..8fec6031
--- /dev/null
+++ b/landing/.gitignore
@@ -0,0 +1,5 @@
+.next/
+.wrangler/
+out/
+node_modules/
+npm-debug.log*
diff --git a/landing/README.md b/landing/README.md
new file mode 100644
index 00000000..b179faed
--- /dev/null
+++ b/landing/README.md
@@ -0,0 +1,14 @@
+# AgentCompany Landing
+
+Next.js landing page for the AgentCompany desktop release lane.
+
+## Copy Sources
+
+| Surface | Source |
+|---|---|
+| Download cards | `landing/components/release-links.generated.ts` |
+| Platform FAQ | `landing/lib/platform-support.ts` |
+| Hero, How It Works, software JSON-LD features | `landing/lib/product-narrative.ts` |
+| Runtime download URLs | generated from `scripts/generate-landing-release-links.mjs` |
+
+The public story mirrors the first-run desktop flow: Welcome, Requirements, Providers, Company, Team Models, Mode, Mission, Launch.
diff --git a/landing/_headers b/landing/_headers
new file mode 100644
index 00000000..27e6349e
--- /dev/null
+++ b/landing/_headers
@@ -0,0 +1,21 @@
+/*
+ Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://static.cloudflareinsights.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data:; connect-src 'self' https://cloudflareinsights.com; base-uri 'self'; form-action 'self'; frame-ancestors 'none'
+ Permissions-Policy: camera=(), microphone=(), geolocation=()
+ Referrer-Policy: strict-origin-when-cross-origin
+ X-Content-Type-Options: nosniff
+ X-Frame-Options: DENY
+
+/screenshots/*
+ Cache-Control: public, max-age=31536000, immutable
+
+/assets/*
+ Cache-Control: public, max-age=31536000, immutable
+
+/_next/static/*
+ Cache-Control: public, max-age=31536000, immutable
+
+/favicon.ico
+ Cache-Control: public, max-age=31536000, immutable
+
+/icon.png
+ Cache-Control: public, max-age=31536000, immutable
diff --git a/landing/app/globals.css b/landing/app/globals.css
new file mode 100644
index 00000000..7948109b
--- /dev/null
+++ b/landing/app/globals.css
@@ -0,0 +1,128 @@
+@import "tailwindcss";
+
+@theme {
+ --font-sans: "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
+ --font-serif: "Space Grotesk", "Inter", ui-sans-serif, system-ui, sans-serif;
+ --font-mono: "Space Mono", ui-monospace, SFMono-Regular, monospace;
+}
+
+/* ── Light Theme (Cohere) ── */
+:root {
+ --bg: #ffffff;
+ --bg-subtle: #fafafa;
+ --panel: #ffffff;
+ --panel-soft: #fafafa;
+ --text: #000000;
+ --text-secondary: #212121;
+ --muted: #93939f;
+ --muted-strong: #565650;
+ --accent: #1863dc;
+ --accent-hover: #1352b8;
+ --accent-soft: rgba(24, 99, 220, 0.06);
+ --text-on-accent: #ffffff;
+ --cta: #000000;
+ --cta-hover: #212121;
+ --cta-soft: rgba(0, 0, 0, 0.04);
+ --text-on-cta: #ffffff;
+ --text-on-cta-muted: rgba(255, 255, 255, 0.75);
+ --text-on-cta-faint: rgba(255, 255, 255, 0.60);
+ --border: rgba(0, 0, 0, 0.06);
+ --border-cool: #d9d9dd;
+ --glow-warm: rgba(24, 99, 220, 0.04);
+ --glow-accent: rgba(24, 99, 220, 0.03);
+ --section-alt: rgba(0, 0, 0, 0.015);
+}
+
+/* ── Dark Theme (Cohere) ── */
+.dark {
+ --bg: #17171c;
+ --bg-subtle: #1e1e24;
+ --panel: #212126;
+ --panel-soft: #2a2a30;
+ --text: #fafafa;
+ --text-secondary: #d9d9dd;
+ --muted: #93939f;
+ --muted-strong: #b8b8b2;
+ --accent: #1863dc;
+ --accent-hover: #2070e8;
+ --accent-soft: rgba(24, 99, 220, 0.12);
+ --text-on-accent: #ffffff;
+ --cta: #fafafa;
+ --cta-hover: #e5e5e5;
+ --cta-soft: rgba(250, 250, 250, 0.06);
+ --text-on-cta: #17171c;
+ --text-on-cta-muted: rgba(23, 23, 28, 0.75);
+ --text-on-cta-faint: rgba(23, 23, 28, 0.60);
+ --border: rgba(250, 250, 250, 0.08);
+ --border-cool: #333338;
+ --glow-warm: rgba(24, 99, 220, 0.06);
+ --glow-accent: rgba(24, 99, 220, 0.04);
+ --section-alt: rgba(24, 99, 220, 0.025);
+}
+
+/* ── Base ── */
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ background-color: var(--bg);
+ color: var(--text);
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ text-rendering: optimizeLegibility;
+ line-height: 1.65;
+}
+
+::selection {
+ background-color: var(--accent);
+ color: var(--text-on-accent);
+}
+
+:focus-visible {
+ outline: 2px solid var(--accent);
+ outline-offset: 2px;
+}
+
+:focus:not(:focus-visible) {
+ outline: none;
+}
+
+/* ── Scrollbar ── */
+::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+}
+
+::-webkit-scrollbar-track {
+ background: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--border);
+ border-radius: 3px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: var(--muted);
+}
+
+* {
+ scrollbar-width: thin;
+ scrollbar-color: var(--border) transparent;
+}
+
+/* ── Reduced Motion ── */
+@media (prefers-reduced-motion: reduce) {
+ html {
+ scroll-behavior: auto;
+ }
+
+ *,
+ *::before,
+ *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ }
+}
diff --git a/landing/app/layout.tsx b/landing/app/layout.tsx
new file mode 100644
index 00000000..dc2d4df6
--- /dev/null
+++ b/landing/app/layout.tsx
@@ -0,0 +1,203 @@
+import type { Metadata } from "next";
+import "./globals.css";
+import { ThemeProvider } from "../components/theme-provider";
+import {
+ landingHowItWorksNarrative,
+ landingStructuredDataNarrative,
+} from "../lib/product-narrative";
+import { platformSupportSummary } from "../lib/platform-support";
+
+const description =
+ "Local-first desktop control plane for autonomous AI companies. Set a goal, let an AI CEO assemble specialists, delegate work, and deliver code, research, content, and operations from your desktop.";
+
+export const metadata: Metadata = {
+ metadataBase: new URL("https://agent-company.dev"),
+ title: "AgentCompany - Launch an Autonomous AI Company from Your Desktop",
+ description,
+ keywords: [
+ "AI company",
+ "autonomous AI agents",
+ "AI automation",
+ "multi-agent system",
+ "AI CEO",
+ "AI agent orchestration",
+ "autonomous agents desktop app",
+ "AI task delegation",
+ "AI team management",
+ "AI code generation",
+ "AI content generation",
+ "AI research automation",
+ "self-organizing AI",
+ "AI workforce",
+ "Claude Code",
+ "Codex CLI",
+ "Gemini CLI",
+ "multi-agent framework",
+ "AI company builder",
+ ],
+ openGraph: {
+ title: "AgentCompany - Launch an Autonomous AI Company from Your Desktop",
+ description,
+ url: "https://agent-company.dev/",
+ siteName: "AgentCompany",
+ locale: "en_US",
+ images: [
+ {
+ url: "/screenshots/Dashboard.jpeg",
+ width: 1920,
+ height: 1080,
+ alt: "AgentCompany dashboard showing autonomous AI agents managing a company",
+ },
+ ],
+ type: "website",
+ },
+ twitter: {
+ card: "summary_large_image",
+ title: "AgentCompany - Launch an Autonomous AI Company from Your Desktop",
+ description,
+ images: ["/screenshots/Dashboard.jpeg"],
+ },
+ robots: {
+ index: true,
+ follow: true,
+ },
+ icons: {
+ icon: "/favicon.ico",
+ apple: "/icon.png",
+ },
+};
+
+const themeScript = `
+(function(){try{var t=localStorage.getItem("agentcompany-theme");if(t==="dark"||(!t&&window.matchMedia("(prefers-color-scheme:dark)").matches)){document.documentElement.classList.add("dark")}}catch(e){}})();
+`;
+
+const softwareJsonLd = {
+ "@context": "https://schema.org",
+ "@type": "SoftwareApplication",
+ name: "AgentCompany",
+ applicationCategory: "BusinessApplication",
+ operatingSystem: "macOS, Windows, Linux",
+ url: "https://agent-company.dev",
+ downloadUrl: "https://agent-company.dev/#download",
+ screenshot: "https://agent-company.dev/screenshots/Dashboard.jpeg",
+ softwareVersion: landingStructuredDataNarrative.softwareVersion,
+ description,
+ featureList: landingStructuredDataNarrative.featureList,
+ author: { "@type": "Organization", name: "AgentCompany", url: "https://agent-company.dev" },
+};
+
+const organizationJsonLd = {
+ "@context": "https://schema.org",
+ "@type": "Organization",
+ name: "AgentCompany",
+ url: "https://agent-company.dev",
+ logo: "https://agent-company.dev/icon.png",
+};
+
+const howToJsonLd = {
+ "@context": "https://schema.org",
+ "@type": "HowTo",
+ name: "How to Launch an Autonomous AI Company with AgentCompany",
+ description: "Complete the AgentCompany desktop first-run flow and queue the first mission.",
+ step: landingHowItWorksNarrative.steps.map((step) => ({
+ "@type": "HowToStep",
+ position: step.number,
+ name: step.title,
+ text: step.description,
+ })),
+};
+
+const faqJsonLd = {
+ "@context": "https://schema.org",
+ "@type": "FAQPage",
+ mainEntity: [
+ {
+ "@type": "Question",
+ name: "What is AgentCompany?",
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: "AgentCompany is a local-first desktop application for launching and operating autonomous AI companies. You define the mission, an AI CEO organizes the team, delegates work, and coordinates delivery across engineering, design, research, and operations.",
+ },
+ },
+ {
+ "@type": "Question",
+ name: "How do I download AgentCompany?",
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: platformSupportSummary.downloadAnswer,
+ },
+ },
+ {
+ "@type": "Question",
+ name: "What platforms does AgentCompany support?",
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: platformSupportSummary.platformAnswer,
+ },
+ },
+ {
+ "@type": "Question",
+ name: "What AI models can AgentCompany use?",
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: "AgentCompany supports multiple AI runtimes as first-class connectors: Claude Code, Codex CLI, and Gemini CLI. You can connect your preferred provider during setup.",
+ },
+ },
+ {
+ "@type": "Question",
+ name: "How does the AI CEO work?",
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: "When you create a company with a goal, the AI CEO agent analyzes the objective, creates the necessary departments, hires specialized agents for each role, builds an org chart, and delegates tasks. The CEO monitors progress, handles blockers, and coordinates cross-department work.",
+ },
+ },
+ {
+ "@type": "Question",
+ name: "Is my data private? Does it leave my machine?",
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: "AgentCompany is local-first. All data is stored in a local SQLite database on your machine. Secrets are encrypted via an OS-level keychain. The only external communication is between your machine and your AI provider's API.",
+ },
+ },
+ {
+ "@type": "Question",
+ name: "What can an AI company actually deliver?",
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: "AI companies built with AgentCompany can produce code, content, research, business documents, and more. The deliverables depend on the goal you set and the AI runtime you connect.",
+ },
+ },
+ {
+ "@type": "Question",
+ name: "How are updates delivered?",
+ acceptedAnswer: {
+ "@type": "Answer",
+ text: "Desktop updates are published to a Cloudflare-hosted release lane. macOS builds include the signed update metadata required for in-app update checks, while Windows and Linux builds are delivered from the same release host for manual installation.",
+ },
+ },
+ ],
+};
+
+export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {children}
+
+
+ );
+}
diff --git a/landing/app/page.tsx b/landing/app/page.tsx
new file mode 100644
index 00000000..769e26dd
--- /dev/null
+++ b/landing/app/page.tsx
@@ -0,0 +1,34 @@
+import { DownloadSection } from "../components/download-section";
+import { FAQ } from "../components/faq";
+import { Features } from "../components/features";
+import { Footer } from "../components/footer";
+import { Hero } from "../components/hero";
+import { HowItWorks } from "../components/how-it-works";
+import { Navbar } from "../components/navbar";
+import { RuntimesBar } from "../components/runtimes-bar";
+
+export default function Page() {
+ return (
+ <>
+
+ Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/landing/components/ascii-background.tsx b/landing/components/ascii-background.tsx
new file mode 100644
index 00000000..633fde70
--- /dev/null
+++ b/landing/components/ascii-background.tsx
@@ -0,0 +1,158 @@
+"use client";
+
+import { useEffect, useRef } from "react";
+
+const glyphs = " .'`^,:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$";
+
+function parseRgbHex(hex: string): [number, number, number] {
+ const value = hex.replace("#", "").trim();
+ if (value.length !== 6) return [128, 128, 128];
+ return [
+ Number.parseInt(value.slice(0, 2), 16),
+ Number.parseInt(value.slice(2, 4), 16),
+ Number.parseInt(value.slice(4, 6), 16),
+ ];
+}
+
+export function AsciiBackground({
+ cssVar = "--accent",
+ baseOpacity = 0.08,
+ speed = 1,
+}: {
+ cssVar?: string;
+ baseOpacity?: number;
+ speed?: number;
+}) {
+ const canvasRef = useRef(null);
+ const containerRef = useRef(null);
+
+ useEffect(() => {
+ if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
+
+ const canvas = canvasRef.current;
+ const container = containerRef.current;
+ if (!canvas || !container) return;
+
+ const context = canvas.getContext("2d");
+ if (!context) return;
+
+ let width = 0;
+ let height = 0;
+ let rgb: [number, number, number] = [128, 128, 128];
+ let phase = 0;
+ let frame = 0;
+ let isVisible = true;
+ const pointer = { x: -9999, y: -9999 };
+
+ const updateColor = () => {
+ const value = getComputedStyle(document.documentElement).getPropertyValue(cssVar).trim();
+ if (value.startsWith("#")) {
+ rgb = parseRgbHex(value);
+ }
+ };
+
+ updateColor();
+
+ const mutationObserver = new MutationObserver(updateColor);
+ mutationObserver.observe(document.documentElement, {
+ attributes: true,
+ attributeFilter: ["class"],
+ });
+
+ const intersectionObserver = new IntersectionObserver(
+ (entries) => {
+ const [entry] = entries;
+ isVisible = entry?.isIntersecting ?? true;
+ },
+ { threshold: 0 },
+ );
+ intersectionObserver.observe(container);
+
+ const resize = () => {
+ width = container.clientWidth;
+ height = container.clientHeight;
+ const devicePixelRatio = Math.min(window.devicePixelRatio || 1, 2);
+ canvas.width = width * devicePixelRatio;
+ canvas.height = height * devicePixelRatio;
+ context.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0);
+ };
+
+ const handlePointer = (event: MouseEvent) => {
+ const rect = container.getBoundingClientRect();
+ pointer.x = event.clientX - rect.left;
+ pointer.y = event.clientY - rect.top;
+ };
+
+ const render = () => {
+ frame = requestAnimationFrame(render);
+ if (!isVisible) return;
+
+ context.clearRect(0, 0, width, height);
+ context.font = "14px monospace";
+ context.textAlign = "center";
+ context.textBaseline = "middle";
+
+ const columns = Math.ceil(width / 14);
+ const rows = Math.ceil(height / 14);
+ const [red, green, blue] = rgb;
+ const pointerX = pointer.x;
+ const pointerY = pointer.y;
+
+ for (let row = 0; row < rows; row += 1) {
+ for (let column = 0; column < columns; column += 1) {
+ const centerX = column * 14 + 7;
+ const centerY = row * 14 + 7;
+ const value =
+ Math.sin(0.05 * column + phase) * Math.cos(0.05 * row + phase) +
+ Math.sin(0.012 * column - 0.7 * phase) * Math.cos(0.1 * row) * 0.5;
+
+ if (Math.abs(value) < 0.3) continue;
+
+ const index = Math.floor(Math.abs(value) * glyphs.length);
+ let glyph = glyphs[index % glyphs.length];
+ if (!glyph.trim()) continue;
+
+ let alpha = Math.abs(value) * baseOpacity;
+ const deltaX = centerX - pointerX;
+ const deltaY = centerY - pointerY;
+ const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
+
+ if (distance < 110) {
+ const intensity = 1 - distance / 110;
+ glyph = Math.random() > 0.5 ? "0" : "1";
+ alpha = 0.35 * intensity;
+ const drift = distance > 1 ? 7 * intensity : 0;
+ const offsetX = (deltaX / distance) * drift;
+ const offsetY = (deltaY / distance) * drift;
+ context.fillStyle = `rgba(${red},${green},${blue},${alpha})`;
+ context.fillText(glyph, centerX - offsetX, centerY - offsetY);
+ } else {
+ context.fillStyle = `rgba(${red},${green},${blue},${alpha})`;
+ context.fillText(glyph, centerX, centerY);
+ }
+ }
+ }
+
+ phase += 0.005 * speed;
+ };
+
+ resize();
+ window.addEventListener("resize", resize);
+ window.addEventListener("mousemove", handlePointer);
+ render();
+
+ return () => {
+ cancelAnimationFrame(frame);
+ window.removeEventListener("resize", resize);
+ window.removeEventListener("mousemove", handlePointer);
+ mutationObserver.disconnect();
+ intersectionObserver.disconnect();
+ };
+ }, [baseOpacity, cssVar, speed]);
+
+ return (
+
+
+
+ );
+}
diff --git a/landing/components/download-section.tsx b/landing/components/download-section.tsx
new file mode 100644
index 00000000..dc5bbd1c
--- /dev/null
+++ b/landing/components/download-section.tsx
@@ -0,0 +1,105 @@
+"use client";
+
+import { useEffect, useState } from "react";
+import { motion } from "framer-motion";
+import { platformDownloads, releaseVersion } from "./release-links.generated";
+import { DOWNLOAD_COUNT_SEED, getTrackedDownloadHref } from "../lib/downloads";
+
+export function DownloadSection() {
+ const [downloadCount, setDownloadCount] = useState(DOWNLOAD_COUNT_SEED);
+
+ useEffect(() => {
+ let cancelled = false;
+
+ async function loadDownloadCount() {
+ try {
+ const response = await fetch("/api/download-stats", { cache: "no-store" });
+ if (!response.ok) {
+ throw new Error(`Failed to fetch download count: ${response.status}`);
+ }
+ const data = await response.json() as { downloads?: number };
+ if (!cancelled && typeof data.downloads === "number") {
+ setDownloadCount(data.downloads);
+ }
+ } catch {
+ // Keep the seeded count visible when the dynamic endpoint is unavailable.
+ }
+ }
+
+ void loadDownloadCount();
+ return () => {
+ cancelled = true;
+ };
+ }, []);
+
+ return (
+
+
+
+
+ Download
+
+
+ Install the Right Build for Your Machine
+
+
+ Version {releaseVersion} · {downloadCount.toLocaleString("en-US")} downloads
+
+
+
+
+ {platformDownloads.map((download, index) => (
+
+
+ {download.title}
+
+ {download.note}
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/landing/components/faq.tsx b/landing/components/faq.tsx
new file mode 100644
index 00000000..e7093b96
--- /dev/null
+++ b/landing/components/faq.tsx
@@ -0,0 +1,109 @@
+"use client";
+
+import { motion } from "framer-motion";
+import { useState } from "react";
+import { platformSupportSummary } from "../lib/platform-support";
+
+const faqs = [
+ {
+ question: "What is AgentCompany?",
+ answer:
+ "AgentCompany is a local-first desktop application for launching and operating autonomous AI companies. You define the mission, an AI CEO organizes the team, delegates work, and coordinates delivery across engineering, design, research, and operations.",
+ },
+ {
+ question: "How do I download AgentCompany?",
+ answer: platformSupportSummary.downloadAnswer,
+ },
+ {
+ question: "What platforms does AgentCompany support?",
+ answer: platformSupportSummary.platformAnswer,
+ },
+ {
+ question: "What AI models can AgentCompany use?",
+ answer:
+ "AgentCompany supports multiple AI runtimes as first-class connectors: Claude Code (Anthropic), Codex CLI (OpenAI), and Gemini CLI (Google). You can connect your preferred provider during setup.",
+ },
+ {
+ question: "How does the AI CEO work?",
+ answer:
+ "When you create a company with a goal, the AI CEO agent analyzes the objective, creates the necessary departments (Engineering, Design, Marketing, etc.), hires specialized agents for each role, builds an org chart, and delegates tasks. The CEO monitors progress, handles blockers, and coordinates cross-department work — all autonomously.",
+ },
+ {
+ question: "Is my data private? Does it leave my machine?",
+ answer:
+ "AgentCompany is local-first. All data is stored in a local SQLite database on your machine. Secrets are encrypted via an OS-level keychain. The only external communication is between your machine and your AI provider's API — no data is sent to AgentCompany servers.",
+ },
+ {
+ question: "What can an AI company actually deliver?",
+ answer:
+ "AI companies built with AgentCompany can produce code (full applications, scripts, APIs), content (blog posts, marketing copy, social media), research (competitive analysis, market research), business documents (business plans, technical specs, strategies), and more. The deliverables depend on the goal you set and the AI runtime you connect.",
+ },
+ {
+ question: "How are updates delivered?",
+ answer:
+ "Desktop updates are published to a Cloudflare-hosted release lane. macOS builds include the signed update metadata required for in-app update checks, while the Windows and Linux installers and packages are distributed from the same release host.",
+ },
+];
+
+function FaqItem({ question, answer, index }: { question: string; answer: string; index: number }) {
+ const [open, setOpen] = useState(false);
+
+ return (
+
+ setOpen((value) => !value)}
+ aria-expanded={open}
+ className="flex w-full items-center justify-between gap-4 py-6 text-left transition-colors duration-200 hover:text-[var(--accent)]"
+ >
+ {question}
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export function FAQ() {
+ return (
+
+
+
+ FAQ
+
+ Frequently Asked Questions
+
+
+
+
+ {faqs.map((item, index) => (
+
+ ))}
+
+
+
+ );
+}
diff --git a/landing/components/features.tsx b/landing/components/features.tsx
new file mode 100644
index 00000000..26d77088
--- /dev/null
+++ b/landing/components/features.tsx
@@ -0,0 +1,191 @@
+"use client";
+
+import { motion } from "framer-motion";
+
+const features = [
+ {
+ number: "01",
+ title: "One-Click Company Creation",
+ description:
+ "Name your company, describe your mission, connect your AI runtime, and launch. Your first agents start working in under a minute.",
+ image: "/screenshots/Onboarding.jpeg",
+ imageAlt: "Company creation onboarding flow with mission and runtime setup",
+ imageLeft: true,
+ },
+ {
+ number: "02",
+ title: "Self-Organizing Teams",
+ description:
+ "Your AI CEO builds the org chart. It identifies the roles needed, hires specialists, and creates reporting lines — all from a single goal.",
+ image: "/screenshots/Auto-OrgChart-Team.jpeg",
+ imageAlt: "AI-generated org chart showing self-organizing team structure",
+ imageLeft: false,
+ },
+ {
+ number: "03",
+ title: "Autonomous Task Management",
+ description:
+ "Goals break down into tasks automatically. Agents pick up work, report progress, and escalate blockers — you decide when to step in.",
+ image: "/screenshots/Auto-Task.jpeg",
+ imageAlt: "Autonomous task board with agents managing work items",
+ imageLeft: true,
+ },
+ {
+ number: "04",
+ title: "Real-Time Agent Communication",
+ description:
+ "Agents communicate through department channels and direct messages. Watch strategic decisions happen in real time, like a Slack workspace you built.",
+ image: "/screenshots/AI-Internal-Realtime-Message.jpeg",
+ imageAlt: "Real-time messaging between AI agents in department channels",
+ },
+ {
+ number: "05",
+ title: "Human-in-the-Loop Approvals",
+ description:
+ "Stay in control. Critical decisions surface for your review. Approve, reject, or redirect — your company respects the chain of command.",
+ image: "/screenshots/Approval-by-Human.jpeg",
+ imageAlt: "Approval interface showing human review of agent decisions",
+ },
+ {
+ number: "06",
+ title: "AI Document Generation",
+ description:
+ "Business plans, marketing strategies, technical specs — agents draft and iterate on real deliverables, stored in your document center.",
+ image: "/screenshots/Document-Center.jpeg",
+ imageAlt: "Document center with AI-generated business deliverables",
+ },
+];
+
+function FeaturePair({ feature }: { feature: (typeof features)[number] }) {
+ const { number, title, description, image, imageAlt, imageLeft } = feature;
+ const ease: [number, number, number, number] = [0.16, 1, 0.3, 1];
+
+ const media = (
+
+
+
+
+
+ );
+
+ const copy = (
+
+
+ {number}
+
+
+
+
+ {number}
+
+
{title}
+
{description}
+
+
+ );
+
+ return (
+
+ {media}
+ {copy}
+
+ );
+}
+
+export function Features() {
+ return (
+
+
+
+
+ Features
+
+
+ Your Company, Under the Hood
+
+
+
+
+ {features.slice(0, 3).map((feature) => (
+
+ ))}
+
+
+
+ {features.slice(3).map((feature) => (
+
+
+
+
+
+
+
+ {feature.number}
+
+
{feature.title}
+
{feature.description}
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/landing/components/footer.tsx b/landing/components/footer.tsx
new file mode 100644
index 00000000..dd681a61
--- /dev/null
+++ b/landing/components/footer.tsx
@@ -0,0 +1,91 @@
+import { AsciiBackground } from "./ascii-background";
+import { IconMark } from "./icon-mark";
+import { CONTACT_EMAIL, WEBSITE_URL } from "./site-constants";
+import { ThemeToggle } from "./theme-toggle";
+import { getTrackedDownloadHref } from "../lib/downloads";
+
+const footerGroups = [
+ {
+ title: "Product",
+ links: [
+ { label: "Features", href: "#features" },
+ { label: "How It Works", href: "#how-it-works" },
+ { label: "FAQ", href: "#faq" },
+ { label: "Download", href: "#download" },
+ ],
+ },
+ {
+ title: "Downloads",
+ links: [
+ { label: "Apple Silicon", href: getTrackedDownloadHref("macos-arm64-dmg"), external: true },
+ { label: "Intel Mac", href: getTrackedDownloadHref("macos-x64-dmg"), external: true },
+ { label: "Windows Installer", href: getTrackedDownloadHref("windows-universal-installer"), external: true },
+ { label: "Linux x64 AppImage", href: getTrackedDownloadHref("linux-x64-appimage"), external: true },
+ ],
+ },
+ {
+ title: "Company",
+ links: [
+ { label: "Website", href: WEBSITE_URL, external: true },
+ { label: "Contact", href: `mailto:${CONTACT_EMAIL}`, external: true },
+ { label: "Download Center", href: "#download" },
+ ],
+ },
+];
+
+export function Footer() {
+ const year = new Date().getFullYear();
+
+ return (
+
+
+
+
+
+
+
+
+ AgentCompany
+
+
+ Local-first desktop control plane for autonomous AI companies.
+
+
+
+
+ {footerGroups.map((group) => (
+
+ ))}
+
+
+
+
+
+
+
+ © {year} AgentCompany
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/landing/components/hero.tsx b/landing/components/hero.tsx
new file mode 100644
index 00000000..1cf01bf8
--- /dev/null
+++ b/landing/components/hero.tsx
@@ -0,0 +1,129 @@
+"use client";
+
+import { motion } from "framer-motion";
+import { AsciiBackground } from "./ascii-background";
+import { landingHeroNarrative } from "../lib/product-narrative";
+
+const sharedEase: [number, number, number, number] = [0.16, 1, 0.3, 1];
+
+function heroMotion(delay: number) {
+ return {
+ initial: { opacity: 0, y: 24 },
+ animate: { opacity: 1, y: 0 },
+ transition: { duration: 0.7, delay, ease: sharedEase },
+ };
+}
+
+function AppleIcon() {
+ return (
+
+
+
+ );
+}
+
+function WindowsIcon() {
+ return (
+
+
+
+ );
+}
+
+function LinuxIcon() {
+ return (
+
+
+
+ );
+}
+
+export function Hero() {
+ return (
+
+
+
+
+
+
+
+
+ {landingHeroNarrative.eyebrow}
+
+
+
+
+ {landingHeroNarrative.titleLine1}
+ {landingHeroNarrative.titleLine2}
+
+
+
+ {landingHeroNarrative.description}
+
+
+
+
+ See Downloads
+
+
+
+
+
+
+
+
+
+ {landingHeroNarrative.availability}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/landing/components/how-it-works.tsx b/landing/components/how-it-works.tsx
new file mode 100644
index 00000000..79bd784f
--- /dev/null
+++ b/landing/components/how-it-works.tsx
@@ -0,0 +1,149 @@
+"use client";
+
+import { motion, useInView } from "framer-motion";
+import { useEffect, useRef, useState } from "react";
+import { landingHowItWorksNarrative } from "../lib/product-narrative";
+
+const demoMessages = landingHowItWorksNarrative.demoMessages;
+
+const logTone: Record<(typeof demoMessages)[number]["role"], string> = {
+ system: "text-[var(--muted-strong)]",
+};
+
+const dotTone: Record<(typeof demoMessages)[number]["role"], string> = {
+ system: "bg-[var(--muted-strong)]",
+};
+
+const steps = landingHowItWorksNarrative.steps;
+
+function DemoPanel() {
+ const anchorRef = useRef(null);
+ const isVisible = useInView(anchorRef, { once: true, amount: 0.4 });
+ const [visibleCount, setVisibleCount] = useState(0);
+ const logRef = useRef(null);
+
+ useEffect(() => {
+ if (!isVisible) return;
+
+ const timers = demoMessages.map((message, index) =>
+ window.setTimeout(() => setVisibleCount(index + 1), message.delay),
+ );
+
+ return () => timers.forEach((timer) => window.clearTimeout(timer));
+ }, [isVisible]);
+
+ useEffect(() => {
+ if (logRef.current) {
+ logRef.current.scrollTop = logRef.current.scrollHeight;
+ }
+ }, [visibleCount]);
+
+ return (
+
+
+
+
+
+
+ AgentCompany
+
+
+
+ {demoMessages.slice(0, visibleCount).map((message, index) => (
+
+
+
+ {message.agent}
+
+ {message.text}
+
+ ))}
+
+ {visibleCount < demoMessages.length && isVisible && (
+
+ )}
+
+ {visibleCount >= demoMessages.length && (
+
+
+
+
+
+ {landingHowItWorksNarrative.completionText}
+
+ )}
+
+
+
+
+
+ );
+}
+
+export function HowItWorks() {
+ return (
+
+
+
+
+ How It Works
+
+
+ {landingHowItWorksNarrative.heading}
+
+
+
+
+
+
+
+
+ {steps.map((step, index) => (
+
+
+ {step.number}
+
+
+
{step.title}
+
{step.description}
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/landing/components/icon-mark.tsx b/landing/components/icon-mark.tsx
new file mode 100644
index 00000000..1ac2e170
--- /dev/null
+++ b/landing/components/icon-mark.tsx
@@ -0,0 +1,24 @@
+export function IconMark({ size = 32 }: { size?: number }) {
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/landing/components/navbar.tsx b/landing/components/navbar.tsx
new file mode 100644
index 00000000..26444012
--- /dev/null
+++ b/landing/components/navbar.tsx
@@ -0,0 +1,132 @@
+"use client";
+
+import { useEffect, useState } from "react";
+import { IconMark } from "./icon-mark";
+import { ThemeToggle } from "./theme-toggle";
+
+const navLinks = [
+ { label: "Features", href: "#features" },
+ { label: "How It Works", href: "#how-it-works" },
+ { label: "FAQ", href: "#faq" },
+ { label: "Download", href: "#download" },
+];
+
+function MenuIcon({ open }: { open: boolean }) {
+ return (
+
+ {open ? (
+ <>
+
+
+ >
+ ) : (
+ <>
+
+
+
+ >
+ )}
+
+ );
+}
+
+export function Navbar() {
+ const [mobileOpen, setMobileOpen] = useState(false);
+ const [scrolled, setScrolled] = useState(false);
+
+ useEffect(() => {
+ const handleScroll = () => setScrolled(window.scrollY > 8);
+ window.addEventListener("scroll", handleScroll, { passive: true });
+ handleScroll();
+ return () => window.removeEventListener("scroll", handleScroll);
+ }, []);
+
+ useEffect(() => {
+ const handleResize = () => {
+ if (window.innerWidth >= 768) {
+ setMobileOpen(false);
+ }
+ };
+
+ window.addEventListener("resize", handleResize, { passive: true });
+ return () => window.removeEventListener("resize", handleResize);
+ }, []);
+
+ return (
+
+
+
+
+
+ AgentCompany
+
+
+
+ {navLinks.map(({ label, href }) => (
+
+ {label}
+
+ ))}
+
+
+
+
+
+
+ setMobileOpen((current) => !current)}
+ aria-label={mobileOpen ? "Close navigation menu" : "Open navigation menu"}
+ aria-expanded={mobileOpen}
+ aria-controls="mobile-nav-menu"
+ className="inline-flex items-center justify-center w-11 h-11 rounded-lg text-[var(--muted)] hover:text-[var(--text)] hover:bg-[var(--panel-soft)] transition-colors duration-200"
+ >
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/landing/components/release-links.generated.ts b/landing/components/release-links.generated.ts
new file mode 100644
index 00000000..93a7227c
--- /dev/null
+++ b/landing/components/release-links.generated.ts
@@ -0,0 +1,109 @@
+export type PlatformDownloadAsset = {
+ architectures: ReleaseArchitecture[];
+ id: string;
+ label: string;
+ href: string;
+ note: string;
+};
+
+export type ReleaseArchitecture = "arm64" | "x64" | "x86";
+
+export type PlatformDownload = {
+ id: "macos" | "windows" | "linux";
+ packageDescription: string;
+ title: string;
+ note: string;
+ assets: PlatformDownloadAsset[];
+};
+
+export const releaseVersion = "0.4.182";
+
+export const platformDownloads: PlatformDownload[] = [
+ {
+ id: "macos",
+ packageDescription: "signed and notarized DMG builds",
+ title: "macOS",
+ note: "Signed + notarized DMG builds",
+ assets: [
+ {
+ architectures: ["arm64"],
+ id: "macos-arm64-dmg",
+ label: "Apple Silicon DMG",
+ href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-0.4.182-arm64.dmg",
+ note: "arm64",
+ },
+ {
+ architectures: ["x64"],
+ id: "macos-x64-dmg",
+ label: "Intel Mac DMG",
+ href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-0.4.182.dmg",
+ note: "x64",
+ },
+ ],
+ },
+ {
+ id: "windows",
+ packageDescription: "an NSIS installer build",
+ title: "Windows",
+ note: "NSIS installer builds",
+ assets: [
+ {
+ architectures: ["arm64", "x64"],
+ id: "windows-universal-installer",
+ label: "Windows Universal Installer",
+ href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany.Setup.0.4.182.exe",
+ note: "arm64 + x64",
+ },
+ ],
+ },
+ {
+ id: "linux",
+ packageDescription: "AppImage, DEB, and RPM builds",
+ title: "Linux",
+ note: "AppImage, DEB, and RPM builds",
+ assets: [
+ {
+ architectures: ["x64"],
+ id: "linux-x64-appimage",
+ label: "Linux x64 AppImage",
+ href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-0.4.182.AppImage",
+ note: "x64",
+ },
+ {
+ architectures: ["x64"],
+ id: "linux-x64-deb",
+ label: "Linux x64 DEB",
+ href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/agent-company_0.4.182_amd64.deb",
+ note: "x64",
+ },
+ {
+ architectures: ["x64"],
+ id: "linux-x64-rpm",
+ label: "Linux x64 RPM",
+ href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/agent-company-0.4.182.x86_64.rpm",
+ note: "x64",
+ },
+ {
+ architectures: ["arm64"],
+ id: "linux-arm64-appimage",
+ label: "Linux ARM64 AppImage",
+ href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/AgentCompany-0.4.182-arm64.AppImage",
+ note: "arm64",
+ },
+ {
+ architectures: ["arm64"],
+ id: "linux-arm64-deb",
+ label: "Linux ARM64 DEB",
+ href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/agent-company_0.4.182_arm64.deb",
+ note: "arm64",
+ },
+ {
+ architectures: ["arm64"],
+ id: "linux-arm64-rpm",
+ label: "Linux ARM64 RPM",
+ href: "https://pub-a19a3a2c1d2e4fa3a9c120b184024448.r2.dev/AC/agent-company-0.4.182.aarch64.rpm",
+ note: "arm64",
+ },
+ ],
+ },
+];
diff --git a/landing/components/runtimes-bar.tsx b/landing/components/runtimes-bar.tsx
new file mode 100644
index 00000000..3f967084
--- /dev/null
+++ b/landing/components/runtimes-bar.tsx
@@ -0,0 +1,117 @@
+"use client";
+
+import { motion } from "framer-motion";
+
+function AnthropicIcon() {
+ return (
+
+
+
+ );
+}
+
+function OpenAIIcon() {
+ return (
+
+
+
+ );
+}
+
+function GoogleIcon() {
+ return (
+
+
+
+ );
+}
+
+function MoonshotIcon() {
+ return (
+
+
+
+ );
+}
+
+function ZhipuIcon() {
+ return (
+
+
+
+ );
+}
+
+function MiniMaxIcon() {
+ return (
+
+
+
+ );
+}
+
+function OllamaIcon() {
+ return (
+
+
+
+ );
+}
+
+function ApiIcon() {
+ return (
+
+
+
+
+ );
+}
+
+const runtimes = [
+ { name: "Claude Code", provider: "Anthropic", icon: AnthropicIcon },
+ { name: "Codex CLI", provider: "OpenAI", icon: OpenAIIcon },
+ { name: "Gemini CLI", provider: "Google", icon: GoogleIcon },
+ { name: "Kimi", provider: "Moonshot AI", icon: MoonshotIcon },
+ { name: "GLM", provider: "Zhipu AI", icon: ZhipuIcon },
+ { name: "MiniMax", provider: "MiniMax", icon: MiniMaxIcon },
+ { name: "Ollama", provider: "Local", icon: OllamaIcon },
+ { name: "Anthropic Compatible API", provider: "Any Provider", icon: ApiIcon },
+];
+
+export function RuntimesBar() {
+ return (
+
+
+
+
+ Supported AI Runtimes
+
+
+ {runtimes.map((runtime) => {
+ const Icon = runtime.icon;
+ return (
+
+
+
+
+
+ {runtime.name}
+
+
+ {runtime.provider}
+
+
+ );
+ })}
+
+
+
+
+ );
+}
diff --git a/landing/components/site-constants.ts b/landing/components/site-constants.ts
new file mode 100644
index 00000000..67a285f0
--- /dev/null
+++ b/landing/components/site-constants.ts
@@ -0,0 +1,2 @@
+export const WEBSITE_URL = "https://agent-company.dev";
+export const CONTACT_EMAIL = "dev@agentcompany.ai";
diff --git a/landing/components/theme-provider.tsx b/landing/components/theme-provider.tsx
new file mode 100644
index 00000000..6740b10c
--- /dev/null
+++ b/landing/components/theme-provider.tsx
@@ -0,0 +1,76 @@
+"use client";
+
+import { createContext, useCallback, useContext, useEffect, useState } from "react";
+
+const storageKey = "agentcompany-theme";
+
+type ThemeMode = "light" | "dark";
+
+type ThemeContextValue = {
+ theme: ThemeMode;
+ setTheme: (theme: ThemeMode) => void;
+ toggleTheme: () => void;
+};
+
+const ThemeContext = createContext(undefined);
+
+function resolveTheme(): ThemeMode {
+ if (typeof window === "undefined") {
+ return "light";
+ }
+
+ const stored = localStorage.getItem(storageKey);
+ if (stored === "light" || stored === "dark") {
+ return stored;
+ }
+
+ return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
+}
+
+export function ThemeProvider({ children }: { children: React.ReactNode }) {
+ const [theme, setThemeState] = useState(resolveTheme);
+
+ useEffect(() => {
+ const root = document.documentElement;
+ if (theme === "dark") {
+ root.classList.add("dark");
+ } else {
+ root.classList.remove("dark");
+ }
+ localStorage.setItem(storageKey, theme);
+ }, [theme]);
+
+ useEffect(() => {
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
+ const handleChange = (event: MediaQueryListEvent) => {
+ if (!localStorage.getItem(storageKey)) {
+ setThemeState(event.matches ? "dark" : "light");
+ }
+ };
+
+ mediaQuery.addEventListener("change", handleChange);
+ return () => mediaQuery.removeEventListener("change", handleChange);
+ }, []);
+
+ const setTheme = useCallback((nextTheme: ThemeMode) => {
+ setThemeState(nextTheme);
+ }, []);
+
+ const toggleTheme = useCallback(() => {
+ setThemeState((currentTheme) => (currentTheme === "light" ? "dark" : "light"));
+ }, []);
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useTheme() {
+ const context = useContext(ThemeContext);
+ if (!context) {
+ throw new Error("useTheme must be used within a ThemeProvider");
+ }
+ return context;
+}
diff --git a/landing/components/theme-toggle.tsx b/landing/components/theme-toggle.tsx
new file mode 100644
index 00000000..7434d0b4
--- /dev/null
+++ b/landing/components/theme-toggle.tsx
@@ -0,0 +1,42 @@
+"use client";
+
+import { useTheme } from "./theme-provider";
+
+function SunIcon() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+function MoonIcon() {
+ return (
+
+
+
+ );
+}
+
+export function ThemeToggle() {
+ const { theme, toggleTheme } = useTheme();
+
+ return (
+
+ {theme === "light" ? : }
+
+ );
+}
diff --git a/landing/functions/api/download-stats.ts b/landing/functions/api/download-stats.ts
new file mode 100644
index 00000000..e196b47e
--- /dev/null
+++ b/landing/functions/api/download-stats.ts
@@ -0,0 +1,34 @@
+import type { CounterDatabase, PagesHandler } from "../types";
+import { DOWNLOAD_COUNT_SEED } from "../../lib/downloads";
+
+interface Env {
+ DOWNLOAD_COUNTER_DB: CounterDatabase;
+}
+
+async function readDownloadCount(db: CounterDatabase) {
+ const result = await db
+ .prepare(`
+ SELECT
+ COALESCE(
+ (SELECT value FROM download_counter_settings WHERE key = 'base_downloads'),
+ ?
+ ) + COUNT(*) AS downloads
+ FROM unique_download_windows
+ `)
+ .bind(DOWNLOAD_COUNT_SEED)
+ .first<{ downloads: number }>();
+
+ return result?.downloads ?? DOWNLOAD_COUNT_SEED;
+}
+
+export const onRequestGet: PagesHandler = async (context) => {
+ const downloads = await readDownloadCount(context.env.DOWNLOAD_COUNTER_DB);
+ return Response.json(
+ { downloads },
+ {
+ headers: {
+ "Cache-Control": "no-store",
+ },
+ },
+ );
+};
diff --git a/landing/functions/api/download.ts b/landing/functions/api/download.ts
new file mode 100644
index 00000000..f2b5fcfa
--- /dev/null
+++ b/landing/functions/api/download.ts
@@ -0,0 +1,73 @@
+import {
+ DOWNLOAD_DEDUP_WINDOW_MS,
+ getDownloadAsset,
+} from "../../lib/downloads";
+import type { CounterDatabase, PagesHandler } from "../types";
+
+interface Env {
+ DOWNLOAD_COUNTER_DB: CounterDatabase;
+ DOWNLOAD_COUNTER_SALT?: string;
+}
+
+function getClientIp(request: Request) {
+ const cfConnectingIp = request.headers.get("CF-Connecting-IP")?.trim();
+ if (cfConnectingIp) {
+ return cfConnectingIp;
+ }
+
+ const forwardedFor = request.headers.get("X-Forwarded-For")?.split(",")[0]?.trim();
+ return forwardedFor || null;
+}
+
+function getWindowKey(now = Date.now()) {
+ return Math.floor(now / DOWNLOAD_DEDUP_WINDOW_MS);
+}
+
+async function sha256Hex(input: string) {
+ const buffer = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(input));
+ return Array.from(new Uint8Array(buffer), (byte) => byte.toString(16).padStart(2, "0")).join("");
+}
+
+async function countUniqueDownload(db: CounterDatabase, request: Request, assetId: string, salt: string | undefined) {
+ const clientIp = getClientIp(request);
+ if (!clientIp) {
+ return;
+ }
+
+ const ipHash = await sha256Hex(`${salt ?? ""}:${clientIp}`);
+ const windowKey = getWindowKey();
+
+ await db
+ .prepare(`
+ INSERT OR IGNORE INTO unique_download_windows (
+ ip_hash,
+ window_key,
+ first_asset_id,
+ created_at
+ ) VALUES (?, ?, ?, datetime('now'))
+ `)
+ .bind(ipHash, windowKey, assetId)
+ .run();
+}
+
+export const onRequestGet: PagesHandler = async (context) => {
+ const url = new URL(context.request.url);
+ const assetId = url.searchParams.get("asset")?.trim();
+ if (!assetId) {
+ return new Response("Missing asset parameter.", { status: 400 });
+ }
+
+ const asset = getDownloadAsset(assetId);
+ if (!asset) {
+ return new Response("Unknown asset.", { status: 404 });
+ }
+
+ await countUniqueDownload(
+ context.env.DOWNLOAD_COUNTER_DB,
+ context.request,
+ asset.id,
+ context.env.DOWNLOAD_COUNTER_SALT,
+ );
+
+ return Response.redirect(asset.href, 302);
+};
diff --git a/landing/functions/types.ts b/landing/functions/types.ts
new file mode 100644
index 00000000..5b38d263
--- /dev/null
+++ b/landing/functions/types.ts
@@ -0,0 +1,17 @@
+export interface CounterDbStatement {
+ bind(...values: unknown[]): {
+ first(): Promise;
+ run(): Promise;
+ };
+}
+
+export interface CounterDatabase {
+ prepare(query: string): CounterDbStatement;
+}
+
+export interface PagesHandlerContext {
+ request: Request;
+ env: Env;
+}
+
+export type PagesHandler = (context: PagesHandlerContext) => Response | Promise;
diff --git a/landing/lib/downloads.ts b/landing/lib/downloads.ts
new file mode 100644
index 00000000..aea6f5d2
--- /dev/null
+++ b/landing/lib/downloads.ts
@@ -0,0 +1,28 @@
+import { platformDownloads, type PlatformDownloadAsset } from "../components/release-links.generated";
+
+export const DOWNLOAD_COUNT_SEED = 13674;
+export const DOWNLOAD_DEDUP_WINDOW_HOURS = 24;
+export const DOWNLOAD_DEDUP_WINDOW_MS = DOWNLOAD_DEDUP_WINDOW_HOURS * 60 * 60 * 1000;
+
+export type ReleaseDownloadAsset = PlatformDownloadAsset & {
+ platformId: "macos" | "windows" | "linux";
+ platformTitle: string;
+};
+
+export const downloadAssets: ReleaseDownloadAsset[] = platformDownloads.flatMap((platform) =>
+ platform.assets.map((asset) => ({
+ ...asset,
+ platformId: platform.id,
+ platformTitle: platform.title,
+ })),
+);
+
+const downloadAssetMap = new Map(downloadAssets.map((asset) => [asset.id, asset]));
+
+export function getDownloadAsset(assetId: string) {
+ return downloadAssetMap.get(assetId) ?? null;
+}
+
+export function getTrackedDownloadHref(assetId: string) {
+ return `/api/download?asset=${encodeURIComponent(assetId)}`;
+}
diff --git a/landing/lib/platform-support.ts b/landing/lib/platform-support.ts
new file mode 100644
index 00000000..0cb6b083
--- /dev/null
+++ b/landing/lib/platform-support.ts
@@ -0,0 +1,106 @@
+import {
+ platformDownloads,
+ type PlatformDownload,
+ type PlatformDownloadAsset,
+ type ReleaseArchitecture,
+} from "../components/release-links.generated";
+
+const ARCHITECTURE_ORDER: ReleaseArchitecture[] = ["arm64", "x64", "x86"];
+
+export type PlatformSupportSummary = {
+ downloadAnswer: string;
+ platformAnswer: string;
+};
+
+export const platformSupportSummary = buildPlatformSupportSummary(platformDownloads);
+
+export function buildPlatformSupportSummary(downloads: PlatformDownload[]): PlatformSupportSummary {
+ const macos = requirePlatform(downloads, "macos");
+ const windows = requirePlatform(downloads, "windows");
+ const linux = requirePlatform(downloads, "linux");
+
+ return {
+ downloadAnswer:
+ `Use the download section on this page to choose the build that matches your architecture and package format. ` +
+ `${formatDownloadSentence(macos)} ${formatDownloadSentence(windows)} ${formatDownloadSentence(linux)}`,
+ platformAnswer:
+ `AgentCompany is available on ${formatAvailability(macos)}, ${formatAvailability(windows)}, ` +
+ `and ${formatAvailability(linux)}. It is built with Electron and the desktop feature set stays aligned across all supported targets.`,
+ };
+}
+
+function requirePlatform(downloads: PlatformDownload[], id: PlatformDownload["id"]): PlatformDownload {
+ const platform = downloads.find((download) => download.id === id);
+ if (!platform) {
+ throw new Error(`Missing ${id} release download metadata.`);
+ }
+ return platform;
+}
+
+function formatDownloadSentence(download: PlatformDownload): string {
+ const architectures = formatArchitectureList(collectArchitectures(download));
+
+ if (!download.packageDescription.trim()) {
+ throw new Error(`Release platform ${download.id} must include package format copy.`);
+ }
+
+ return `${download.title} ships as ${download.packageDescription} for ${architectures}.`;
+}
+
+function formatAvailability(download: PlatformDownload): string {
+ return `${download.title} (${formatArchitectureList(collectArchitectures(download), "comma")})`;
+}
+
+function collectArchitectures(download: PlatformDownload): ReleaseArchitecture[] {
+ const architectures = new Set();
+
+ for (const asset of download.assets) {
+ collectAssetArchitectures(download.id, asset).forEach((architecture) => architectures.add(architecture));
+ }
+
+ return [...architectures].sort((left, right) => architectureRank(left) - architectureRank(right));
+}
+
+function collectAssetArchitectures(
+ platformId: PlatformDownload["id"],
+ asset: PlatformDownloadAsset,
+): ReleaseArchitecture[] {
+ if (asset.architectures.length === 0) {
+ throw new Error(`Release asset ${platformId}/${asset.id} must declare at least one architecture.`);
+ }
+
+ for (const architecture of asset.architectures) {
+ if (!isReleaseArchitecture(architecture)) {
+ throw new Error(`Release asset ${platformId}/${asset.id} declares unsupported architecture: ${architecture}`);
+ }
+ }
+
+ return asset.architectures;
+}
+
+function isReleaseArchitecture(value: string): value is ReleaseArchitecture {
+ return ARCHITECTURE_ORDER.includes(value as ReleaseArchitecture);
+}
+
+function architectureRank(architecture: ReleaseArchitecture): number {
+ return ARCHITECTURE_ORDER.indexOf(architecture);
+}
+
+function formatArchitectureList(
+ architectures: ReleaseArchitecture[],
+ style: "and" | "comma" = "and",
+): string {
+ if (architectures.length === 0) {
+ throw new Error("Release download metadata must include at least one architecture.");
+ }
+ if (style === "comma") {
+ return architectures.join(", ");
+ }
+ if (architectures.length === 1) {
+ return architectures[0];
+ }
+ if (architectures.length === 2) {
+ return `${architectures[0]} and ${architectures[1]}`;
+ }
+ return `${architectures.slice(0, -1).join(", ")}, and ${architectures.at(-1)}`;
+}
diff --git a/landing/lib/product-narrative.ts b/landing/lib/product-narrative.ts
new file mode 100644
index 00000000..054aee8c
--- /dev/null
+++ b/landing/lib/product-narrative.ts
@@ -0,0 +1,80 @@
+import { releaseVersion } from "../components/release-links.generated";
+
+export const landingHeroNarrative = {
+ eyebrow: "AgentCompany Desktop",
+ titleLine1: "Launch an Autonomous AI Company",
+ titleLine2: "from Your Desktop",
+ description:
+ "Run AI CEO by default, switch to AI Co-Founder for human-reviewed decisions, and launch the first mission from a local desktop setup.",
+ availability: "Available on macOS, Windows, and Linux",
+} as const;
+
+export const onboardingFlowNarrative = {
+ prelude: "Welcome",
+ sections: [
+ {
+ number: 1,
+ title: "Requirements",
+ description: "Check Node.js because CLI runtimes call the local API through node -e.",
+ },
+ {
+ number: 2,
+ title: "Providers",
+ description: "Connect at least one runtime before company creation continues.",
+ },
+ {
+ number: 3,
+ title: "Company",
+ description: "Enter company name, description, and workspace.",
+ },
+ {
+ number: 4,
+ title: "Team Models",
+ description: "Enable the models available to the CEO and workers.",
+ },
+ {
+ number: 5,
+ title: "Mode",
+ description: "Use AI CEO by default, or choose AI Co-Founder for human-reviewed decisions.",
+ },
+ {
+ number: 6,
+ title: "Mission",
+ description: "Capture the first goal and acceptance description.",
+ },
+ {
+ number: 7,
+ title: "Launch",
+ description: "Create the company, CEO agent, workspace, kickoff task, and initial run handoff.",
+ },
+ ],
+} as const;
+
+export const landingHowItWorksNarrative = {
+ heading: "Follow the Desktop First-Run Flow",
+ steps: onboardingFlowNarrative.sections,
+ completionText: "Initial run queued. Open Control Center.",
+ demoMessages: [
+ { agent: "Requirements", role: "system", text: "Node.js ready. CLI runtimes can call the local API.", delay: 0 },
+ { agent: "Providers", role: "system", text: "Runtime connected.", delay: 700 },
+ { agent: "Company", role: "system", text: "Company profile and workspace saved.", delay: 1400 },
+ { agent: "Team Models", role: "system", text: "Model pool enabled for CEO and workers.", delay: 2100 },
+ { agent: "Mode", role: "system", text: "AI CEO mode selected.", delay: 2800 },
+ { agent: "Mission", role: "system", text: "First goal and acceptance description captured.", delay: 3500 },
+ { agent: "Launch", role: "system", text: "Company, CEO agent, kickoff task, and initial run created.", delay: 4400 },
+ ],
+} as const;
+
+export const landingStructuredDataNarrative = {
+ softwareVersion: releaseVersion,
+ featureList: [
+ "Guided first-run setup",
+ "Node.js readiness check for CLI runtimes",
+ "Provider connection and model-pool selection",
+ "Multi-connector support (Claude Code, Codex CLI, Gemini CLI)",
+ "AI CEO autonomous operating mode",
+ "AI Co-Founder human-reviewed operating mode",
+ "Local-first SQLite storage",
+ "Cross-platform desktop releases for macOS, Windows, and Linux",
+ ],
+};
diff --git a/landing/migrations/0001_download_counter.sql b/landing/migrations/0001_download_counter.sql
new file mode 100644
index 00000000..fb42ebfe
--- /dev/null
+++ b/landing/migrations/0001_download_counter.sql
@@ -0,0 +1,18 @@
+CREATE TABLE IF NOT EXISTS download_counter_settings (
+ key TEXT PRIMARY KEY,
+ value INTEGER NOT NULL
+);
+
+INSERT OR IGNORE INTO download_counter_settings (key, value)
+VALUES ('base_downloads', 13674);
+
+CREATE TABLE IF NOT EXISTS unique_download_windows (
+ ip_hash TEXT NOT NULL,
+ window_key INTEGER NOT NULL,
+ first_asset_id TEXT NOT NULL,
+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (ip_hash, window_key)
+);
+
+CREATE INDEX IF NOT EXISTS idx_unique_download_windows_created_at
+ ON unique_download_windows(created_at);
diff --git a/landing/next-env.d.ts b/landing/next-env.d.ts
new file mode 100644
index 00000000..9edff1c7
--- /dev/null
+++ b/landing/next-env.d.ts
@@ -0,0 +1,6 @@
+///
+///
+import "./.next/types/routes.d.ts";
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/landing/next.config.ts b/landing/next.config.ts
new file mode 100644
index 00000000..6093505d
--- /dev/null
+++ b/landing/next.config.ts
@@ -0,0 +1,11 @@
+import path from "node:path";
+import type { NextConfig } from "next";
+
+const nextConfig: NextConfig = {
+ output: "export",
+ turbopack: {
+ root: path.join(__dirname),
+ },
+};
+
+export default nextConfig;
diff --git a/landing/package-lock.json b/landing/package-lock.json
new file mode 100644
index 00000000..7d3f558e
--- /dev/null
+++ b/landing/package-lock.json
@@ -0,0 +1,1762 @@
+{
+ "name": "agent-company-landing",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "agent-company-landing",
+ "version": "1.0.0",
+ "dependencies": {
+ "framer-motion": "12.38.0",
+ "next": "16.2.6",
+ "react": "19.2.4",
+ "react-dom": "19.2.4"
+ },
+ "devDependencies": {
+ "@tailwindcss/postcss": "^4.2.2",
+ "@types/node": "^24.9.1",
+ "@types/react": "^19.2.2",
+ "@types/react-dom": "^19.2.2",
+ "tailwindcss": "^4.2.2",
+ "typescript": "^5.9.3"
+ }
+ },
+ "node_modules/@alloc/quick-lru": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz",
+ "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@img/colour": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+ "cpu": [
+ "arm"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.7.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz",
+ "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==",
+ "license": "MIT"
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz",
+ "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz",
+ "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz",
+ "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz",
+ "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz",
+ "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz",
+ "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz",
+ "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz",
+ "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz",
+ "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "enhanced-resolve": "^5.19.0",
+ "jiti": "^2.6.1",
+ "lightningcss": "1.32.0",
+ "magic-string": "^0.30.21",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.2.2"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz",
+ "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.2.2",
+ "@tailwindcss/oxide-darwin-arm64": "4.2.2",
+ "@tailwindcss/oxide-darwin-x64": "4.2.2",
+ "@tailwindcss/oxide-freebsd-x64": "4.2.2",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.2.2",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.2.2",
+ "@tailwindcss/oxide-linux-x64-musl": "4.2.2",
+ "@tailwindcss/oxide-wasm32-wasi": "4.2.2",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.2.2"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz",
+ "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz",
+ "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz",
+ "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz",
+ "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz",
+ "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz",
+ "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz",
+ "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz",
+ "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz",
+ "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz",
+ "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.8.1",
+ "@emnapi/runtime": "^1.8.1",
+ "@emnapi/wasi-threads": "^1.1.0",
+ "@napi-rs/wasm-runtime": "^1.1.1",
+ "@tybys/wasm-util": "^0.10.1",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz",
+ "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz",
+ "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/postcss": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.2.tgz",
+ "integrity": "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@alloc/quick-lru": "^5.2.0",
+ "@tailwindcss/node": "4.2.2",
+ "@tailwindcss/oxide": "4.2.2",
+ "postcss": "^8.5.6",
+ "tailwindcss": "4.2.2"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "24.12.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
+ "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.14",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.2.0"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.14",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.14.tgz",
+ "integrity": "sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA==",
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001784",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz",
+ "integrity": "sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "license": "MIT"
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.20.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz",
+ "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/framer-motion": {
+ "version": "12.38.0",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz",
+ "integrity": "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-dom": "^12.38.0",
+ "motion-utils": "^12.36.0",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/jiti": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/motion-dom": {
+ "version": "12.38.0",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz",
+ "integrity": "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.36.0"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.36.0",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz",
+ "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/next": {
+ "version": "16.2.6",
+ "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz",
+ "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==",
+ "license": "MIT",
+ "dependencies": {
+ "@next/env": "16.2.6",
+ "@swc/helpers": "0.5.15",
+ "baseline-browser-mapping": "^2.9.19",
+ "caniuse-lite": "^1.0.30001579",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.6"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "16.2.6",
+ "@next/swc-darwin-x64": "16.2.6",
+ "@next/swc-linux-arm64-gnu": "16.2.6",
+ "@next/swc-linux-arm64-musl": "16.2.6",
+ "@next/swc-linux-x64-gnu": "16.2.6",
+ "@next/swc-linux-x64-musl": "16.2.6",
+ "@next/swc-win32-arm64-msvc": "16.2.6",
+ "@next/swc-win32-x64-msvc": "16.2.6",
+ "sharp": "^0.34.5"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.51.1",
+ "babel-plugin-react-compiler": "*",
+ "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/postcss": {
+ "version": "8.5.14",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz",
+ "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
+ "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
+ "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.4"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sharp": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.5",
+ "@img/sharp-darwin-x64": "0.34.5",
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
+ "@img/sharp-libvips-linux-arm": "1.2.4",
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
+ "@img/sharp-libvips-linux-x64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+ "@img/sharp-linux-arm": "0.34.5",
+ "@img/sharp-linux-arm64": "0.34.5",
+ "@img/sharp-linux-ppc64": "0.34.5",
+ "@img/sharp-linux-riscv64": "0.34.5",
+ "@img/sharp-linux-s390x": "0.34.5",
+ "@img/sharp-linux-x64": "0.34.5",
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
+ "@img/sharp-linuxmusl-x64": "0.34.5",
+ "@img/sharp-wasm32": "0.34.5",
+ "@img/sharp-win32-arm64": "0.34.5",
+ "@img/sharp-win32-ia32": "0.34.5",
+ "@img/sharp-win32-x64": "0.34.5"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
+ "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
+ "license": "MIT",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz",
+ "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz",
+ "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "dev": true,
+ "license": "MIT"
+ }
+ }
+}
diff --git a/landing/package.json b/landing/package.json
new file mode 100644
index 00000000..f7e66c2b
--- /dev/null
+++ b/landing/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "agent-company-landing",
+ "private": true,
+ "version": "1.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "preview": "wrangler pages dev out"
+ },
+ "dependencies": {
+ "framer-motion": "12.38.0",
+ "next": "16.2.6",
+ "react": "19.2.4",
+ "react-dom": "19.2.4"
+ },
+ "devDependencies": {
+ "@tailwindcss/postcss": "^4.2.2",
+ "@types/node": "^24.9.1",
+ "@types/react": "^19.2.2",
+ "@types/react-dom": "^19.2.2",
+ "tailwindcss": "^4.2.2",
+ "typescript": "^5.9.3"
+ },
+ "overrides": {
+ "postcss": "8.5.14"
+ }
+}
diff --git a/landing/postcss.config.mjs b/landing/postcss.config.mjs
new file mode 100644
index 00000000..c2ddf748
--- /dev/null
+++ b/landing/postcss.config.mjs
@@ -0,0 +1,5 @@
+export default {
+ plugins: {
+ "@tailwindcss/postcss": {},
+ },
+};
diff --git a/landing/preview-dark.html b/landing/preview-dark.html
new file mode 100644
index 00000000..f38b326a
--- /dev/null
+++ b/landing/preview-dark.html
@@ -0,0 +1,810 @@
+
+
+
+
+
+Design System Preview: Cohere (Dark)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Design System Preview:Cohere
+ Auto-generated design token catalog from DESIGN.md
+
+ Explore Tokens
+ View Source
+
+
+
+
+
+
+
+ 01 / Color Palette
+ Color Palette & Roles
+
+
+
Primary
+
+
+
+
+
Cohere Black
+
#000000
+
Primary headline text, maximum emphasis
+
+
+
+
+
+
Near Black
+
#212121
+
Standard body link color
+
+
+
+
+
+
Deep Dark
+
#17171c
+
Navigation and dark-section text
+
+
+
+
+
+
+
Secondary & Accent
+
+
+
+
+
Interaction Blue
+
#1863dc
+
Hover, focus states, active links
+
+
+
+
+
+
Ring Blue
+
#4c6ee6 @ 50%
+
Keyboard focus indicators
+
+
+
+
+
+
Focus Purple
+
#9b60aa
+
Input focus border color
+
+
+
+
+
+
+
Surface & Background
+
+
+
+
+
Pure White
+
#ffffff
+
Primary page background, card surface
+
+
+
+
+
+
Snow
+
#fafafa
+
Subtle elevated surfaces, light sections
+
+
+
+
+
+
Lightest Gray
+
#f2f2f2
+
Card borders, softest containment
+
+
+
+
+
+
+
Neutrals & Text
+
+
+
+
+
Muted Slate
+
#93939f
+
Footer links, tertiary text
+
+
+
+
+
+
Border Cool
+
#d9d9dd
+
Section borders, list separators
+
+
+
+
+
+
Border Light
+
#e5e7eb
+
Lighter border variant (gray-200)
+
+
+
+
+
+
+
+
+
+
+
Enterprise AI Platform
+
Deep purple hero sections create dramatic visual breaks in the dark page flow
+
+
+
+
+
+
+ 02 / Typography Scale
+ Typography Rules
+
+
+
Display Hero
+
Display / Hero — CohereText — 72px / 400 / 1.00 / -1.44px
+
+
+
+
Display Secondary
+
Display Secondary — CohereText — 60px / 400 / 1.00 / -1.2px
+
+
+
+
Section Heading
+
Section Heading — Unica77 — 48px / 400 / 1.20 / -0.48px
+
+
+
+
Sub-heading
+
Sub-heading — Unica77 — 32px / 400 / 1.20 / -0.32px
+
+
+
+
Feature Title
+
Feature Title — Unica77 — 24px / 400 / 1.30 / normal
+
+
+
+
Body Large text for intro paragraphs. Unica77 provides geometric Swiss precision for all functional UI text at the body-large tier.
+
Body Large — Unica77 — 18px / 400 / 1.40 / normal
+
+
+
+
Standard body text for paragraphs, navigation links, and button labels. Unica77 at its most common size, weight 400.
+
Body / Button — Unica77 — 16px / 400 / 1.50 / normal
+
+
+
+
Button Medium Label
+
Button Medium — Unica77 — 14px / 500 / 1.71 / normal
+
+
+
+
Caption and metadata text for descriptions
+
Caption — Unica77 — 14px / 400 / 1.40 / normal
+
+
+
+
UPPERCASE SECTION LABEL
+
Uppercase Label — CohereMono — 14px / 400 / 1.40 / 0.28px / uppercase
+
+
+
+
Smallest text for footer links and fine print
+
Small — Unica77 — 12px / 400 / 1.40 / normal
+
+
+
+
CODE MICRO LABEL
+
Code Micro — CohereMono — 8px / 400 / 1.40 / 0.16px / uppercase
+
+
+
+
+
+
+
+
+
+
+
+
+ 04 / Card Examples
+ Cards & Containers
+
+
+
+
STANDARD CARD
+
Signature 22px Radius
+
The distinctive Cohere card with 22px border-radius and #333 border on dark surfaces. Creates cloud-like, organic softness on the dark canvas.
+
+
+
DIALOG CARD
+
Dialog 8px Radius
+
Modal and dialog containers use a tighter 8px radius with #333 border. Functional, secondary containment for transient UI.
+
+
+
GENEROUS CARD
+
Featured 16px Radius
+
Medium-sized containers for featured content. Uses 16px radius as a middle step in the radius scale with subtle border.
+
+
+
+
+
+
+
+
+ 05 / Spacing Scale
+ Spacing System
+ Base unit: 8px. Scale from 2px to 60px.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 06 / Border Radius Scale
+ Border Radius
+
+
+
+
+
+
20px
Large — feature cards
+
22px
Signature — THE radius
+
9999px
Pill — buttons, tags
+
+
+
+
+
+
+
+ 07 / Elevation & Depth
+ Depth & Elevation
+
+
+
+
Flat
No shadow, no border. Page background and text blocks.
+
Level 0
+
+
+
Bordered (Subtle)
1px solid #2a2a2f. Subtle dark containment lines.
+
Level 1 — Subtle
+
+
+
Bordered (Standard)
1px solid #333. Standard dark-mode card borders.
+
Level 1 — Standard
+
+
+
Purple Band
Full-width dark purple background. Hero sections, showcases.
+
Level 2 — Dramatic
+
+
+
+
+ Cohere is nearly shadow-free. Depth is communicated through background color contrast (elevated cards on dark canvas), border containment, and dramatic light-to-dark section alternation.
+
+
+
+
+
+
+
diff --git a/landing/preview.html b/landing/preview.html
new file mode 100644
index 00000000..e8849b7e
--- /dev/null
+++ b/landing/preview.html
@@ -0,0 +1,814 @@
+
+
+
+
+
+Design System Preview: Cohere (Light)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Design System Preview:Cohere
+ Auto-generated design token catalog from DESIGN.md
+
+ Explore Tokens
+ View Source
+
+
+
+
+
+
+
+ 01 / Color Palette
+ Color Palette & Roles
+
+
+
Primary
+
+
+
+
+
Cohere Black
+
#000000
+
Primary headline text, maximum emphasis
+
+
+
+
+
+
Near Black
+
#212121
+
Standard body link color
+
+
+
+
+
+
Deep Dark
+
#17171c
+
Navigation and dark-section text
+
+
+
+
+
+
+
Secondary & Accent
+
+
+
+
+
Interaction Blue
+
#1863dc
+
Hover, focus states, active links
+
+
+
+
+
+
Ring Blue
+
#4c6ee6 @ 50%
+
Keyboard focus indicators
+
+
+
+
+
+
Focus Purple
+
#9b60aa
+
Input focus border color
+
+
+
+
+
+
+
Surface & Background
+
+
+
+
+
Pure White
+
#ffffff
+
Primary page background, card surface
+
+
+
+
+
+
Snow
+
#fafafa
+
Subtle elevated surfaces, light sections
+
+
+
+
+
+
Lightest Gray
+
#f2f2f2
+
Card borders, softest containment
+
+
+
+
+
+
+
Neutrals & Text
+
+
+
+
+
Muted Slate
+
#93939f
+
Footer links, tertiary text
+
+
+
+
+
+
Border Cool
+
#d9d9dd
+
Section borders, list separators
+
+
+
+
+
+
Border Light
+
#e5e7eb
+
Lighter border variant (gray-200)
+
+
+
+
+
+
+
+
+
+
+
Enterprise AI Platform
+
Deep purple hero sections create dramatic visual breaks in the white page flow
+
+
+
+
+
+
+ 02 / Typography Scale
+ Typography Rules
+
+
+
Display Hero
+
Display / Hero — CohereText — 72px / 400 / 1.00 / -1.44px
+
+
+
+
Display Secondary
+
Display Secondary — CohereText — 60px / 400 / 1.00 / -1.2px
+
+
+
+
Section Heading
+
Section Heading — Unica77 — 48px / 400 / 1.20 / -0.48px
+
+
+
+
Sub-heading
+
Sub-heading — Unica77 — 32px / 400 / 1.20 / -0.32px
+
+
+
+
Feature Title
+
Feature Title — Unica77 — 24px / 400 / 1.30 / normal
+
+
+
+
Body Large text for intro paragraphs. Unica77 provides geometric Swiss precision for all functional UI text at the body-large tier.
+
Body Large — Unica77 — 18px / 400 / 1.40 / normal
+
+
+
+
Standard body text for paragraphs, navigation links, and button labels. Unica77 at its most common size, weight 400.
+
Body / Button — Unica77 — 16px / 400 / 1.50 / normal
+
+
+
+
Button Medium Label
+
Button Medium — Unica77 — 14px / 500 / 1.71 / normal
+
+
+
+
Caption and metadata text for descriptions
+
Caption — Unica77 — 14px / 400 / 1.40 / normal
+
+
+
+
UPPERCASE SECTION LABEL
+
Uppercase Label — CohereMono — 14px / 400 / 1.40 / 0.28px / uppercase
+
+
+
+
Smallest text for footer links and fine print
+
Small — Unica77 — 12px / 400 / 1.40 / normal
+
+
+
+
CODE MICRO LABEL
+
Code Micro — CohereMono — 8px / 400 / 1.40 / 0.16px / uppercase
+
+
+
+
+
+
+
+
+
+
+
+
+ 04 / Card Examples
+ Cards & Containers
+
+
+
+
STANDARD CARD
+
Signature 22px Radius
+
The distinctive Cohere card with 22px border-radius and 1px solid #f2f2f2 border. Creates cloud-like, organic softness on the white canvas.
+
+
+
DIALOG CARD
+
Dialog 8px Radius
+
Modal and dialog containers use a tighter 8px radius with #d9d9dd border. Functional, secondary containment for transient UI.
+
+
+
GENEROUS CARD
+
Featured 16px Radius
+
Medium-sized containers for featured content. Uses 16px radius as a middle step in the radius scale with subtle #f2f2f2 border.
+
+
+
+
+
+
+
+
+ 05 / Spacing Scale
+ Spacing System
+ Base unit: 8px. Scale from 2px to 60px.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 06 / Border Radius Scale
+ Border Radius
+
+
+
+
+
+
20px
Large — feature cards
+
22px
Signature — THE radius
+
9999px
Pill — buttons, tags
+
+
+
+
+
+
+
+ 07 / Elevation & Depth
+ Depth & Elevation
+
+
+
+
Flat
No shadow, no border. Page background and text blocks.
+
Level 0
+
+
+
Bordered (Light)
1px solid #f2f2f2. Standard cards, subtle containment.
+
Level 1 — Lightest Gray
+
+
+
Bordered (Cool)
1px solid #d9d9dd. Emphasized cards, list separators.
+
Level 1 — Border Cool
+
+
+
Purple Band
Full-width dark purple background. Hero sections, showcases.
+
Level 2 — Dramatic
+
+
+
+
+ Cohere is nearly shadow-free. Depth is communicated through background color contrast (white cards on purple bands), border containment (cool gray borders), and dramatic light-to-dark section alternation.
+
+
+
+
+
+
+
diff --git a/landing/public/_headers b/landing/public/_headers
new file mode 100644
index 00000000..27e6349e
--- /dev/null
+++ b/landing/public/_headers
@@ -0,0 +1,21 @@
+/*
+ Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://static.cloudflareinsights.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data:; connect-src 'self' https://cloudflareinsights.com; base-uri 'self'; form-action 'self'; frame-ancestors 'none'
+ Permissions-Policy: camera=(), microphone=(), geolocation=()
+ Referrer-Policy: strict-origin-when-cross-origin
+ X-Content-Type-Options: nosniff
+ X-Frame-Options: DENY
+
+/screenshots/*
+ Cache-Control: public, max-age=31536000, immutable
+
+/assets/*
+ Cache-Control: public, max-age=31536000, immutable
+
+/_next/static/*
+ Cache-Control: public, max-age=31536000, immutable
+
+/favicon.ico
+ Cache-Control: public, max-age=31536000, immutable
+
+/icon.png
+ Cache-Control: public, max-age=31536000, immutable
diff --git a/landing/public/assets/icon.svg b/landing/public/assets/icon.svg
new file mode 100644
index 00000000..dd6927c4
--- /dev/null
+++ b/landing/public/assets/icon.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/landing/public/favicon.ico b/landing/public/favicon.ico
new file mode 100644
index 00000000..336b3b77
Binary files /dev/null and b/landing/public/favicon.ico differ
diff --git a/landing/public/icon.png b/landing/public/icon.png
new file mode 100644
index 00000000..5888660f
Binary files /dev/null and b/landing/public/icon.png differ
diff --git a/landing/public/screenshots/AI-Internal-Realtime-Message.jpeg b/landing/public/screenshots/AI-Internal-Realtime-Message.jpeg
new file mode 100644
index 00000000..bd8235e9
Binary files /dev/null and b/landing/public/screenshots/AI-Internal-Realtime-Message.jpeg differ
diff --git a/landing/public/screenshots/Approval-by-Human.jpeg b/landing/public/screenshots/Approval-by-Human.jpeg
new file mode 100644
index 00000000..d5e459ff
Binary files /dev/null and b/landing/public/screenshots/Approval-by-Human.jpeg differ
diff --git a/landing/public/screenshots/Auto-OrgChart-Team.jpeg b/landing/public/screenshots/Auto-OrgChart-Team.jpeg
new file mode 100644
index 00000000..156ed2ad
Binary files /dev/null and b/landing/public/screenshots/Auto-OrgChart-Team.jpeg differ
diff --git a/landing/public/screenshots/Auto-Task.jpeg b/landing/public/screenshots/Auto-Task.jpeg
new file mode 100644
index 00000000..df5096cd
Binary files /dev/null and b/landing/public/screenshots/Auto-Task.jpeg differ
diff --git a/landing/public/screenshots/Dashboard.jpeg b/landing/public/screenshots/Dashboard.jpeg
new file mode 100644
index 00000000..cf4f53e0
Binary files /dev/null and b/landing/public/screenshots/Dashboard.jpeg differ
diff --git a/landing/public/screenshots/Document-Center.jpeg b/landing/public/screenshots/Document-Center.jpeg
new file mode 100644
index 00000000..a40bfb89
Binary files /dev/null and b/landing/public/screenshots/Document-Center.jpeg differ
diff --git a/landing/public/screenshots/Onboarding.jpeg b/landing/public/screenshots/Onboarding.jpeg
new file mode 100644
index 00000000..d80dee0d
Binary files /dev/null and b/landing/public/screenshots/Onboarding.jpeg differ
diff --git a/landing/tsconfig.json b/landing/tsconfig.json
new file mode 100644
index 00000000..e0c8e33d
--- /dev/null
+++ b/landing/tsconfig.json
@@ -0,0 +1,36 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "es2022"
+ ],
+ "allowJs": false,
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "react-jsx",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ]
+ },
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/landing/wrangler.toml b/landing/wrangler.toml
new file mode 100644
index 00000000..d71ece3c
--- /dev/null
+++ b/landing/wrangler.toml
@@ -0,0 +1,11 @@
+name = "agentcompany"
+compatibility_date = "2026-04-03"
+pages_build_output_dir = "out"
+
+[vars]
+DOWNLOAD_COUNTER_SALT = "agentcompany-download-counter-v1"
+
+[[d1_databases]]
+binding = "DOWNLOAD_COUNTER_DB"
+database_name = "agentcompany-landing-downloads"
+database_id = "dfa3f0f3-009b-4436-b519-5b50ae6b1cf9"