From 82656122063237927929b8636fdb323479388e81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Tue, 7 Jul 2026 21:10:31 -0400 Subject: [PATCH] recover landing --- landing/.gitignore | 5 + landing/README.md | 14 + landing/_headers | 21 + landing/app/globals.css | 128 ++ landing/app/layout.tsx | 203 ++ landing/app/page.tsx | 34 + landing/components/ascii-background.tsx | 158 ++ landing/components/download-section.tsx | 105 + landing/components/faq.tsx | 109 + landing/components/features.tsx | 191 ++ landing/components/footer.tsx | 91 + landing/components/hero.tsx | 129 ++ landing/components/how-it-works.tsx | 149 ++ landing/components/icon-mark.tsx | 24 + landing/components/navbar.tsx | 132 ++ landing/components/release-links.generated.ts | 109 + landing/components/runtimes-bar.tsx | 117 ++ landing/components/site-constants.ts | 2 + landing/components/theme-provider.tsx | 76 + landing/components/theme-toggle.tsx | 42 + landing/functions/api/download-stats.ts | 34 + landing/functions/api/download.ts | 73 + landing/functions/types.ts | 17 + landing/lib/downloads.ts | 28 + landing/lib/platform-support.ts | 106 + landing/lib/product-narrative.ts | 80 + landing/migrations/0001_download_counter.sql | 18 + landing/next-env.d.ts | 6 + landing/next.config.ts | 11 + landing/package-lock.json | 1762 +++++++++++++++++ landing/package.json | 29 + landing/postcss.config.mjs | 5 + landing/preview-dark.html | 810 ++++++++ landing/preview.html | 814 ++++++++ landing/public/_headers | 21 + landing/public/assets/icon.svg | 7 + landing/public/favicon.ico | Bin 0 -> 24205 bytes landing/public/icon.png | Bin 0 -> 33139 bytes .../AI-Internal-Realtime-Message.jpeg | Bin 0 -> 770540 bytes .../public/screenshots/Approval-by-Human.jpeg | Bin 0 -> 233031 bytes .../screenshots/Auto-OrgChart-Team.jpeg | Bin 0 -> 344657 bytes landing/public/screenshots/Auto-Task.jpeg | Bin 0 -> 475674 bytes landing/public/screenshots/Dashboard.jpeg | Bin 0 -> 461199 bytes .../public/screenshots/Document-Center.jpeg | Bin 0 -> 221097 bytes landing/public/screenshots/Onboarding.jpeg | Bin 0 -> 620378 bytes landing/tsconfig.json | 36 + landing/wrangler.toml | 11 + 47 files changed, 5707 insertions(+) create mode 100644 landing/.gitignore create mode 100644 landing/README.md create mode 100644 landing/_headers create mode 100644 landing/app/globals.css create mode 100644 landing/app/layout.tsx create mode 100644 landing/app/page.tsx create mode 100644 landing/components/ascii-background.tsx create mode 100644 landing/components/download-section.tsx create mode 100644 landing/components/faq.tsx create mode 100644 landing/components/features.tsx create mode 100644 landing/components/footer.tsx create mode 100644 landing/components/hero.tsx create mode 100644 landing/components/how-it-works.tsx create mode 100644 landing/components/icon-mark.tsx create mode 100644 landing/components/navbar.tsx create mode 100644 landing/components/release-links.generated.ts create mode 100644 landing/components/runtimes-bar.tsx create mode 100644 landing/components/site-constants.ts create mode 100644 landing/components/theme-provider.tsx create mode 100644 landing/components/theme-toggle.tsx create mode 100644 landing/functions/api/download-stats.ts create mode 100644 landing/functions/api/download.ts create mode 100644 landing/functions/types.ts create mode 100644 landing/lib/downloads.ts create mode 100644 landing/lib/platform-support.ts create mode 100644 landing/lib/product-narrative.ts create mode 100644 landing/migrations/0001_download_counter.sql create mode 100644 landing/next-env.d.ts create mode 100644 landing/next.config.ts create mode 100644 landing/package-lock.json create mode 100644 landing/package.json create mode 100644 landing/postcss.config.mjs create mode 100644 landing/preview-dark.html create mode 100644 landing/preview.html create mode 100644 landing/public/_headers create mode 100644 landing/public/assets/icon.svg create mode 100644 landing/public/favicon.ico create mode 100644 landing/public/icon.png create mode 100644 landing/public/screenshots/AI-Internal-Realtime-Message.jpeg create mode 100644 landing/public/screenshots/Approval-by-Human.jpeg create mode 100644 landing/public/screenshots/Auto-OrgChart-Team.jpeg create mode 100644 landing/public/screenshots/Auto-Task.jpeg create mode 100644 landing/public/screenshots/Dashboard.jpeg create mode 100644 landing/public/screenshots/Document-Center.jpeg create mode 100644 landing/public/screenshots/Onboarding.jpeg create mode 100644 landing/tsconfig.json create mode 100644 landing/wrangler.toml 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 ( + + + + + + +