diff --git a/src/app/(app)/feed/page.tsx b/src/app/(app)/feed/page.tsx
new file mode 100644
index 0000000..e1703a4
--- /dev/null
+++ b/src/app/(app)/feed/page.tsx
@@ -0,0 +1,26 @@
+import type { Metadata } from "next";
+import { FeedList } from "@/components/feed/FeedList";
+
+/**
+ * /feed — Home feed page (RSC shell).
+ *
+ * This is the primary landing page after login (D-04).
+ * The FeedList client component handles data fetching and infinite scroll.
+ *
+ * Layout: max-w-[640px] px-6 py-8 per UI-SPEC Feed container.
+ *
+ * StoryTray seam:
+ * // TODO(02-05): StoryTray above feed
+ */
+export const metadata: Metadata = {
+ title: "Home — PawFeed",
+};
+
+export default function FeedPage() {
+ return (
+
+ {/* TODO(02-05): StoryTray above feed */}
+
+
+ );
+}
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 3f36f7c..044229e 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -1,65 +1,15 @@
-import Image from "next/image";
+import { redirect } from "next/navigation";
-export default function Home() {
- return (
-
-
-
-
-
- To get started, edit the page.tsx file.
-
-
- Looking for a starting point or more instructions? Head over to{" "}
-
- Templates
- {" "}
- or the{" "}
-
- Learning
- {" "}
- center.
-
-
-
-
-
- );
+/**
+ * Root route (/) — redirects to /feed for authenticated users.
+ *
+ * D-04: After Phase 2, the home route (/) redirects to /feed.
+ * The feed is the primary landing page after login.
+ *
+ * Unauthenticated users are gated by proxy.ts middleware before reaching this page.
+ * proxy.ts redirects unauthenticated requests to /sign-in, so this redirect
+ * is effectively auth-safe (only authenticated users reach it).
+ */
+export default function RootPage() {
+ redirect("/feed");
}
diff --git a/src/components/layout/MobileNav.tsx b/src/components/layout/MobileNav.tsx
index 4e379db..4275ca8 100644
--- a/src/components/layout/MobileNav.tsx
+++ b/src/components/layout/MobileNav.tsx
@@ -55,7 +55,8 @@ export function MobileNav({ pets }: MobileNavProps) {
const activePet = pets.find((p) => p.id === activePetId) ?? pets[0];
- const isHomePage = pathname === "/";
+ // D-05: Home → /feed; also highlight when on / (which redirects to /feed)
+ const isHomePage = pathname === "/feed" || pathname === "/";
const isPetsPage = pathname.startsWith("/pets");
return (
@@ -132,9 +133,9 @@ export function MobileNav({ pets }: MobileNavProps) {
className="h-16 bg-card border-t border flex items-center justify-around px-2"
aria-label="Mobile navigation"
>
- {/* Home */}
+ {/* Home — D-05: href updated to /feed; label stays "Home" */}
{navLinks.map(({ href, label, icon: Icon, active }) => {
+ // Active detection: /feed highlights when pathname is /feed or /
+ // (/ redirects to /feed, so treat both as Home active state)
const isCurrentPage =
- href === "/" ? pathname === "/" : pathname.startsWith(href);
+ href === "/feed"
+ ? pathname === "/feed" || pathname === "/"
+ : pathname.startsWith(href);
const isActive = isCurrentPage;
if (!active) {