diff --git a/apps/web/app/(landing)/layout.tsx b/apps/web/app/(landing)/layout.tsx
new file mode 100644
index 00000000..b5119cad
--- /dev/null
+++ b/apps/web/app/(landing)/layout.tsx
@@ -0,0 +1,19 @@
+import { Instrument_Serif } from "next/font/google";
+
+const instrumentSerif = Instrument_Serif({
+ subsets: ["latin"],
+ weight: "400",
+ variable: "--font-serif",
+});
+
+export default function LandingLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return (
+
+ {children}
+
+ );
+}
diff --git a/apps/web/app/(landing)/page.tsx b/apps/web/app/(landing)/page.tsx
new file mode 100644
index 00000000..3394d534
--- /dev/null
+++ b/apps/web/app/(landing)/page.tsx
@@ -0,0 +1,31 @@
+"use client";
+
+import { useEffect } from "react";
+import { useRouter } from "next/navigation";
+import { useAuthStore } from "@/features/auth";
+import { useNavigationStore } from "@/features/navigation";
+import { MulticaLanding } from "@/features/landing/components/multica-landing";
+import { MulticaIcon } from "@/components/multica-icon";
+
+export default function LandingPage() {
+ const router = useRouter();
+ const user = useAuthStore((s) => s.user);
+ const isLoading = useAuthStore((s) => s.isLoading);
+
+ useEffect(() => {
+ if (!isLoading && user) {
+ const lastPath = useNavigationStore.getState().lastPath;
+ router.replace(lastPath);
+ }
+ }, [isLoading, user, router]);
+
+ if (isLoading || user) {
+ return (
+
+
+
+ );
+ }
+
+ return ;
+}
diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx
deleted file mode 100644
index 179831dd..00000000
--- a/apps/web/app/page.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-"use client";
-
-import { useEffect } from "react";
-import { useRouter } from "next/navigation";
-import { useNavigationStore } from "@/features/navigation";
-import { MulticaIcon } from "@/components/multica-icon";
-
-export default function Home() {
- const router = useRouter();
-
- useEffect(() => {
- const lastPath = useNavigationStore.getState().lastPath;
- router.replace(lastPath);
- }, [router]);
-
- return (
-
-
-
- );
-}
diff --git a/apps/web/features/landing/components/multica-landing.tsx b/apps/web/features/landing/components/multica-landing.tsx
new file mode 100644
index 00000000..59d249c0
--- /dev/null
+++ b/apps/web/features/landing/components/multica-landing.tsx
@@ -0,0 +1,167 @@
+import Image from "next/image";
+import Link from "next/link";
+import { MulticaIcon } from "@/components/multica-icon";
+import { cn } from "@/lib/utils";
+
+const githubUrl = "https://github.com/multica-ai/multica";
+
+export function MulticaLanding() {
+ return (
+
+
+
+
+
+
+
+
+
+ Your next 10 hires
+
+ won't be human.
+
+
+
+ Multica is project management for human + agent teams. Assign
+ tasks, manage runtimes, compound skills, all in one place.
+
+
+
+
+ Start free trial
+
+
+
+ GitHub
+
+
+
+
+
+
+
+
+ );
+}
+
+function LandingBackdrop() {
+ return (
+
+ );
+}
+
+function GitHubMark({ className }: { className?: string }) {
+ return (
+
+ );
+}
+
+function ProductImagePlaceholder() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ Real product screenshot goes here
+
+
+
+ Keeping the space and visual weight of the hero preview, while
+ leaving the center as a clean image placeholder for now.
+
+
+
+
+ );
+}
+
+function headerButtonClassName(tone: "ghost" | "solid") {
+ return cn(
+ "inline-flex items-center justify-center gap-2 rounded-[11px] px-4 py-2.5 text-[13px] font-semibold transition-colors",
+ tone === "solid"
+ ? "bg-white text-[#0a0d12] hover:bg-white/92"
+ : "border border-white/18 bg-black/16 text-white backdrop-blur-sm hover:bg-black/24",
+ );
+}
+
+function heroButtonClassName(tone: "ghost" | "solid") {
+ return cn(
+ "inline-flex items-center justify-center gap-2 rounded-[12px] px-5 py-3 text-[14px] font-semibold transition-colors",
+ tone === "solid"
+ ? "bg-white text-[#0a0d12] hover:bg-white/92"
+ : "border border-white/18 bg-black/16 text-white backdrop-blur-sm hover:bg-black/24",
+ );
+}
diff --git a/apps/web/public/images/landing-bg.jpg b/apps/web/public/images/landing-bg.jpg
new file mode 100644
index 00000000..eda4a4d8
Binary files /dev/null and b/apps/web/public/images/landing-bg.jpg differ