diff --git a/frontend/src/app/(authenticated)/settings/page.tsx b/frontend/src/app/(authenticated)/settings/page.tsx
deleted file mode 100644
index a5392e0..0000000
--- a/frontend/src/app/(authenticated)/settings/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * Settings Index Page
- * Redirects to /settings/profile
- */
-
-import { redirect } from 'next/navigation';
-
-export default function SettingsPage() {
- redirect('/settings/profile');
-}
diff --git a/frontend/src/app/(auth)/layout.tsx b/frontend/src/app/[locale]/(auth)/layout.tsx
similarity index 100%
rename from frontend/src/app/(auth)/layout.tsx
rename to frontend/src/app/[locale]/(auth)/layout.tsx
diff --git a/frontend/src/app/(auth)/login/page.tsx b/frontend/src/app/[locale]/(auth)/login/page.tsx
similarity index 100%
rename from frontend/src/app/(auth)/login/page.tsx
rename to frontend/src/app/[locale]/(auth)/login/page.tsx
diff --git a/frontend/src/app/(auth)/password-reset/confirm/PasswordResetConfirmContent.tsx b/frontend/src/app/[locale]/(auth)/password-reset/confirm/PasswordResetConfirmContent.tsx
similarity index 94%
rename from frontend/src/app/(auth)/password-reset/confirm/PasswordResetConfirmContent.tsx
rename to frontend/src/app/[locale]/(auth)/password-reset/confirm/PasswordResetConfirmContent.tsx
index 2aebae7..bf71b3b 100644
--- a/frontend/src/app/(auth)/password-reset/confirm/PasswordResetConfirmContent.tsx
+++ b/frontend/src/app/[locale]/(auth)/password-reset/confirm/PasswordResetConfirmContent.tsx
@@ -5,11 +5,12 @@
'use client';
-import { useSearchParams, useRouter } from 'next/navigation';
+import { useSearchParams } from 'next/navigation';
+import { useRouter } from '@/lib/i18n/routing';
import { useEffect, useRef } from 'react';
import dynamic from 'next/dynamic';
import { Alert } from '@/components/ui/alert';
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
// Code-split PasswordResetConfirmForm (319 lines)
const PasswordResetConfirmForm = dynamic(
diff --git a/frontend/src/app/(auth)/password-reset/confirm/page.tsx b/frontend/src/app/[locale]/(auth)/password-reset/confirm/page.tsx
similarity index 100%
rename from frontend/src/app/(auth)/password-reset/confirm/page.tsx
rename to frontend/src/app/[locale]/(auth)/password-reset/confirm/page.tsx
diff --git a/frontend/src/app/(auth)/password-reset/page.tsx b/frontend/src/app/[locale]/(auth)/password-reset/page.tsx
similarity index 100%
rename from frontend/src/app/(auth)/password-reset/page.tsx
rename to frontend/src/app/[locale]/(auth)/password-reset/page.tsx
diff --git a/frontend/src/app/(auth)/register/page.tsx b/frontend/src/app/[locale]/(auth)/register/page.tsx
similarity index 100%
rename from frontend/src/app/(auth)/register/page.tsx
rename to frontend/src/app/[locale]/(auth)/register/page.tsx
diff --git a/frontend/src/app/(authenticated)/layout.tsx b/frontend/src/app/[locale]/(authenticated)/layout.tsx
similarity index 100%
rename from frontend/src/app/(authenticated)/layout.tsx
rename to frontend/src/app/[locale]/(authenticated)/layout.tsx
diff --git a/frontend/src/app/(authenticated)/settings/layout.tsx b/frontend/src/app/[locale]/(authenticated)/settings/layout.tsx
similarity index 95%
rename from frontend/src/app/(authenticated)/settings/layout.tsx
rename to frontend/src/app/[locale]/(authenticated)/settings/layout.tsx
index dfe65d2..0300f81 100644
--- a/frontend/src/app/(authenticated)/settings/layout.tsx
+++ b/frontend/src/app/[locale]/(authenticated)/settings/layout.tsx
@@ -5,8 +5,8 @@
'use client';
-import { usePathname } from 'next/navigation';
-import Link from 'next/link';
+import { usePathname } from '@/lib/i18n/routing';
+import { Link } from '@/lib/i18n/routing';
import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { User, Lock, Monitor, Settings as SettingsIcon } from 'lucide-react';
diff --git a/frontend/src/app/[locale]/(authenticated)/settings/page.tsx b/frontend/src/app/[locale]/(authenticated)/settings/page.tsx
new file mode 100644
index 0000000..30aef36
--- /dev/null
+++ b/frontend/src/app/[locale]/(authenticated)/settings/page.tsx
@@ -0,0 +1,11 @@
+/**
+ * Settings Index Page
+ * Redirects to /settings/profile
+ */
+
+import { redirect } from 'next/navigation';
+
+export default async function SettingsPage({ params }: { params: Promise<{ locale: string }> }) {
+ const { locale } = await params;
+ redirect(`/${locale}/settings/profile`);
+}
diff --git a/frontend/src/app/(authenticated)/settings/password/page.tsx b/frontend/src/app/[locale]/(authenticated)/settings/password/page.tsx
similarity index 100%
rename from frontend/src/app/(authenticated)/settings/password/page.tsx
rename to frontend/src/app/[locale]/(authenticated)/settings/password/page.tsx
diff --git a/frontend/src/app/(authenticated)/settings/preferences/page.tsx b/frontend/src/app/[locale]/(authenticated)/settings/preferences/page.tsx
similarity index 100%
rename from frontend/src/app/(authenticated)/settings/preferences/page.tsx
rename to frontend/src/app/[locale]/(authenticated)/settings/preferences/page.tsx
diff --git a/frontend/src/app/(authenticated)/settings/profile/page.tsx b/frontend/src/app/[locale]/(authenticated)/settings/profile/page.tsx
similarity index 100%
rename from frontend/src/app/(authenticated)/settings/profile/page.tsx
rename to frontend/src/app/[locale]/(authenticated)/settings/profile/page.tsx
diff --git a/frontend/src/app/(authenticated)/settings/sessions/page.tsx b/frontend/src/app/[locale]/(authenticated)/settings/sessions/page.tsx
similarity index 100%
rename from frontend/src/app/(authenticated)/settings/sessions/page.tsx
rename to frontend/src/app/[locale]/(authenticated)/settings/sessions/page.tsx
diff --git a/frontend/src/app/admin/layout.tsx b/frontend/src/app/[locale]/admin/layout.tsx
similarity index 100%
rename from frontend/src/app/admin/layout.tsx
rename to frontend/src/app/[locale]/admin/layout.tsx
diff --git a/frontend/src/app/admin/organizations/[id]/members/page.tsx b/frontend/src/app/[locale]/admin/organizations/[id]/members/page.tsx
similarity index 96%
rename from frontend/src/app/admin/organizations/[id]/members/page.tsx
rename to frontend/src/app/[locale]/admin/organizations/[id]/members/page.tsx
index c189381..cf46144 100644
--- a/frontend/src/app/admin/organizations/[id]/members/page.tsx
+++ b/frontend/src/app/[locale]/admin/organizations/[id]/members/page.tsx
@@ -6,7 +6,7 @@
/* istanbul ignore next - Next.js type import for metadata */
import type { Metadata } from 'next';
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
import { ArrowLeft } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { OrganizationMembersContent } from '@/components/admin/organizations/OrganizationMembersContent';
diff --git a/frontend/src/app/admin/organizations/page.tsx b/frontend/src/app/[locale]/admin/organizations/page.tsx
similarity index 96%
rename from frontend/src/app/admin/organizations/page.tsx
rename to frontend/src/app/[locale]/admin/organizations/page.tsx
index eaefd8b..422bf14 100644
--- a/frontend/src/app/admin/organizations/page.tsx
+++ b/frontend/src/app/[locale]/admin/organizations/page.tsx
@@ -6,7 +6,7 @@
/* istanbul ignore next - Next.js type import for metadata */
import type { Metadata } from 'next';
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
import { ArrowLeft } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { OrganizationManagementContent } from '@/components/admin/organizations/OrganizationManagementContent';
diff --git a/frontend/src/app/admin/page.tsx b/frontend/src/app/[locale]/admin/page.tsx
similarity index 98%
rename from frontend/src/app/admin/page.tsx
rename to frontend/src/app/[locale]/admin/page.tsx
index 63aafec..95c6952 100644
--- a/frontend/src/app/admin/page.tsx
+++ b/frontend/src/app/[locale]/admin/page.tsx
@@ -6,7 +6,7 @@
/* istanbul ignore next - Next.js type import for metadata */
import type { Metadata } from 'next';
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
import { DashboardStats } from '@/components/admin';
import {
UserGrowthChart,
diff --git a/frontend/src/app/admin/settings/page.tsx b/frontend/src/app/[locale]/admin/settings/page.tsx
similarity index 97%
rename from frontend/src/app/admin/settings/page.tsx
rename to frontend/src/app/[locale]/admin/settings/page.tsx
index 5aa3a32..74bb903 100644
--- a/frontend/src/app/admin/settings/page.tsx
+++ b/frontend/src/app/[locale]/admin/settings/page.tsx
@@ -6,7 +6,7 @@
/* istanbul ignore next - Next.js type import for metadata */
import type { Metadata } from 'next';
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
import { ArrowLeft } from 'lucide-react';
import { Button } from '@/components/ui/button';
diff --git a/frontend/src/app/admin/users/page.tsx b/frontend/src/app/[locale]/admin/users/page.tsx
similarity index 96%
rename from frontend/src/app/admin/users/page.tsx
rename to frontend/src/app/[locale]/admin/users/page.tsx
index aed5f45..968e919 100644
--- a/frontend/src/app/admin/users/page.tsx
+++ b/frontend/src/app/[locale]/admin/users/page.tsx
@@ -6,7 +6,7 @@
/* istanbul ignore next - Next.js type import for metadata */
import type { Metadata } from 'next';
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
import { ArrowLeft } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { UserManagementContent } from '@/components/admin/users/UserManagementContent';
diff --git a/frontend/src/app/demos/page.tsx b/frontend/src/app/[locale]/demos/page.tsx
similarity index 99%
rename from frontend/src/app/demos/page.tsx
rename to frontend/src/app/[locale]/demos/page.tsx
index fb7760b..e21da2e 100644
--- a/frontend/src/app/demos/page.tsx
+++ b/frontend/src/app/[locale]/demos/page.tsx
@@ -4,7 +4,7 @@
*/
import type { Metadata } from 'next';
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
import {
Palette,
ShieldCheck,
diff --git a/frontend/src/app/dev/components/page.tsx b/frontend/src/app/[locale]/dev/components/page.tsx
similarity index 100%
rename from frontend/src/app/dev/components/page.tsx
rename to frontend/src/app/[locale]/dev/components/page.tsx
diff --git a/frontend/src/app/dev/docs/design-system/[...slug]/page.tsx b/frontend/src/app/[locale]/dev/docs/design-system/[...slug]/page.tsx
similarity index 100%
rename from frontend/src/app/dev/docs/design-system/[...slug]/page.tsx
rename to frontend/src/app/[locale]/dev/docs/design-system/[...slug]/page.tsx
diff --git a/frontend/src/app/dev/docs/page.tsx b/frontend/src/app/[locale]/dev/docs/page.tsx
similarity index 99%
rename from frontend/src/app/dev/docs/page.tsx
rename to frontend/src/app/[locale]/dev/docs/page.tsx
index f783121..b1f324f 100644
--- a/frontend/src/app/dev/docs/page.tsx
+++ b/frontend/src/app/[locale]/dev/docs/page.tsx
@@ -4,7 +4,7 @@
* Access: /dev/docs
*/
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
import {
BookOpen,
Sparkles,
diff --git a/frontend/src/app/dev/forms/page.tsx b/frontend/src/app/[locale]/dev/forms/page.tsx
similarity index 99%
rename from frontend/src/app/dev/forms/page.tsx
rename to frontend/src/app/[locale]/dev/forms/page.tsx
index 869d2a2..f4a40ce 100644
--- a/frontend/src/app/dev/forms/page.tsx
+++ b/frontend/src/app/[locale]/dev/forms/page.tsx
@@ -7,7 +7,7 @@
'use client';
import { useState } from 'react';
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';
diff --git a/frontend/src/app/dev/layout.tsx b/frontend/src/app/[locale]/dev/layout.tsx
similarity index 100%
rename from frontend/src/app/dev/layout.tsx
rename to frontend/src/app/[locale]/dev/layout.tsx
diff --git a/frontend/src/app/dev/layouts/page.tsx b/frontend/src/app/[locale]/dev/layouts/page.tsx
similarity index 99%
rename from frontend/src/app/dev/layouts/page.tsx
rename to frontend/src/app/[locale]/dev/layouts/page.tsx
index c697a4f..6f13295 100644
--- a/frontend/src/app/dev/layouts/page.tsx
+++ b/frontend/src/app/[locale]/dev/layouts/page.tsx
@@ -5,7 +5,7 @@
*/
import type { Metadata } from 'next';
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
import { Grid3x3 } from 'lucide-react';
import { DevBreadcrumbs } from '@/components/dev/DevBreadcrumbs';
import { Button } from '@/components/ui/button';
diff --git a/frontend/src/app/dev/page.tsx b/frontend/src/app/[locale]/dev/page.tsx
similarity index 99%
rename from frontend/src/app/dev/page.tsx
rename to frontend/src/app/[locale]/dev/page.tsx
index 7224472..df0155b 100644
--- a/frontend/src/app/dev/page.tsx
+++ b/frontend/src/app/[locale]/dev/page.tsx
@@ -5,7 +5,7 @@
*/
import type { Metadata } from 'next';
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
import { Palette, Layout, Ruler, FileText, BookOpen, ArrowRight, Sparkles } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card';
diff --git a/frontend/src/app/dev/spacing/page.tsx b/frontend/src/app/[locale]/dev/spacing/page.tsx
similarity index 99%
rename from frontend/src/app/dev/spacing/page.tsx
rename to frontend/src/app/[locale]/dev/spacing/page.tsx
index af4cc07..9e00b9c 100644
--- a/frontend/src/app/dev/spacing/page.tsx
+++ b/frontend/src/app/[locale]/dev/spacing/page.tsx
@@ -6,7 +6,7 @@
import type { Metadata } from 'next';
import dynamic from 'next/dynamic';
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
import { Ruler } from 'lucide-react';
import { DevBreadcrumbs } from '@/components/dev/DevBreadcrumbs';
import { Button } from '@/components/ui/button';
diff --git a/frontend/src/app/forbidden/page.tsx b/frontend/src/app/[locale]/forbidden/page.tsx
similarity index 97%
rename from frontend/src/app/forbidden/page.tsx
rename to frontend/src/app/[locale]/forbidden/page.tsx
index bcbb208..c9899fc 100644
--- a/frontend/src/app/forbidden/page.tsx
+++ b/frontend/src/app/[locale]/forbidden/page.tsx
@@ -5,7 +5,7 @@
/* istanbul ignore next - Next.js type import for metadata */
import type { Metadata } from 'next';
-import Link from 'next/link';
+import { Link } from '@/lib/i18n/routing';
import { ShieldAlert } from 'lucide-react';
import { Button } from '@/components/ui/button';
diff --git a/frontend/src/app/[locale]/layout.tsx b/frontend/src/app/[locale]/layout.tsx
new file mode 100644
index 0000000..98c98d2
--- /dev/null
+++ b/frontend/src/app/[locale]/layout.tsx
@@ -0,0 +1,88 @@
+import type { Metadata } from 'next';
+import { Geist, Geist_Mono } from 'next/font/google';
+import { notFound } from 'next/navigation';
+import { routing } from '@/lib/i18n/routing';
+import { NextIntlClientProvider } from 'next-intl';
+import { getMessages } from 'next-intl/server';
+import '../globals.css';
+import { Providers } from '../providers';
+import { AuthProvider } from '@/lib/auth/AuthContext';
+import { AuthInitializer } from '@/components/auth';
+
+const geistSans = Geist({
+ variable: '--font-geist-sans',
+ subsets: ['latin'],
+ display: 'swap', // Prevent font from blocking render
+ preload: true,
+});
+
+const geistMono = Geist_Mono({
+ variable: '--font-geist-mono',
+ subsets: ['latin'],
+ display: 'swap', // Prevent font from blocking render
+ preload: false, // Only preload primary font
+});
+
+export const metadata: Metadata = {
+ title: 'FastNext Template',
+ description: 'FastAPI + Next.js Template',
+};
+
+export default async function LocaleLayout({
+ children,
+ params,
+}: Readonly<{
+ children: React.ReactNode;
+ params: Promise<{ locale: string }>;
+}>) {
+ // Await params in Next.js 15
+ const { locale } = await params;
+
+ // Ensure that the incoming `locale` is valid
+ if (!routing.locales.includes(locale as 'en' | 'it')) {
+ notFound();
+ }
+
+ // Providing all messages to the client
+ // side is the easiest way to get started
+ const messages = await getMessages();
+
+ return (
+
+
+ {/* Theme initialization script - runs before React hydrates to prevent FOUC */}
+
+
+
+
+
+
+ {children}
+
+
+
+
+ );
+}
diff --git a/frontend/src/app/[locale]/page.tsx b/frontend/src/app/[locale]/page.tsx
new file mode 100755
index 0000000..9d0749a
--- /dev/null
+++ b/frontend/src/app/[locale]/page.tsx
@@ -0,0 +1,99 @@
+/**
+ * Homepage / Landing Page
+ * Main landing page for the FastNext Template project
+ * Showcases features, tech stack, and provides demos for developers
+ */
+
+'use client';
+
+import { useState } from 'react';
+import { Link } from '@/lib/i18n/routing';
+import { Header } from '@/components/home/Header';
+import { HeroSection } from '@/components/home/HeroSection';
+import { ContextSection } from '@/components/home/ContextSection';
+import { AnimatedTerminal } from '@/components/home/AnimatedTerminal';
+import { FeatureGrid } from '@/components/home/FeatureGrid';
+import { DemoSection } from '@/components/home/DemoSection';
+import { StatsSection } from '@/components/home/StatsSection';
+import { TechStackSection } from '@/components/home/TechStackSection';
+import { PhilosophySection } from '@/components/home/PhilosophySection';
+import { QuickStartCode } from '@/components/home/QuickStartCode';
+import { CTASection } from '@/components/home/CTASection';
+import { DemoCredentialsModal } from '@/components/home/DemoCredentialsModal';
+
+export default function Home() {
+ const [demoModalOpen, setDemoModalOpen] = useState(false);
+
+ return (
+