diff --git a/apps/web/app/(app)/collections/[id]/page.tsx b/apps/web/app/(app)/collections/[id]/page.tsx index ea5ee1b..50ed495 100644 --- a/apps/web/app/(app)/collections/[id]/page.tsx +++ b/apps/web/app/(app)/collections/[id]/page.tsx @@ -16,7 +16,7 @@ import { getMessages } from "@/lib/i18n/server"; type Params = { params: Promise<{ id: string }> }; -export const metadata: Metadata = { title: "Collection" }; +export const metadata: Metadata = {}; export default async function CollectionPage({ params }: Params) { const { id } = await params; diff --git a/apps/web/app/(app)/collections/page.tsx b/apps/web/app/(app)/collections/page.tsx index 0e1470c..ff744e3 100644 --- a/apps/web/app/(app)/collections/page.tsx +++ b/apps/web/app/(app)/collections/page.tsx @@ -4,7 +4,7 @@ import { auth } from "@/lib/auth/server"; import { db, collections, eq, desc } from "@epicure/db"; import { CollectionsPageContent } from "@/components/collections/collections-page-content"; -export const metadata: Metadata = { title: "Collections" }; +export const metadata: Metadata = {}; export default async function CollectionsPage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/(app)/explore/page.tsx b/apps/web/app/(app)/explore/page.tsx index b0564e7..c61fdef 100644 --- a/apps/web/app/(app)/explore/page.tsx +++ b/apps/web/app/(app)/explore/page.tsx @@ -13,7 +13,7 @@ import { } from "@epicure/db"; import { ExplorePageContent } from "@/components/search/explore-page-content"; -export const metadata: Metadata = { title: "Explore — Epicure" }; +export const metadata: Metadata = {}; export type RecipeResult = { id: string; diff --git a/apps/web/app/(app)/feed/page.tsx b/apps/web/app/(app)/feed/page.tsx index 580919d..3daaa2e 100644 --- a/apps/web/app/(app)/feed/page.tsx +++ b/apps/web/app/(app)/feed/page.tsx @@ -5,7 +5,7 @@ import { db, recipes, users, userFollows, eq, desc, inArray } from "@epicure/db" import { getPublicUrl } from "@/lib/storage"; import { FeedPageContent } from "@/components/feed/feed-page-content"; -export const metadata: Metadata = { title: "Feed" }; +export const metadata: Metadata = {}; export default async function FeedPage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/(app)/meal-plan/page.tsx b/apps/web/app/(app)/meal-plan/page.tsx index 26bab55..331884f 100644 --- a/apps/web/app/(app)/meal-plan/page.tsx +++ b/apps/web/app/(app)/meal-plan/page.tsx @@ -13,7 +13,7 @@ import { ExportMarkdownButton } from "@/components/shared/export-markdown-button import { mealPlanToMarkdown } from "@/lib/markdown/meal-plan"; import { getMessages, formatMessage } from "@/lib/i18n/server"; -export const metadata: Metadata = { title: "Meal Plan" }; +export const metadata: Metadata = {}; function getMonday(dateStr?: string): Date { const d = dateStr ? new Date(dateStr) : new Date(); diff --git a/apps/web/app/(app)/meal-plan/shared/[mealPlanId]/page.tsx b/apps/web/app/(app)/meal-plan/shared/[mealPlanId]/page.tsx index 01ba5aa..9a8b539 100644 --- a/apps/web/app/(app)/meal-plan/shared/[mealPlanId]/page.tsx +++ b/apps/web/app/(app)/meal-plan/shared/[mealPlanId]/page.tsx @@ -9,7 +9,7 @@ import { getMessages, formatMessage } from "@/lib/i18n/server"; type Params = { params: Promise<{ mealPlanId: string }> }; -export const metadata: Metadata = { title: "Shared Meal Plan" }; +export const metadata: Metadata = {}; export default async function SharedMealPlanPage({ params }: Params) { const { mealPlanId } = await params; diff --git a/apps/web/app/(app)/messages/page.tsx b/apps/web/app/(app)/messages/page.tsx index 76fbb43..eaf94ae 100644 --- a/apps/web/app/(app)/messages/page.tsx +++ b/apps/web/app/(app)/messages/page.tsx @@ -5,7 +5,7 @@ import { auth } from "@/lib/auth/server"; import { ConversationsList } from "@/components/social/conversations-list"; import { getMessages } from "@/lib/i18n/server"; -export const metadata: Metadata = { title: "Messages — Epicure" }; +export const metadata: Metadata = {}; export default async function MessagesPage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/(app)/pantry/page.tsx b/apps/web/app/(app)/pantry/page.tsx index c66e4ba..19a1174 100644 --- a/apps/web/app/(app)/pantry/page.tsx +++ b/apps/web/app/(app)/pantry/page.tsx @@ -5,7 +5,7 @@ import { db, pantryItems, eq, asc } from "@epicure/db"; import { PantryManager } from "@/components/meal-plan/pantry-manager"; import { PantryPageHeader } from "@/components/pantry/pantry-page-header"; -export const metadata: Metadata = { title: "Pantry" }; +export const metadata: Metadata = {}; export default async function PantryPage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/(app)/people/page.tsx b/apps/web/app/(app)/people/page.tsx index 034d768..3607f85 100644 --- a/apps/web/app/(app)/people/page.tsx +++ b/apps/web/app/(app)/people/page.tsx @@ -4,7 +4,7 @@ import { auth } from "@/lib/auth/server"; import { PeopleSearch } from "@/components/social/people-search"; import { getMessages } from "@/lib/i18n/server"; -export const metadata: Metadata = { title: "Find People — Epicure" }; +export const metadata: Metadata = {}; export default async function PeoplePage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/(app)/recipes/[id]/edit/page.tsx b/apps/web/app/(app)/recipes/[id]/edit/page.tsx index 847e21e..2ac2656 100644 --- a/apps/web/app/(app)/recipes/[id]/edit/page.tsx +++ b/apps/web/app/(app)/recipes/[id]/edit/page.tsx @@ -9,7 +9,7 @@ import { getPublicUrl } from "@/lib/storage"; type Params = { params: Promise<{ id: string }> }; -export const metadata: Metadata = { title: "Edit Recipe" }; +export const metadata: Metadata = {}; export default async function EditRecipePage({ params }: Params) { const { id } = await params; diff --git a/apps/web/app/(app)/recipes/can-cook/page.tsx b/apps/web/app/(app)/recipes/can-cook/page.tsx index 22687b6..c131f19 100644 --- a/apps/web/app/(app)/recipes/can-cook/page.tsx +++ b/apps/web/app/(app)/recipes/can-cook/page.tsx @@ -6,7 +6,7 @@ import { eq } from "@epicure/db"; import { getPublicUrl } from "@/lib/storage"; import { CanCookContent } from "@/components/recipe/can-cook-content"; -export const metadata: Metadata = { title: "What can I cook?" }; +export const metadata: Metadata = {}; const EXPIRING_WITHIN_DAYS = 3; diff --git a/apps/web/app/(app)/recipes/new/page.tsx b/apps/web/app/(app)/recipes/new/page.tsx index d318875..7775f91 100644 --- a/apps/web/app/(app)/recipes/new/page.tsx +++ b/apps/web/app/(app)/recipes/new/page.tsx @@ -3,7 +3,7 @@ import { RecipeForm } from "@/components/recipe/recipe-form"; import { NewRecipeHeader } from "@/components/recipe/new-recipe-header"; import { PhotoImportButton } from "@/components/recipe/photo-import-button"; -export const metadata: Metadata = { title: "New Recipe" }; +export const metadata: Metadata = {}; export default function NewRecipePage() { return ( diff --git a/apps/web/app/(app)/recipes/page.tsx b/apps/web/app/(app)/recipes/page.tsx index a18ed68..10524bf 100644 --- a/apps/web/app/(app)/recipes/page.tsx +++ b/apps/web/app/(app)/recipes/page.tsx @@ -7,7 +7,7 @@ import { RecipesHeader } from "@/components/recipe/recipes-header"; import { RecipesEmptyState } from "@/components/recipe/recipes-empty-state"; import { RecipesGrid } from "@/components/recipe/recipes-grid"; -export const metadata: Metadata = { title: "Recipes" }; +export const metadata: Metadata = {}; type SearchParams = Promise<{ q?: string; diff --git a/apps/web/app/(app)/settings/ai/page.tsx b/apps/web/app/(app)/settings/ai/page.tsx index 129e1e5..3e77312 100644 --- a/apps/web/app/(app)/settings/ai/page.tsx +++ b/apps/web/app/(app)/settings/ai/page.tsx @@ -6,7 +6,7 @@ import { ByokManager } from "@/components/settings/byok-manager"; import { ModelPrefsForm } from "@/components/settings/model-prefs-form"; import { getMessages } from "@/lib/i18n/server"; -export const metadata: Metadata = { title: "AI & Models – Settings" }; +export const metadata: Metadata = {}; export default async function AiSettingsPage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/(app)/settings/api-keys/page.tsx b/apps/web/app/(app)/settings/api-keys/page.tsx index 8dae709..0fd2bcd 100644 --- a/apps/web/app/(app)/settings/api-keys/page.tsx +++ b/apps/web/app/(app)/settings/api-keys/page.tsx @@ -7,7 +7,7 @@ import { db, apiKeys, eq } from "@epicure/db"; import { ApiKeysManager } from "@/components/settings/api-keys-manager"; import { getMessages } from "@/lib/i18n/server"; -export const metadata: Metadata = { title: "API Keys" }; +export const metadata: Metadata = {}; export default async function ApiKeysPage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/(app)/settings/notifications/page.tsx b/apps/web/app/(app)/settings/notifications/page.tsx index 738f1db..b3684a9 100644 --- a/apps/web/app/(app)/settings/notifications/page.tsx +++ b/apps/web/app/(app)/settings/notifications/page.tsx @@ -4,7 +4,7 @@ import { auth } from "@/lib/auth/server"; import { PushSubscribeButton } from "@/components/pwa/push-subscribe-button"; import { getMessages } from "@/lib/i18n/server"; -export const metadata: Metadata = { title: "Notifications – Settings" }; +export const metadata: Metadata = {}; export default async function NotificationsPage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/(app)/settings/nutrition/page.tsx b/apps/web/app/(app)/settings/nutrition/page.tsx index c194700..c5a3389 100644 --- a/apps/web/app/(app)/settings/nutrition/page.tsx +++ b/apps/web/app/(app)/settings/nutrition/page.tsx @@ -5,7 +5,7 @@ import { db, userNutritionGoals, eq } from "@epicure/db"; import { NutritionGoalsForm } from "@/components/nutrition/nutrition-goals-form"; import { getMessages } from "@/lib/i18n/server"; -export const metadata: Metadata = { title: "Nutrition – Settings" }; +export const metadata: Metadata = {}; export default async function NutritionPage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/(app)/settings/page.tsx b/apps/web/app/(app)/settings/page.tsx index 9a65f11..a4ef79c 100644 --- a/apps/web/app/(app)/settings/page.tsx +++ b/apps/web/app/(app)/settings/page.tsx @@ -4,7 +4,7 @@ import { auth } from "@/lib/auth/server"; import { db, users, eq } from "@epicure/db"; import { SettingsForm } from "@/components/settings/settings-form"; -export const metadata: Metadata = { title: "Profile – Settings" }; +export const metadata: Metadata = {}; export default async function SettingsPage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/(app)/settings/security/page.tsx b/apps/web/app/(app)/settings/security/page.tsx index 8ef89fc..23622fd 100644 --- a/apps/web/app/(app)/settings/security/page.tsx +++ b/apps/web/app/(app)/settings/security/page.tsx @@ -3,7 +3,7 @@ import { headers } from "next/headers"; import { auth } from "@/lib/auth/server"; import { SecurityForm } from "@/components/settings/security-form"; -export const metadata: Metadata = { title: "Security – Settings" }; +export const metadata: Metadata = {}; export default async function SecurityPage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/(app)/settings/webhooks/docs/page.tsx b/apps/web/app/(app)/settings/webhooks/docs/page.tsx index 2f35f21..90423b4 100644 --- a/apps/web/app/(app)/settings/webhooks/docs/page.tsx +++ b/apps/web/app/(app)/settings/webhooks/docs/page.tsx @@ -1,8 +1,6 @@ import type { Metadata } from "next"; -export const metadata: Metadata = { - title: "Webhook Docs — Epicure", -}; +export const metadata: Metadata = {}; export default function WebhookDocsPage() { return ( diff --git a/apps/web/app/(app)/settings/webhooks/page.tsx b/apps/web/app/(app)/settings/webhooks/page.tsx index d47b56e..2d9f759 100644 --- a/apps/web/app/(app)/settings/webhooks/page.tsx +++ b/apps/web/app/(app)/settings/webhooks/page.tsx @@ -5,7 +5,7 @@ import { db, webhooks, eq } from "@epicure/db"; import { WebhooksManager } from "@/components/settings/webhooks-manager"; import { getMessages } from "@/lib/i18n/server"; -export const metadata: Metadata = { title: "Webhooks" }; +export const metadata: Metadata = {}; export default async function WebhooksPage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/(app)/shopping-lists/[id]/page.tsx b/apps/web/app/(app)/shopping-lists/[id]/page.tsx index 700eee7..2c2e363 100644 --- a/apps/web/app/(app)/shopping-lists/[id]/page.tsx +++ b/apps/web/app/(app)/shopping-lists/[id]/page.tsx @@ -17,7 +17,7 @@ import { getMessages, formatMessage } from "@/lib/i18n/server"; type Params = { params: Promise<{ id: string }> }; -export const metadata: Metadata = { title: "Shopping List" }; +export const metadata: Metadata = {}; export default async function ShoppingListPage({ params }: Params) { const { id } = await params; diff --git a/apps/web/app/(app)/shopping-lists/page.tsx b/apps/web/app/(app)/shopping-lists/page.tsx index 5d009d6..bfe5544 100644 --- a/apps/web/app/(app)/shopping-lists/page.tsx +++ b/apps/web/app/(app)/shopping-lists/page.tsx @@ -4,7 +4,7 @@ import { auth } from "@/lib/auth/server"; import { db, shoppingLists, shoppingListMembers, eq, desc } from "@epicure/db"; import { ShoppingListsPageContent } from "@/components/shopping-lists/shopping-lists-page-content"; -export const metadata: Metadata = { title: "Shopping Lists" }; +export const metadata: Metadata = {}; export default async function ShoppingListsPage() { const session = await auth.api.getSession({ headers: await headers() }); diff --git a/apps/web/app/admin/ai-config/page.tsx b/apps/web/app/admin/ai-config/page.tsx index 6446c4c..4eee216 100644 --- a/apps/web/app/admin/ai-config/page.tsx +++ b/apps/web/app/admin/ai-config/page.tsx @@ -5,7 +5,7 @@ import { CheckCircle, XCircle, Database, Cpu } from "lucide-react"; import Link from "next/link"; import { getAllSiteSettings } from "@/lib/site-settings"; -export const metadata: Metadata = { title: "AI Config" }; +export const metadata: Metadata = {}; function resolveProvider(settings: Record) { if (settings["OPENROUTER_API_KEY"]?.value) return { provider: "OpenRouter", description: "Routes to many models via openrouter.ai" }; diff --git a/apps/web/app/admin/audit-logs/page.tsx b/apps/web/app/admin/audit-logs/page.tsx index f361433..03d1d2b 100644 --- a/apps/web/app/admin/audit-logs/page.tsx +++ b/apps/web/app/admin/audit-logs/page.tsx @@ -1,7 +1,7 @@ import type { Metadata } from "next"; import { db, auditLogs, users, eq, desc } from "@epicure/db"; -export const metadata: Metadata = { title: "Audit Logs" }; +export const metadata: Metadata = {}; const PAGE_SIZE = 50; diff --git a/apps/web/app/admin/invites/page.tsx b/apps/web/app/admin/invites/page.tsx index 529e786..0ae8222 100644 --- a/apps/web/app/admin/invites/page.tsx +++ b/apps/web/app/admin/invites/page.tsx @@ -2,7 +2,7 @@ import type { Metadata } from "next"; import { listInvites } from "@/lib/invites"; import { InvitesManager } from "@/components/admin/invites-manager"; -export const metadata: Metadata = { title: "Invites – Admin" }; +export const metadata: Metadata = {}; export default async function AdminInvitesPage() { const invites = await listInvites(); diff --git a/apps/web/app/admin/page.tsx b/apps/web/app/admin/page.tsx index e90c65f..0dc3147 100644 --- a/apps/web/app/admin/page.tsx +++ b/apps/web/app/admin/page.tsx @@ -5,7 +5,7 @@ import { count, eq, sql } from "@epicure/db"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Users, BookOpen, Sparkles, Image } from "lucide-react"; -export const metadata: Metadata = { title: "Admin Overview" }; +export const metadata: Metadata = {}; export default async function AdminPage() { const currentMonth = new Date().toISOString().slice(0, 7); diff --git a/apps/web/app/admin/recipes/page.tsx b/apps/web/app/admin/recipes/page.tsx index 0d1d767..c3177f2 100644 --- a/apps/web/app/admin/recipes/page.tsx +++ b/apps/web/app/admin/recipes/page.tsx @@ -3,7 +3,7 @@ import { db, recipes, users, eq, desc } from "@epicure/db"; import { Badge } from "@/components/ui/badge"; import Link from "next/link"; -export const metadata: Metadata = { title: "Recipe Moderation" }; +export const metadata: Metadata = {}; const VISIBILITY_COLORS = { public: "default", diff --git a/apps/web/app/admin/reports/page.tsx b/apps/web/app/admin/reports/page.tsx index 4595f58..35f6ada 100644 --- a/apps/web/app/admin/reports/page.tsx +++ b/apps/web/app/admin/reports/page.tsx @@ -2,7 +2,7 @@ import type { Metadata } from "next"; import { db, reports, users, eq, desc } from "@epicure/db"; import { ReportsQueue } from "@/components/admin/reports-queue"; -export const metadata: Metadata = { title: "Reports – Admin" }; +export const metadata: Metadata = {}; export default async function AdminReportsPage() { const rows = await db diff --git a/apps/web/app/admin/settings/page.tsx b/apps/web/app/admin/settings/page.tsx index c63011c..51d6350 100644 --- a/apps/web/app/admin/settings/page.tsx +++ b/apps/web/app/admin/settings/page.tsx @@ -3,7 +3,7 @@ import { getAllSiteSettings, isSignupsDisabled } from "@/lib/site-settings"; import { AdminSettingsForm } from "@/components/admin/admin-settings-form"; import { SignupsToggle } from "@/components/admin/signups-toggle"; -export const metadata: Metadata = { title: "Site Settings – Admin" }; +export const metadata: Metadata = {}; const SETTING_GROUPS = [ { diff --git a/apps/web/app/admin/storage/page.tsx b/apps/web/app/admin/storage/page.tsx index 2711878..fbdbe81 100644 --- a/apps/web/app/admin/storage/page.tsx +++ b/apps/web/app/admin/storage/page.tsx @@ -4,7 +4,7 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { HardDrive } from "lucide-react"; -export const metadata: Metadata = { title: "Storage Usage" }; +export const metadata: Metadata = {}; export default async function AdminStoragePage() { const [totalPhotos, recipesWithPhotos, photosByTier, topUsers] = await Promise.all([ diff --git a/apps/web/app/admin/tiers/page.tsx b/apps/web/app/admin/tiers/page.tsx index 9730401..6c2f9a3 100644 --- a/apps/web/app/admin/tiers/page.tsx +++ b/apps/web/app/admin/tiers/page.tsx @@ -2,7 +2,7 @@ import type { Metadata } from "next"; import { db, tierDefinitions } from "@epicure/db"; import { TierLimitsForm } from "@/components/admin/tier-limits-form"; -export const metadata: Metadata = { title: "Tier Limits – Admin" }; +export const metadata: Metadata = {}; export default async function AdminTiersPage() { const tiers = await db.select().from(tierDefinitions); diff --git a/apps/web/app/admin/users/[id]/page.tsx b/apps/web/app/admin/users/[id]/page.tsx index 3fbf7ed..8c5db20 100644 --- a/apps/web/app/admin/users/[id]/page.tsx +++ b/apps/web/app/admin/users/[id]/page.tsx @@ -10,7 +10,7 @@ import { ResetUsageButton } from "@/components/admin/reset-usage-button"; import Link from "next/link"; import { ArrowLeft } from "lucide-react"; -export const metadata: Metadata = { title: "User Detail" }; +export const metadata: Metadata = {}; interface PageProps { params: Promise<{ id: string }>; diff --git a/apps/web/app/admin/users/page.tsx b/apps/web/app/admin/users/page.tsx index cff8157..3b1afb0 100644 --- a/apps/web/app/admin/users/page.tsx +++ b/apps/web/app/admin/users/page.tsx @@ -7,7 +7,7 @@ import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { CreateUserDialog } from "@/components/admin/create-user-dialog"; import Link from "next/link"; -export const metadata: Metadata = { title: "User Management" }; +export const metadata: Metadata = {}; const ROLE_COLORS = { user: "secondary", diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index fcdb168..20d745c 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -19,7 +19,7 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: { default: "Epicure", template: "%s | Epicure" }, + title: "Epicure", description: "Your personal AI-powered recipe book.", manifest: "/manifest.json", };