From 93f904e429a2285ab6e667fbf1a11b26768a743c Mon Sep 17 00:00:00 2001 From: codebanditssss Date: Wed, 3 Jun 2026 21:57:38 +0530 Subject: [PATCH] feat: wire up landing page routes and layout --- frontend/src/landing/app/landing/layout.tsx | 32 +++++++++++++++ frontend/src/landing/app/landing/page.tsx | 44 +++++++++++++++++++++ frontend/src/landing/app/layout.tsx | 15 +++++++ frontend/src/landing/app/page.tsx | 9 +++++ 4 files changed, 100 insertions(+) create mode 100644 frontend/src/landing/app/landing/layout.tsx create mode 100644 frontend/src/landing/app/landing/page.tsx create mode 100644 frontend/src/landing/app/layout.tsx create mode 100644 frontend/src/landing/app/page.tsx diff --git a/frontend/src/landing/app/landing/layout.tsx b/frontend/src/landing/app/landing/layout.tsx new file mode 100644 index 000000000..850390d94 --- /dev/null +++ b/frontend/src/landing/app/landing/layout.tsx @@ -0,0 +1,32 @@ +import type { Metadata } from "next"; + +export const metadata: Metadata = { + title: "Agent Orchestrator", + description: + "Open-source platform for running parallel AI coding agents. Spawn Claude Code, Codex, Aider, and more in isolated worktrees โ€” all managed from one dashboard.", + openGraph: { + type: "website", + url: "https://aoagents.dev/landing", + siteName: "Agent Orchestrator", + title: "Agent Orchestrator", + description: + "Open-source platform for running parallel AI coding agents. Spawn Claude Code, Codex, Aider, and more in isolated worktrees โ€” all managed from one dashboard.", + images: [{ url: "/og-image.png", width: 1024, height: 1024, alt: "Agent Orchestrator" }], + }, + twitter: { + card: "summary", + site: "@aoagents", + creator: "@aoagents", + title: "Agent Orchestrator", + description: + "Open-source platform for running parallel AI coding agents. Spawn Claude Code, Codex, Aider, and more in isolated worktrees โ€” all managed from one dashboard.", + images: ["/og-image.png"], + }, + alternates: { + canonical: "https://aoagents.dev/", + }, +}; + +export default function LandingLayout({ children }: { children: React.ReactNode }) { + return <>{children}; +} diff --git a/frontend/src/landing/app/landing/page.tsx b/frontend/src/landing/app/landing/page.tsx new file mode 100644 index 000000000..a9eb619dc --- /dev/null +++ b/frontend/src/landing/app/landing/page.tsx @@ -0,0 +1,44 @@ +import { LandingNav } from "../../components/LandingNav"; +import { LandingHero } from "../../components/LandingHero"; +import { LandingAbout } from "../../components/LandingAbout"; +import { LandingAgentsBar } from "../../components/LandingAgentsBar"; +import { LandingStats } from "../../components/LandingStats"; +import { LandingVideo } from "../../components/LandingVideo"; +import { LandingFeatures } from "../../components/LandingFeatures"; +import { LandingWorkflow } from "../../components/LandingWorkflow"; +import { LandingUseCases } from "../../components/LandingUseCases"; +import { LandingTestimonials } from "../../components/LandingTestimonials"; +import { LandingHowItWorks } from "../../components/LandingHowItWorks"; +import { LandingQuickStart } from "../../components/LandingQuickStart"; +import { LandingCTA } from "../../components/LandingCTA"; +import { ScrollRevealProvider } from "../../components/ScrollRevealProvider"; +import { PageConstellation } from "../../components/PageConstellation"; +import { formatCompactNumber, getGitHubRepoStats } from "../../lib/github-repo"; + +export default async function LandingPage() { + const githubStats = await getGitHubRepoStats(); + + return ( + + +
+ + + + + +
+
+ + + + +
+ +
+ MIT Licensed ยท Open Source +
+
+
+ ); +} diff --git a/frontend/src/landing/app/layout.tsx b/frontend/src/landing/app/layout.tsx new file mode 100644 index 000000000..61cdd31c8 --- /dev/null +++ b/frontend/src/landing/app/layout.tsx @@ -0,0 +1,15 @@ +import type { Metadata } from "next"; +import "../styles/globals.css"; + +export const metadata: Metadata = { + title: "Agent Orchestrator", + description: "Open-source platform for running parallel AI coding agents.", +}; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} diff --git a/frontend/src/landing/app/page.tsx b/frontend/src/landing/app/page.tsx new file mode 100644 index 000000000..1e6d70b5e --- /dev/null +++ b/frontend/src/landing/app/page.tsx @@ -0,0 +1,9 @@ +import LandingPage from "./landing/page"; + +export default function HomePage() { + return ( +
+ +
+ ); +} \ No newline at end of file