diff --git a/e2e/react-router/i18n-paraglide/.gitignore b/e2e/react-router/i18n-paraglide/.gitignore
new file mode 100644
index 0000000000..633517e72c
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/.gitignore
@@ -0,0 +1,7 @@
+node_modules
+dist
+src/routeTree.gen.ts
+src/paraglide
+*.local
+port*.txt
+test-results
diff --git a/e2e/react-router/i18n-paraglide/index.html b/e2e/react-router/i18n-paraglide/index.html
new file mode 100644
index 0000000000..3292330d0b
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/index.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <link rel="icon" href="/favicon.ico" />
+    <meta name="theme-color" content="#000000" />
+    <meta
+      name="description"
+      content="TanStack Router i18n-paraglide e2e test"
+    />
+    <title>TanStack Router i18n-paraglide e2e</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <script type="module" src="/src/main.tsx"></script>
+  </body>
+</html>
diff --git a/e2e/react-router/i18n-paraglide/messages/de.json b/e2e/react-router/i18n-paraglide/messages/de.json
new file mode 100644
index 0000000000..11498bd8b6
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/messages/de.json
@@ -0,0 +1,7 @@
+{
+  "$schema": "https://inlang.com/schema/inlang-message-format",
+  "example_message": "Guten Tag {username}",
+  "hello_about": "Hallo /ueber!",
+  "home_page": "Startseite",
+  "about_page": "Über uns"
+}
diff --git a/e2e/react-router/i18n-paraglide/messages/en.json b/e2e/react-router/i18n-paraglide/messages/en.json
new file mode 100644
index 0000000000..8a85ed03fc
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/messages/en.json
@@ -0,0 +1,7 @@
+{
+  "$schema": "https://inlang.com/schema/inlang-message-format",
+  "example_message": "Hello world {username}",
+  "hello_about": "Hello /about!",
+  "home_page": "Home page",
+  "about_page": "About page"
+}
diff --git a/e2e/react-router/i18n-paraglide/package.json b/e2e/react-router/i18n-paraglide/package.json
new file mode 100644
index 0000000000..58dc5a1689
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/package.json
@@ -0,0 +1,32 @@
+{
+  "name": "tanstack-router-e2e-react-i18n-paraglide",
+  "private": true,
+  "type": "module",
+  "scripts": {
+    "dev": "vite --port 3000",
+    "dev:e2e": "vite",
+    "build": "vite build && tsc --noEmit",
+    "preview": "vite preview",
+    "start": "vite",
+    "test:e2e": "rm -rf port*.txt; playwright test --project=chromium"
+  },
+  "dependencies": {
+    "@tailwindcss/vite": "^4.1.18",
+    "@tanstack/react-router": "workspace:^",
+    "react": "^19.0.0",
+    "react-dom": "^19.0.0",
+    "tailwindcss": "^4.1.18"
+  },
+  "devDependencies": {
+    "@inlang/paraglide-js": "^2.4.0",
+    "@playwright/test": "^1.50.1",
+    "@tanstack/router-e2e-utils": "workspace:^",
+    "@tanstack/router-plugin": "workspace:^",
+    "@types/node": "^22.10.2",
+    "@types/react": "^19.0.8",
+    "@types/react-dom": "^19.0.3",
+    "@vitejs/plugin-react": "^4.3.4",
+    "typescript": "^5.7.2",
+    "vite": "^7.1.7"
+  }
+}
diff --git a/e2e/react-router/i18n-paraglide/playwright.config.ts b/e2e/react-router/i18n-paraglide/playwright.config.ts
new file mode 100644
index 0000000000..91ef8fbd9f
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/playwright.config.ts
@@ -0,0 +1,35 @@
+import { defineConfig, devices } from '@playwright/test'
+import { getTestServerPort } from '@tanstack/router-e2e-utils'
+import packageJson from './package.json' with { type: 'json' }
+
+const PORT = await getTestServerPort(packageJson.name)
+const baseURL = `http://localhost:${PORT}`
+
+/**
+ * See https://playwright.dev/docs/test-configuration.
+ */
+export default defineConfig({
+  testDir: './tests',
+  workers: 1,
+
+  reporter: [['line']],
+
+  use: {
+    /* Base URL to use in actions like `await page.goto('/')`. */
+    baseURL,
+  },
+
+  webServer: {
+    command: `VITE_SERVER_PORT=${PORT} pnpm build && pnpm preview --port ${PORT}`,
+    url: baseURL,
+    reuseExistingServer: !process.env.CI,
+    stdout: 'pipe',
+  },
+
+  projects: [
+    {
+      name: 'chromium',
+      use: { ...devices['Desktop Chrome'] },
+    },
+  ],
+})
diff --git a/e2e/react-router/i18n-paraglide/project.inlang/.gitignore b/e2e/react-router/i18n-paraglide/project.inlang/.gitignore
new file mode 100644
index 0000000000..06cf65390f
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/project.inlang/.gitignore
@@ -0,0 +1 @@
+cache
diff --git a/e2e/react-router/i18n-paraglide/project.inlang/project_id b/e2e/react-router/i18n-paraglide/project.inlang/project_id
new file mode 100644
index 0000000000..203a95649e
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/project.inlang/project_id
@@ -0,0 +1 @@
+apLjNFHNH2yAHYTN5d
\ No newline at end of file
diff --git a/e2e/react-router/i18n-paraglide/project.inlang/settings.json b/e2e/react-router/i18n-paraglide/project.inlang/settings.json
new file mode 100644
index 0000000000..9bdce4c8cc
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/project.inlang/settings.json
@@ -0,0 +1,12 @@
+{
+  "$schema": "https://inlang.com/schema/project-settings",
+  "baseLocale": "en",
+  "locales": ["en", "de"],
+  "modules": [
+    "https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js",
+    "https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js"
+  ],
+  "plugin.inlang.messageFormat": {
+    "pathPattern": "./messages/{locale}.json"
+  }
+}
diff --git a/e2e/react-router/i18n-paraglide/src/main.tsx b/e2e/react-router/i18n-paraglide/src/main.tsx
new file mode 100644
index 0000000000..b30558a947
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/src/main.tsx
@@ -0,0 +1,40 @@
+import { StrictMode } from 'react'
+import ReactDOM from 'react-dom/client'
+import { RouterProvider, createRouter } from '@tanstack/react-router'
+import './styles.css'
+// Import the generated route tree
+import { routeTree } from './routeTree.gen'
+import { deLocalizeUrl, localizeUrl } from './paraglide/runtime.js'
+
+// Create a new router instance
+const router = createRouter({
+  routeTree,
+  context: {},
+  defaultPreload: 'intent',
+  scrollRestoration: true,
+  defaultStructuralSharing: true,
+  defaultPreloadStaleTime: 0,
+
+  rewrite: {
+    input: ({ url }) => deLocalizeUrl(url),
+    output: ({ url }) => localizeUrl(url),
+  },
+})
+
+// Register the router instance for type safety
+declare module '@tanstack/react-router' {
+  interface Register {
+    router: typeof router
+  }
+}
+
+// Render the app
+const rootElement = document.getElementById('app')
+if (rootElement && !rootElement.innerHTML) {
+  const root = ReactDOM.createRoot(rootElement)
+  root.render(
+    <StrictMode>
+      <RouterProvider router={router} />
+    </StrictMode>,
+  )
+}
diff --git a/e2e/react-router/i18n-paraglide/src/routes/__root.tsx b/e2e/react-router/i18n-paraglide/src/routes/__root.tsx
new file mode 100644
index 0000000000..6f50edef00
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/src/routes/__root.tsx
@@ -0,0 +1,68 @@
+import { Link, Outlet, createRootRoute, redirect } from '@tanstack/react-router'
+import {
+  getLocale,
+  locales,
+  setLocale,
+  shouldRedirect,
+} from '@/paraglide/runtime'
+import { m } from '@/paraglide/messages'
+
+export const Route = createRootRoute({
+  beforeLoad: async () => {
+    document.documentElement.setAttribute('lang', getLocale())
+
+    const decision = await shouldRedirect({ url: window.location.href })
+
+    if (decision.redirectUrl) {
+      throw redirect({ href: decision.redirectUrl.href })
+    }
+  },
+  component: () => (
+    <>
+      <div className="p-2 flex gap-2 text-lg justify-between">
+        <div className="flex gap-2 text-lg">
+          <Link
+            to="/"
+            activeProps={{
+              className: 'font-bold',
+            }}
+            activeOptions={{ exact: true }}
+            data-testid="home-link"
+          >
+            {m.home_page()}
+          </Link>
+
+          <Link
+            to="/about"
+            activeProps={{
+              className: 'font-bold',
+            }}
+            data-testid="about-link"
+          >
+            {m.about_page()}
+          </Link>
+        </div>
+
+        <div className="flex gap-2 text-lg">
+          {locales.map((locale) => (
+            <button
+              key={locale}
+              onClick={() => setLocale(locale)}
+              data-active-locale={locale === getLocale()}
+              data-testid={`locale-${locale}`}
+              className="rounded p-1 px-2 border border-gray-300 cursor-pointer [&[data-active-locale=true]]:bg-gray-500 [&[data-active-locale=true]]:text-white"
+            >
+              {locale}
+            </button>
+          ))}
+        </div>
+      </div>
+
+      <hr />
+
+      <div className="p-2">
+        <Outlet />
+      </div>
+    </>
+  ),
+})
diff --git a/e2e/react-router/i18n-paraglide/src/routes/about.tsx b/e2e/react-router/i18n-paraglide/src/routes/about.tsx
new file mode 100644
index 0000000000..93cfdb3bd7
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/src/routes/about.tsx
@@ -0,0 +1,10 @@
+import { m } from '@/paraglide/messages'
+import { createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/about')({
+  component: RouteComponent,
+})
+
+function RouteComponent() {
+  return <div data-testid="about-content">{m.hello_about()}</div>
+}
diff --git a/e2e/react-router/i18n-paraglide/src/routes/index.tsx b/e2e/react-router/i18n-paraglide/src/routes/index.tsx
new file mode 100644
index 0000000000..accd04a1a1
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/src/routes/index.tsx
@@ -0,0 +1,18 @@
+import { createFileRoute } from '@tanstack/react-router'
+import { m } from '@/paraglide/messages'
+
+export const Route = createFileRoute('/')({
+  component: App,
+})
+
+function App() {
+  return (
+    <div data-testid="home-content">
+      <p>
+        {m.example_message({
+          username: 'TanStack Router!',
+        })}
+      </p>
+    </div>
+  )
+}
diff --git a/e2e/react-router/i18n-paraglide/src/styles.css b/e2e/react-router/i18n-paraglide/src/styles.css
new file mode 100644
index 0000000000..d4b5078586
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/src/styles.css
@@ -0,0 +1 @@
+@import 'tailwindcss';
diff --git a/e2e/react-router/i18n-paraglide/tests/navigation.spec.ts b/e2e/react-router/i18n-paraglide/tests/navigation.spec.ts
new file mode 100644
index 0000000000..8ec0d82292
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/tests/navigation.spec.ts
@@ -0,0 +1,246 @@
+import { expect, test } from '@playwright/test'
+
+// These tests verify that client-side i18n rewrites work correctly in a pure SPA
+// (no server-side rendering). The router uses the rewrite API to:
+// - input: de-localize URLs for route matching (e.g., /de/ueber -> /about)
+// - output: localize URLs for display (e.g., /about -> /de/ueber)
+
+test.describe('Client-side i18n navigation', () => {
+  test('should load the home page without redirect loops', async ({ page }) => {
+    // Navigate to root - should work without any redirect loop issues
+    await page.goto('/')
+    await page.waitForLoadState('networkidle')
+
+    // Verify the page loaded successfully
+    await expect(page.getByTestId('home-content')).toBeVisible()
+    await expect(page.getByTestId('home-content')).toContainText('Hello world')
+  })
+
+  test('should load the German home page (/de)', async ({ page }) => {
+    await page.goto('/de')
+    await page.waitForLoadState('networkidle')
+
+    // Verify we're on the German page
+    await expect(page.getByTestId('home-content')).toBeVisible()
+    await expect(page.getByTestId('home-content')).toContainText('Guten Tag')
+
+    // URL should remain /de
+    expect(page.url()).toContain('/de')
+  })
+
+  test('should navigate to about page and update URL correctly', async ({
+    page,
+  }) => {
+    await page.goto('/')
+    await page.waitForLoadState('networkidle')
+
+    // Click on about link
+    await page.getByTestId('about-link').click()
+    await page.waitForLoadState('networkidle')
+
+    // Verify we're on the about page
+    await expect(page.getByTestId('about-content')).toBeVisible()
+    await expect(page.getByTestId('about-content')).toContainText(
+      'Hello /about!',
+    )
+
+    // URL should be /about (English)
+    expect(page.url()).toContain('/about')
+  })
+
+  test('should navigate to German about page with translated URL', async ({
+    page,
+  }) => {
+    await page.goto('/de')
+    await page.waitForLoadState('networkidle')
+
+    // Click on about link (should navigate to /de/ueber)
+    await page.getByTestId('about-link').click()
+    await page.waitForLoadState('networkidle')
+
+    // Verify we're on the about page with German content
+    await expect(page.getByTestId('about-content')).toBeVisible()
+    await expect(page.getByTestId('about-content')).toContainText(
+      'Hallo /ueber!',
+    )
+
+    // URL should be /de/ueber (German translated path)
+    expect(page.url()).toContain('/de/ueber')
+  })
+
+  test('should directly access German about page (/de/ueber)', async ({
+    page,
+  }) => {
+    // Direct navigation to translated URL
+    await page.goto('/de/ueber')
+    await page.waitForLoadState('networkidle')
+
+    // Verify the page loaded correctly
+    await expect(page.getByTestId('about-content')).toBeVisible()
+    await expect(page.getByTestId('about-content')).toContainText(
+      'Hallo /ueber!',
+    )
+
+    // URL should stay /de/ueber
+    expect(page.url()).toContain('/de/ueber')
+  })
+
+  test('should switch locale and update URLs accordingly', async ({ page }) => {
+    // Start at English home page
+    await page.goto('/')
+    await page.waitForLoadState('networkidle')
+
+    // Verify English content
+    await expect(page.getByTestId('home-content')).toContainText('Hello world')
+
+    // Switch to German
+    await page.getByTestId('locale-de').click()
+    await page.waitForLoadState('networkidle')
+
+    // Verify German content
+    await expect(page.getByTestId('home-content')).toContainText('Guten Tag')
+
+    // URL should now include /de
+    expect(page.url()).toContain('/de')
+  })
+
+  test('should switch locale on about page and update translated URL', async ({
+    page,
+  }) => {
+    // Start at English about page
+    await page.goto('/about')
+    await page.waitForLoadState('networkidle')
+
+    // Verify English content
+    await expect(page.getByTestId('about-content')).toContainText(
+      'Hello /about!',
+    )
+
+    // Switch to German
+    await page.getByTestId('locale-de').click()
+    await page.waitForLoadState('networkidle')
+
+    // Verify German content
+    await expect(page.getByTestId('about-content')).toContainText(
+      'Hallo /ueber!',
+    )
+
+    // URL should now be /de/ueber (translated path)
+    expect(page.url()).toContain('/de/ueber')
+  })
+
+  test('should maintain correct links after locale switch', async ({
+    page,
+  }) => {
+    // Start at German home page
+    await page.goto('/de')
+    await page.waitForLoadState('networkidle')
+
+    // Verify about link has German translated href
+    const aboutLink = page.getByTestId('about-link')
+    await expect(aboutLink).toHaveAttribute('href', '/de/ueber')
+
+    // Switch to English
+    await page.getByTestId('locale-en').click()
+    await page.waitForLoadState('networkidle')
+
+    // Verify about link now has English href
+    await expect(aboutLink).toHaveAttribute('href', '/about')
+  })
+})
+
+test.describe('Client-side navigation without redirect loops', () => {
+  test('navigating back and forth should not cause issues', async ({
+    page,
+  }) => {
+    await page.goto('/')
+    await page.waitForLoadState('networkidle')
+
+    // Navigate to about
+    await page.getByTestId('about-link').click()
+    await page.waitForLoadState('networkidle')
+    await expect(page.getByTestId('about-content')).toBeVisible()
+
+    // Navigate back to home
+    await page.getByTestId('home-link').click()
+    await page.waitForLoadState('networkidle')
+    await expect(page.getByTestId('home-content')).toBeVisible()
+
+    // Navigate to about again
+    await page.getByTestId('about-link').click()
+    await page.waitForLoadState('networkidle')
+    await expect(page.getByTestId('about-content')).toBeVisible()
+  })
+
+  test('switching locales multiple times should work correctly', async ({
+    page,
+  }) => {
+    await page.goto('/')
+    await page.waitForLoadState('networkidle')
+
+    // Switch to German
+    await page.getByTestId('locale-de').click()
+    await page.waitForLoadState('networkidle')
+    await expect(page.getByTestId('home-content')).toContainText('Guten Tag')
+
+    // Switch back to English
+    await page.getByTestId('locale-en').click()
+    await page.waitForLoadState('networkidle')
+    await expect(page.getByTestId('home-content')).toContainText('Hello world')
+
+    // Switch to German again
+    await page.getByTestId('locale-de').click()
+    await page.waitForLoadState('networkidle')
+    await expect(page.getByTestId('home-content')).toContainText('Guten Tag')
+  })
+
+  test('browser back/forward should work with locale changes', async ({
+    page,
+  }) => {
+    await page.goto('/')
+    await page.waitForLoadState('networkidle')
+
+    // Navigate to about
+    await page.getByTestId('about-link').click()
+    await page.waitForLoadState('networkidle')
+
+    // Switch to German
+    await page.getByTestId('locale-de').click()
+    await page.waitForLoadState('networkidle')
+    expect(page.url()).toContain('/de/ueber')
+
+    // Go back
+    await page.goBack()
+    await page.waitForLoadState('networkidle')
+
+    // Should be on about page (English or previous state)
+    await expect(page.getByTestId('about-content')).toBeVisible()
+  })
+})
+
+test.describe('URL rewrite consistency', () => {
+  test('internal navigation should use rewritten URLs in links', async ({
+    page,
+  }) => {
+    await page.goto('/de')
+    await page.waitForLoadState('networkidle')
+
+    // Check that links are properly localized
+    const homeLink = page.getByTestId('home-link')
+    const aboutLink = page.getByTestId('about-link')
+
+    await expect(homeLink).toHaveAttribute('href', '/de')
+    await expect(aboutLink).toHaveAttribute('href', '/de/ueber')
+  })
+
+  test('English links should not have locale prefix', async ({ page }) => {
+    await page.goto('/')
+    await page.waitForLoadState('networkidle')
+
+    const homeLink = page.getByTestId('home-link')
+    const aboutLink = page.getByTestId('about-link')
+
+    await expect(homeLink).toHaveAttribute('href', '/')
+    await expect(aboutLink).toHaveAttribute('href', '/about')
+  })
+})
diff --git a/e2e/react-router/i18n-paraglide/tsconfig.json b/e2e/react-router/i18n-paraglide/tsconfig.json
new file mode 100644
index 0000000000..c478245689
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/tsconfig.json
@@ -0,0 +1,19 @@
+{
+  "compilerOptions": {
+    "strict": true,
+    "noImplicitAny": false,
+    "esModuleInterop": true,
+    "jsx": "react-jsx",
+    "target": "ESNext",
+    "moduleResolution": "Bundler",
+    "module": "ESNext",
+    "resolveJsonModule": true,
+    "allowSyntheticDefaultImports": true,
+    "skipLibCheck": true,
+    "allowJs": true,
+    "paths": {
+      "@/*": ["./src/*"]
+    }
+  },
+  "include": ["src", "tests"]
+}
diff --git a/e2e/react-router/i18n-paraglide/vite.config.ts b/e2e/react-router/i18n-paraglide/vite.config.ts
new file mode 100644
index 0000000000..97e9dda7bc
--- /dev/null
+++ b/e2e/react-router/i18n-paraglide/vite.config.ts
@@ -0,0 +1,49 @@
+import { defineConfig } from 'vite'
+import viteReact from '@vitejs/plugin-react'
+import { tanstackRouter } from '@tanstack/router-plugin/vite'
+import { resolve } from 'node:path'
+import { paraglideVitePlugin } from '@inlang/paraglide-js'
+import tailwindcss from '@tailwindcss/vite'
+
+export default defineConfig({
+  plugins: [
+    tailwindcss(),
+    paraglideVitePlugin({
+      project: './project.inlang',
+      outdir: './src/paraglide',
+      outputStructure: 'message-modules',
+      cookieName: 'PARAGLIDE_LOCALE',
+      strategy: ['url', 'cookie', 'preferredLanguage', 'baseLocale'],
+      urlPatterns: [
+        {
+          pattern: '/',
+          localized: [
+            ['en', '/'],
+            ['de', '/de'],
+          ],
+        },
+        {
+          pattern: '/about',
+          localized: [
+            ['en', '/about'],
+            ['de', '/de/ueber'],
+          ],
+        },
+        {
+          pattern: '/:path(.*)?',
+          localized: [
+            ['en', '/:path(.*)?'],
+            ['de', '/de/:path(.*)?'],
+          ],
+        },
+      ],
+    }),
+    tanstackRouter({ autoCodeSplitting: true }),
+    viteReact(),
+  ],
+  resolve: {
+    alias: {
+      '@': resolve(__dirname, './src'),
+    },
+  },
+})
diff --git a/e2e/react-start/custom-basepath/tests/navigation.spec.ts b/e2e/react-start/custom-basepath/tests/navigation.spec.ts
index e66f14be9e..e238134d2e 100644
--- a/e2e/react-start/custom-basepath/tests/navigation.spec.ts
+++ b/e2e/react-start/custom-basepath/tests/navigation.spec.ts
@@ -61,14 +61,15 @@ test('server-side redirect', async ({ page, baseURL }) => {
   expect(page.url()).toBe(`${baseURL}/posts/1`)
 
   // do not follow redirects since we want to test the Location header
-  // first go to the route WITHOUT the base path, this will just add the base path
+  // Both requests (with or without basepath) should redirect directly to the final destination.
+  // The router is smart enough to skip the intermediate "add basepath" redirect and go
+  // straight to where the route's beforeLoad redirect points to.
   await page.request
     .get('/redirect/throw-it', { maxRedirects: 0 })
     .then((res) => {
       const headers = new Headers(res.headers())
-      expect(headers.get('location')).toBe('/custom/basepath/redirect/throw-it')
+      expect(headers.get('location')).toBe('/custom/basepath/posts/1')
     })
-  // now go to the route WITH the base path, this will redirect to the final destination
   await page.request
     .get('/custom/basepath/redirect/throw-it', { maxRedirects: 0 })
     .then((res) => {
diff --git a/e2e/react-start/i18n-paraglide/.gitignore b/e2e/react-start/i18n-paraglide/.gitignore
new file mode 100644
index 0000000000..eb0412b5f5
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/.gitignore
@@ -0,0 +1,10 @@
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+count.txt
+.env
+.nitro
+.tanstack
+.output
diff --git a/e2e/react-start/i18n-paraglide/.prettierignore b/e2e/react-start/i18n-paraglide/.prettierignore
new file mode 100644
index 0000000000..2be5eaa6ec
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/.prettierignore
@@ -0,0 +1,4 @@
+**/build
+**/public
+pnpm-lock.yaml
+routeTree.gen.ts
\ No newline at end of file
diff --git a/e2e/react-start/i18n-paraglide/.vscode/extensions.json b/e2e/react-start/i18n-paraglide/.vscode/extensions.json
new file mode 100644
index 0000000000..8cf06c2f61
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+  "recommendations": ["inlang.vs-code-extension"]
+}
diff --git a/e2e/react-start/i18n-paraglide/.vscode/settings.json b/e2e/react-start/i18n-paraglide/.vscode/settings.json
new file mode 100644
index 0000000000..00b5278e58
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/.vscode/settings.json
@@ -0,0 +1,11 @@
+{
+  "files.watcherExclude": {
+    "**/routeTree.gen.ts": true
+  },
+  "search.exclude": {
+    "**/routeTree.gen.ts": true
+  },
+  "files.readonlyInclude": {
+    "**/routeTree.gen.ts": true
+  }
+}
diff --git a/e2e/react-start/i18n-paraglide/messages/de.json b/e2e/react-start/i18n-paraglide/messages/de.json
new file mode 100644
index 0000000000..2c2167c3ca
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/messages/de.json
@@ -0,0 +1,8 @@
+{
+  "$schema": "https://inlang.com/schema/inlang-message-format",
+  "example_message": "Guten Tag {username}",
+  "server_message": "Server Nachricht {emoji}",
+  "about_message": "Über uns",
+  "home_page": "Startseite",
+  "about_page": "Über uns"
+}
diff --git a/e2e/react-start/i18n-paraglide/messages/en.json b/e2e/react-start/i18n-paraglide/messages/en.json
new file mode 100644
index 0000000000..204789de75
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/messages/en.json
@@ -0,0 +1,8 @@
+{
+  "$schema": "https://inlang.com/schema/inlang-message-format",
+  "example_message": "Hello world {username}",
+  "server_message": "Server message {emoji}",
+  "about_message": "About message",
+  "home_page": "Home page",
+  "about_page": "About page"
+}
diff --git a/e2e/react-start/i18n-paraglide/package.json b/e2e/react-start/i18n-paraglide/package.json
new file mode 100644
index 0000000000..8124319abc
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/package.json
@@ -0,0 +1,34 @@
+{
+  "name": "tanstack-react-start-e2e-i18n-paraglide",
+  "private": true,
+  "sideEffects": false,
+  "type": "module",
+  "scripts": {
+    "dev": "vite dev --port 3000",
+    "start": "pnpx srvx --prod -s ../client dist/server/server.js",
+    "build": "vite build && tsc --noEmit",
+    "preview": "vite preview",
+    "test:e2e": "rm -rf port*.txt; playwright test --project=chromium"
+  },
+  "dependencies": {
+    "@tanstack/react-router": "workspace:^",
+    "@tanstack/react-router-devtools": "workspace:^",
+    "@tanstack/react-start": "workspace:^",
+    "react": "^19.0.0",
+    "react-dom": "^19.0.0"
+  },
+  "devDependencies": {
+    "@inlang/paraglide-js": "^2.4.0",
+    "@playwright/test": "^1.50.1",
+    "@tailwindcss/vite": "^4.1.18",
+    "@tanstack/router-e2e-utils": "workspace:^",
+    "@types/node": "^22.10.2",
+    "@types/react": "^19.0.8",
+    "@types/react-dom": "^19.0.3",
+    "@vitejs/plugin-react": "^4.3.4",
+    "tailwindcss": "^4.1.18",
+    "typescript": "^5.7.2",
+    "vite": "^7.1.7",
+    "vite-tsconfig-paths": "^5.1.4"
+  }
+}
diff --git a/e2e/react-start/i18n-paraglide/playwright.config.ts b/e2e/react-start/i18n-paraglide/playwright.config.ts
new file mode 100644
index 0000000000..38690f09d8
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/playwright.config.ts
@@ -0,0 +1,35 @@
+import { defineConfig, devices } from '@playwright/test'
+import { getTestServerPort } from '@tanstack/router-e2e-utils'
+import packageJson from './package.json' with { type: 'json' }
+
+const PORT = await getTestServerPort(packageJson.name)
+const baseURL = `http://localhost:${PORT}`
+
+/**
+ * See https://playwright.dev/docs/test-configuration.
+ */
+export default defineConfig({
+  testDir: './tests',
+  workers: 1,
+
+  reporter: [['line']],
+
+  use: {
+    /* Base URL to use in actions like `await page.goto('/')`. */
+    baseURL,
+  },
+
+  webServer: {
+    command: `VITE_SERVER_PORT=${PORT} PORT=${PORT} pnpm build && VITE_SERVER_PORT=${PORT} PORT=${PORT} pnpm start`,
+    url: baseURL,
+    reuseExistingServer: !process.env.CI,
+    stdout: 'pipe',
+  },
+
+  projects: [
+    {
+      name: 'chromium',
+      use: { ...devices['Desktop Chrome'] },
+    },
+  ],
+})
diff --git a/e2e/react-start/i18n-paraglide/project.inlang/.gitignore b/e2e/react-start/i18n-paraglide/project.inlang/.gitignore
new file mode 100644
index 0000000000..5e46596759
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/project.inlang/.gitignore
@@ -0,0 +1 @@
+cache
\ No newline at end of file
diff --git a/e2e/react-start/i18n-paraglide/project.inlang/project_id b/e2e/react-start/i18n-paraglide/project.inlang/project_id
new file mode 100644
index 0000000000..a956b223fa
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/project.inlang/project_id
@@ -0,0 +1 @@
+UoZ15Q8qSGIbImRS3Y
\ No newline at end of file
diff --git a/e2e/react-start/i18n-paraglide/project.inlang/settings.json b/e2e/react-start/i18n-paraglide/project.inlang/settings.json
new file mode 100644
index 0000000000..9bdce4c8cc
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/project.inlang/settings.json
@@ -0,0 +1,12 @@
+{
+  "$schema": "https://inlang.com/schema/project-settings",
+  "baseLocale": "en",
+  "locales": ["en", "de"],
+  "modules": [
+    "https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js",
+    "https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js"
+  ],
+  "plugin.inlang.messageFormat": {
+    "pathPattern": "./messages/{locale}.json"
+  }
+}
diff --git a/e2e/react-start/i18n-paraglide/public/favicon.ico b/e2e/react-start/i18n-paraglide/public/favicon.ico
new file mode 100644
index 0000000000..a11777cc47
Binary files /dev/null and b/e2e/react-start/i18n-paraglide/public/favicon.ico differ
diff --git a/e2e/react-start/i18n-paraglide/public/logo192.png b/e2e/react-start/i18n-paraglide/public/logo192.png
new file mode 100644
index 0000000000..fc44b0a379
Binary files /dev/null and b/e2e/react-start/i18n-paraglide/public/logo192.png differ
diff --git a/e2e/react-start/i18n-paraglide/public/logo512.png b/e2e/react-start/i18n-paraglide/public/logo512.png
new file mode 100644
index 0000000000..a4e47a6545
Binary files /dev/null and b/e2e/react-start/i18n-paraglide/public/logo512.png differ
diff --git a/e2e/react-start/i18n-paraglide/public/manifest.json b/e2e/react-start/i18n-paraglide/public/manifest.json
new file mode 100644
index 0000000000..078ef50116
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/public/manifest.json
@@ -0,0 +1,25 @@
+{
+  "short_name": "TanStack App",
+  "name": "Create TanStack App Sample",
+  "icons": [
+    {
+      "src": "favicon.ico",
+      "sizes": "64x64 32x32 24x24 16x16",
+      "type": "image/x-icon"
+    },
+    {
+      "src": "logo192.png",
+      "type": "image/png",
+      "sizes": "192x192"
+    },
+    {
+      "src": "logo512.png",
+      "type": "image/png",
+      "sizes": "512x512"
+    }
+  ],
+  "start_url": ".",
+  "display": "standalone",
+  "theme_color": "#000000",
+  "background_color": "#ffffff"
+}
diff --git a/e2e/react-start/i18n-paraglide/public/robots.txt b/e2e/react-start/i18n-paraglide/public/robots.txt
new file mode 100644
index 0000000000..e9e57dc4d4
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/public/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/e2e/react-start/i18n-paraglide/src/logo.svg b/e2e/react-start/i18n-paraglide/src/logo.svg
new file mode 100644
index 0000000000..fe53fe8d0d
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/src/logo.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="5355px" height="3786px" viewBox="0 0 5355 3786" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>logo</title>
+    <g id="logo" stroke="none" fill="none" transform="translate(0.9778, 0)" fill-rule="evenodd" stroke-width="1">
+        <g id="Layer_1" transform="translate(1117.351, 496.0658)" fill="#61DAFB">
+            <g id="Group" fill-rule="nonzero">
+                <path d="M3119.93396,1389.62036 C3119.93396,1182.92626 2861.10536,987.043843 2464.27723,865.571309 C2555.85295,461.086847 2515.15263,139.280027 2335.81684,36.2509659 C2294.48058,12.0836553 2246.14895,0.635981858 2193.36572,0.635981858 L2193.36572,142.459936 C2222.61908,142.459936 2246.14895,148.183773 2265.86317,158.995464 C2352.35135,208.602049 2389.87196,397.488661 2360.6186,640.433731 C2353.62323,700.216026 2342.17627,763.178229 2328.18553,827.412397 C2203.5408,796.885268 2067.4491,773.353939 1924.36204,758.090375 C1838.5098,640.433731 1749.47785,533.588779 1659.80995,440.099446 C1867.12721,247.396943 2061.72562,141.823954 2194.00166,141.823954 L2194.00166,0 C2019.11747,0 1790.17817,124.652444 1558.69509,340.886276 C1327.21202,125.924408 1098.27272,2.54392743 923.388526,2.54392743 L923.388526,144.367882 C1055.02863,144.367882 1250.26298,249.304888 1457.58024,440.735428 C1368.54828,534.224761 1279.51633,640.433731 1194.93598,758.090375 C1051.21297,773.353939 915.121273,796.885268 790.476541,828.048379 C775.849863,764.450193 765.038841,702.759953 757.407531,643.61364 C727.518233,400.66857 764.402898,211.781959 850.255137,161.539392 C869.333413,150.091718 894.13517,145.003864 923.388526,145.003864 L923.388526,3.17990929 C869.969355,3.17990929 821.637724,14.6275827 779.665518,38.7948933 C600.965673,141.823954 560.901295,462.994793 653.112959,866.20729 C257.556717,988.315807 0,1183.56224 0,1389.62036 C0,1595.67848 258.828602,1792.19688 655.656729,1913.66941 C564.081007,2318.15387 604.781328,2639.96069 784.117116,2742.98975 C825.453379,2767.15706 873.78501,2778.60474 927.204181,2778.60474 C1102.08837,2778.60474 1331.02768,2653.95229 1562.51075,2437.71846 C1793.99382,2652.68033 2022.93313,2776.06081 2197.81732,2776.06081 C2251.23649,2776.06081 2299.56812,2764.61314 2341.54033,2740.44583 C2520.24017,2637.41676 2560.30455,2316.24593 2468.09289,1913.03343 C2862.37724,1791.56089 3119.93396,1595.67848 3119.93396,1389.62036 L3119.93396,1389.62036 Z M2291.93681,965.42046 C2268.40694,1047.46212 2239.15358,1132.04771 2206.08457,1216.63329 C2180.01093,1165.75475 2152.6654,1114.8762 2122.7761,1063.99765 C2093.52275,1013.1191 2062.36156,963.512515 2031.20038,915.177893 C2121.50422,928.533513 2208.62834,945.069041 2291.93681,965.42046 Z M2000.67514,1642.74114 C1951.07162,1728.59869 1900.19622,1810.00437 1847.41299,1885.68621 C1752.65756,1893.95397 1656.63024,1898.40585 1559.96698,1898.40585 C1463.30372,1898.40585 1367.91234,1893.95397 1273.79285,1886.32219 C1221.00962,1810.64035 1169.49828,1729.87065 1119.89476,1644.64908 C1071.56313,1561.33546 1027.6831,1476.74987 987.61872,1391.52831 C1027.04716,1306.30674 1071.56313,1221.08517 1119.25882,1137.77154 C1168.86234,1051.91399 1219.73774,970.508315 1272.52096,894.826474 C1367.2764,886.55871 1463.30372,882.106837 1559.96698,882.106837 C1656.63024,882.106837 1752.02162,886.55871 1846.14111,894.190492 C1898.92434,969.872333 1950.43568,1050.64203 2000.0392,1135.8636 C2048.37083,1219.17722 2092.25086,1303.76281 2132.31524,1388.98438 C2092.25086,1474.20595 2048.37083,1559.42752 2000.67514,1642.74114 Z M2206.08457,1560.0635 C2240.42547,1645.28507 2269.67882,1730.50664 2293.84464,1813.18428 C2210.53617,1833.5357 2122.7761,1850.70721 2031.83632,1864.06283 C2062.99751,1815.09222 2094.15869,1764.84966 2123.41204,1713.33513 C2152.6654,1662.45658 2180.01093,1610.94205 2206.08457,1560.0635 Z M1561.23886,2238.65614 C1502.09621,2177.60188 1442.95356,2109.55182 1384.44685,2035.14195 C1441.68167,2037.68587 1500.18838,2039.59382 1559.33104,2039.59382 C1618.47369,2039.59382 1678.25229,2038.32185 1736.12305,2035.14195 C1678.88823,2109.55182 1619.74558,2177.60188 1561.23886,2238.65614 Z M1088.09764,1864.06283 C997.7938,1850.70721 910.669676,1834.17168 827.361207,1813.82026 C850.89108,1731.7786 880.144435,1647.19301 913.213446,1562.60742 C939.287089,1613.48597 966.632617,1664.36452 996.521915,1715.24307 C1026.41121,1766.12162 1056.93645,1815.7282 1088.09764,1864.06283 Z M1558.05915,540.584579 C1617.20181,601.638838 1676.34446,669.688896 1734.85117,744.098774 C1677.61634,741.554846 1619.10963,739.646901 1559.96698,739.646901 C1500.82433,739.646901 1441.04573,740.918864 1383.17496,744.098774 C1440.40979,669.688896 1499.55244,601.638838 1558.05915,540.584579 Z M1087.46169,915.177893 C1056.30051,964.148497 1025.13933,1014.39106 995.885972,1065.90559 C966.632617,1116.78414 939.287089,1167.66269 913.213446,1218.54124 C878.87255,1133.31967 849.619195,1048.0981 825.453379,965.42046 C908.761848,945.705023 996.521915,928.533513 1087.46169,915.177893 Z M511.933721,1711.42718 C286.810072,1615.39392 141.179237,1489.46951 141.179237,1389.62036 C141.179237,1289.77121 286.810072,1163.21082 511.933721,1067.81354 C566.624777,1044.28221 626.403373,1023.29481 688.089797,1003.57937 C724.33852,1128.23182 772.034208,1257.97211 831.176862,1390.89232 C772.670151,1523.17655 725.610405,1652.28087 689.997624,1776.29733 C627.039316,1756.58189 567.26072,1734.95851 511.933721,1711.42718 Z M854.070792,2620.24525 C767.582611,2570.63867 730.062003,2381.75206 759.315358,2138.80699 C766.310726,2079.02469 777.757691,2016.06249 791.748426,1951.82832 C916.393158,1982.35545 1052.48486,2005.88678 1195.57192,2021.15034 C1281.42416,2138.80699 1370.45611,2245.65194 1460.12401,2339.14127 C1252.80675,2531.84378 1058.20834,2637.41676 925.932296,2637.41676 C897.314883,2636.78078 873.149068,2631.05695 854.070792,2620.24525 L854.070792,2620.24525 Z M2362.52643,2135.62708 C2392.41573,2378.57215 2355.53106,2567.45876 2269.67882,2617.70133 C2250.60055,2629.149 2225.79879,2634.23686 2196.54543,2634.23686 C2064.90533,2634.23686 1869.67098,2529.29985 1662.35372,2337.86931 C1751.38568,2244.37998 1840.41763,2138.17101 1924.99798,2020.51436 C2068.72099,2005.2508 2204.81269,1981.71947 2329.45742,1950.55636 C2344.0841,2014.79053 2355.53106,2076.48077 2362.52643,2135.62708 L2362.52643,2135.62708 Z M2607.3643,1711.42718 C2552.67324,1734.95851 2492.89464,1755.94591 2431.20822,1775.66135 C2394.9595,1651.0089 2347.26381,1521.2686 2288.12115,1388.3484 C2346.62787,1256.06417 2393.68761,1126.95985 2429.30039,1002.94339 C2492.2587,1022.65883 2552.0373,1044.28221 2608.00024,1067.81354 C2833.12389,1163.8468 2978.75472,1289.77121 2978.75472,1389.62036 C2978.75472,1489.46951 2832.48794,1616.0299 2607.3643,1711.42718 L2607.3643,1711.42718 Z" id="Shape"></path>
+            </g>
+            <path d="M1537.37834,1099.4829 C1545.02735,1098.47702 1553.10731,1099.16174 1560.81604,1099.16174 C1589.37451,1099.16174 1617.41357,1103.60261 1644.73816,1112.01928 C1679.60968,1122.76128 1712.08981,1139.93545 1740.75715,1162.52987 C1775.89405,1190.22336 1805.00822,1226.54711 1823.68958,1267.31325 C1858.64201,1343.58359 1858.38571,1436.01692 1822.57667,1511.96611 C1799.42324,1561.07316 1762.27826,1602.17408 1717.31944,1632.14671 C1680.63641,1656.60215 1637.73331,1671.57142 1594.08247,1676.87122 C1538.52074,1683.61849 1478.45443,1673.7589 1428.50641,1648.10898 C1334.7397,1599.95554 1270.99292,1503.04196 1269.73182,1396.83535 C1269.48913,1376.35874 1269.80743,1355.76018 1273.85459,1335.48277 C1280.44663,1302.45918 1291.94018,1270.53691 1309.20168,1241.56031 C1327.87397,1210.21369 1351.99288,1182.55201 1380.87494,1160.24997 C1414.74469,1134.09636 1454.10946,1115.2846 1495.79531,1105.71435 C1505.55336,1103.47438 1515.35011,1102.20236 1525.19388,1100.99838 L1528.67012,1100.57481 C1531.56864,1100.22174 1534.47131,1099.86541 1537.37834,1099.4829 Z M1440.28829,1582.05277 C1427.38628,1583.43854 1413.77812,1585.79095 1402.70469,1593.0505 C1405.19749,1593.65093 1408.05457,1593.05485 1410.65507,1593.0505 C1416.90117,1593.04035 1423.20727,1592.80467 1429.44687,1593.07878 C1445.06719,1593.76551 1461.34234,1596.26875 1476.42637,1600.4123 C1488.01412,1603.59545 1498.77315,1608.6274 1509.54524,1613.66442 L1512.23902,1614.92271 C1518.52742,1617.854 1524.84413,1620.73472 1531.35625,1623.19891 C1550.98501,1630.62598 1570.52415,1632.93415 1591.34546,1632.93415 L1593.25225,1632.93318 C1603.09908,1632.91995 1612.8672,1632.72906 1622.42421,1630.03352 C1617.1148,1627.20106 1609.51424,1627.7326 1603.63241,1626.55277 C1590.87061,1623.99224 1578.32347,1620.86608 1566.04881,1616.47888 C1546.68964,1609.55943 1528.85694,1599.16793 1509.6734,1591.90838 C1487.81565,1583.63651 1463.59446,1579.54953 1440.28829,1582.05277 Z M1459.80285,1527.06119 C1434.23516,1527.06119 1408.3762,1531.57312 1385.35841,1543.19449 C1379.78158,1546.01028 1374.48085,1549.36485 1369.45766,1553.08274 C1367.92685,1554.21616 1365.21288,1555.67227 1364.64696,1557.64252 C1364.07308,1559.64106 1366.125,1561.31545 1367.28937,1562.5939 C1373.04255,1559.52213 1378.5088,1556.27053 1384.63565,1553.93842 C1424.26105,1538.85878 1472.29796,1542.01974 1511.84169,1555.84631 C1531.56224,1562.74183 1549.73174,1573.05357 1568.93985,1581.14052 C1590.42177,1590.18468 1612.36265,1596.04903 1635.43392,1599.05625 C1662.64806,1602.60227 1693.67549,1599.72848 1718.5515,1587.42618 C1727.29258,1583.10352 1739.42919,1576.51619 1743.1254,1566.94484 C1738.56043,1567.3444 1734.45298,1569.30378 1730.11569,1570.65475 C1723.2191,1572.80266 1716.24011,1574.62426 1709.1556,1576.04629 C1685.14474,1580.86496 1659.61174,1581.85988 1635.43392,1577.48645 C1610.81165,1573.03264 1588.07413,1563.72547 1565.31061,1554.26664 L1562.27515,1553.00498 C1550.63735,1548.16833 1538.97057,1543.34664 1527.01968,1539.16769 C1505.55366,1531.66159 1482.54816,1527.06119 1459.80285,1527.06119 Z M1504.61407,1133.60828 C1473.96537,1140.39067 1446.50982,1153.59796 1420.05097,1170.24757 C1404.69012,1179.91319 1389.99637,1189.81522 1376.68527,1202.25529 C1356.89028,1220.75623 1341.76143,1243.24263 1328.5667,1266.72974 C1314.97155,1290.92897 1306.25505,1319.13178 1302.04207,1346.49704 C1297.90932,1373.34381 1297.22848,1401.57056 1301.96257,1428.43981 C1307.88054,1462.03199 1319.14478,1493.55458 1336.93339,1522.71025 C1342.91135,1519.91332 1347.1554,1513.53629 1352.11138,1509.24045 C1362.11874,1500.56685 1372.62552,1492.52776 1383.91289,1485.59018 C1388.09117,1483.02239 1392.38365,1481.02821 1396.9226,1479.20082 C1398.63482,1478.51119 1401.43407,1477.88103 1402.23995,1475.99707 C1403.52069,1473.00507 1401.1522,1467.79772 1400.74528,1464.69767 C1399.58381,1455.83117 1398.88273,1446.81384 1399.10172,1437.86685 C1399.73775,1411.80978 1404.59833,1385.3894 1413.85256,1361.00019 C1420.82649,1342.62325 1431.48,1325.93811 1444.10086,1310.96434 C1448.38322,1305.88316 1452.9359,1301.15368 1457.63457,1296.46192 C1458.21308,1295.88421 1458.82064,1295.32387 1459.43565,1294.76658 L1460.17587,1294.09838 C1462.27545,1292.20409 1464.36137,1290.27877 1465.58495,1287.7593 C1456.52296,1287.76511 1447.45953,1290.38292 1438.84277,1293.04062 C1420.27936,1298.76647 1402.19587,1307.26241 1386.80393,1319.24926 C1379.78303,1324.71767 1374.6413,1331.88512 1368.00129,1337.63997 C1365.96455,1339.40573 1362.31605,1341.77192 1359.50162,1340.4398 C1355.24961,1338.42822 1355.90588,1330.0454 1355.41874,1326.19264 C1353.54534,1311.37332 1359.14891,1292.62874 1366.27028,1279.78257 C1377.7022,1259.16128 1398.84008,1241.55301 1423.66478,1242.16794 C1434.3855,1242.43335 1443.77128,1246.16501 1454.02076,1248.60081 C1451.42171,1244.90179 1447.93728,1242.20565 1444.62486,1239.17377 C1436.50897,1231.74453 1427.63201,1224.95924 1417.88268,1219.82657 C1415.26773,1218.45023 1412.51915,1217.43388 1409.75022,1216.45975 L1408.08733,1215.8778 C1407.25557,1215.58681 1406.42402,1215.29391 1405.59574,1214.9905 C1403.51346,1214.22836 1400.89128,1213.17906 1400.10781,1210.86073 C1398.65722,1206.56707 1406.37487,1202.59031 1409.20954,1200.77959 C1420.16806,1193.78038 1433.60492,1188.02263 1446.79315,1187.69848 C1467.40342,1187.1916 1487.541,1198.64836 1496.03056,1218.14421 C1499.41855,1225.92354 1500.09804,1234.21057 1500.70889,1242.5268 L1500.82326,1244.08631 C1500.88069,1244.86613 1500.93897,1245.64593 1501.00027,1246.42534 C1507.47332,1241.13895 1512.02599,1233.35946 1518.34654,1227.69743 C1533.12846,1214.45461 1553.35856,1208.57576 1572.55366,1214.53728 C1589.90066,1219.92375 1604.97747,1231.9164 1613.85081,1247.87566 C1616.17232,1252.05111 1622.64899,1262.25625 1617.96983,1266.41503 C1614.3076,1269.67098 1609.66313,1267.13366 1605.80069,1265.78341 C1601.8125,1264.38966 1597.64361,1263.69061 1593.51375,1262.86103 C1583.01058,1260.75155 1570.79301,1260.97055 1560.26672,1262.82477 C1553.46119,1264.02346 1546.81034,1266.44983 1540.02939,1267.4549 L1540.02939,1268.90522 C1558.57112,1269.05895 1576.50717,1279.65567 1585.65516,1295.73603 C1589.44532,1302.39805 1591.33824,1310.02308 1592.79026,1317.49075 C1594.5856,1326.72055 1593.32366,1336.77631 1590.80628,1345.77188 C1589.9621,1348.78781 1588.42984,1353.9009 1584.82977,1354.5956 C1582.28492,1355.08653 1580.12387,1352.54848 1578.67112,1350.83711 C1574.86289,1346.35128 1571.2404,1342.08663 1566.77157,1338.21284 C1555.46613,1328.41379 1543.51238,1319.37471 1531.35625,1310.65904 C1524.90199,1306.03109 1517.83266,1300.01446 1510.39617,1297.18635 C1512.48712,1302.23199 1514.53542,1306.92303 1515.24662,1312.41465 C1517.33829,1328.56825 1510.5877,1343.77263 1500.4553,1355.92409 C1497.36333,1359.63254 1494.05597,1363.36782 1490.15884,1366.24887 C1488.54275,1367.44393 1486.51468,1369.00447 1484.37675,1368.66655 C1477.67386,1367.60564 1476.87593,1357.4839 1475.84816,1352.2983 C1472.36734,1334.73427 1473.76516,1317.28988 1478.59466,1300.08698 C1474.29784,1302.2697 1471.19213,1307.04631 1468.49406,1310.96434 C1462.55802,1319.58573 1457.40762,1328.70458 1453.71431,1338.52031 C1439.00539,1377.62006 1439.14705,1423.41664 1458.20194,1461.05811 C1460.32975,1465.26184 1463.55905,1464.69767 1467.75323,1464.69767 C1472.80895,1464.69767 1477.91309,1464.44387 1482.93123,1465.11536 C1484.88413,1465.37642 1487.59593,1465.14364 1489.14192,1466.58526 C1490.99291,1468.31258 1490.00634,1471.27412 1489.57991,1473.39956 C1488.3888,1479.3415 1487.99056,1484.74174 1487.99056,1490.80333 C1495.9019,1489.57492 1498.09476,1476.86871 1500.89908,1470.49893 C1504.07706,1463.28289 1507.3107,1456.0596 1510.25089,1448.74421 C1511.69641,1445.14888 1513.6298,1441.12861 1513.12242,1437.1417 C1512.55289,1432.66095 1509.32142,1427.91044 1507.06929,1424.08887 C1502.80645,1416.85687 1497.96105,1409.41458 1494.82282,1401.60899 C1492.31412,1395.36901 1494.65008,1387.5714 1501.72375,1385.34226 C1505.62522,1384.1124 1509.7876,1386.52427 1512.32666,1389.34948 C1515.93315,1393.3614 1518.67364,1398.69976 1521.26801,1403.88732 L1522.0059,1405.3641 C1522.98612,1407.32427 1523.95508,1409.24214 1524.95258,1411.03604 L1555.1062,1465.42283 C1557.66694,1470.0283 1560.23347,1474.6287 1562.85348,1479.20082 C1563.87546,1480.9847 1564.91552,1483.73885 1567.00936,1484.49954 C1568.87408,1485.17684 1571.42182,1484.21383 1573.27642,1483.84182 C1578.09146,1482.87591 1582.89927,1481.83314 1587.73166,1480.9586 C1593.52242,1479.91074 1602.34951,1480.10726 1606.52346,1475.57503 C1600.41901,1473.63813 1593.36269,1473.75271 1587.00889,1474.18925 C1586.22321,1474.2433 1585.41997,1474.34419 1584.60911,1474.45086 L1583.91244,1474.54275 C1581.00382,1474.92353 1578.03411,1475.22838 1575.45555,1473.58665 C1570.23649,1470.26398 1566.76723,1462.58891 1563.57407,1457.4461 C1555.70103,1444.76455 1548.28333,1431.89228 1540.7442,1419.01276 C1538.34102,1414.90692 1535.86628,1410.83299 1533.5361,1406.68509 C1532.63554,1405.08104 1531.3006,1402.96721 1532.59073,1401.19855 C1533.93235,1399.36006 1536.8405,1399.23436 1539.486,1399.22865 L1540.63853,1399.22883 C1541.48104,1399.22712 1542.26426,1399.21253 1542.92044,1399.12605 C1553.68091,1397.70765 1564.591,1396.53289 1575.44471,1396.53289 C1574.5998,1393.58875 1572.18361,1390.26101 1572.95624,1387.10875 C1574.68509,1380.05587 1584.81459,1377.84921 1589.52555,1382.91009 C1592.68835,1386.30745 1594.52634,1390.98326 1596.58404,1395.08258 C1599.29945,1400.49442 1602.39143,1405.72571 1605.2991,1411.03604 C1610.38879,1420.33328 1615.94754,1429.37526 1621.18178,1438.59201 C1621.64941,1439.41555 1622.13242,1440.23451 1622.62001,1441.05306 L1623.35349,1442.2811 C1625.55616,1445.9674 1627.74247,1449.68746 1628.92907,1453.82031 C1610.75017,1452.98711 1597.1037,1431.84732 1589.17718,1417.56245 C1588.54476,1419.8496 1589.57253,1421.89091 1590.39431,1424.08887 C1592.10219,1428.65373 1594.14327,1433.00105 1596.71197,1437.1417 C1600.38071,1443.05463 1604.58646,1449.14377 1610.13726,1453.4367 C1619.98778,1461.05448 1632.97725,1461.09654 1644.82982,1460.28219 C1652.43038,1459.75935 1661.92747,1456.2931 1669.40371,1458.64478 C1676.86767,1460.99284 1679.87219,1469.23933 1675.4395,1475.5743 C1672.11913,1480.31973 1667.68716,1482.1116 1662.1761,1482.8266 C1666.07323,1491.20144 1671.17882,1498.97368 1674.87936,1507.48195 C1676.42101,1511.02652 1678.02771,1516.45867 1681.72174,1518.32885 C1684.1813,1519.57322 1687.70476,1518.41442 1690.3638,1518.35931 C1687.69536,1511.28612 1682.69891,1505.284 1680.24514,1498.0549 C1687.72644,1498.3979 1694.96201,1502.30868 1701.92799,1504.80467 C1717.73912,1510.4696 1733.32041,1516.74438 1748.90749,1523.00031 C1754.4648,1525.23017 1760.05536,1527.43755 1765.53101,1529.86175 C1767.5345,1530.74862 1770.30846,1532.82184 1772.523,1531.54557 C1774.3299,1530.50352 1775.49861,1528.01913 1776.61311,1526.33604 C1779.73038,1521.62687 1782.55349,1516.73786 1785.34985,1511.83289 C1796.54904,1492.18983 1804.76323,1470.66644 1810.25043,1448.74421 C1828.34983,1376.44313 1812.82274,1296.66786 1769.32912,1236.27314 C1752.61815,1213.06883 1731.60241,1193.00808 1708.43284,1176.39473 C1650.44929,1134.82074 1574.37719,1118.17113 1504.61407,1133.60828 Z M1623.14697,1494.16008 C1607.776,1498.17456 1591.93524,1501.81339 1576.16747,1503.85616 C1578.24107,1510.92862 1583.30835,1517.80819 1587.01757,1524.16056 C1588.45153,1526.61667 1589.98595,1529.90599 1592.8199,1530.97197 C1596.02101,1532.17573 1599.88923,1530.22215 1602.90965,1529.23667 C1601.5111,1525.40348 1599.15779,1521.95391 1597.23163,1518.35931 C1596.43804,1516.87709 1595.21007,1515.1222 1595.86417,1513.36225 C1597.10081,1510.03668 1602.23459,1510.23247 1605.07793,1509.65452 C1612.5708,1508.13169 1619.98561,1506.23105 1627.48354,1504.72635 C1630.24594,1504.17161 1634.09247,1502.66908 1636.8686,1503.59728 C1640.50626,1504.81337 1641.61498,1509.15561 1644.25884,1511.54718 C1647.2901,1514.289 1651.82326,1514.71032 1655.67124,1515.45868 C1653.32299,1510.16503 1649.42008,1505.53345 1646.91788,1500.23038 C1645.46296,1497.14628 1644.26751,1492.60897 1641.0823,1490.82654 C1636.69442,1488.37115 1627.63243,1492.98823 1623.14697,1494.16008 Z M1526.29692,1458.89641 C1525.57344,1468.08996 1522.75828,1475.56995 1518.34654,1483.55176 C1523.40226,1484.1928 1528.55916,1484.42122 1533.52454,1485.65399 C1537.24604,1486.57784 1540.67554,1488.33997 1544.36596,1489.35302 C1542.39282,1483.94479 1538.73203,1479.1196 1535.89592,1474.12472 C1533.03234,1469.0827 1530.46942,1462.95584 1526.29692,1458.89641 Z" id="Combined-Shape-Copy" fill-rule="nonzero"></path>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/e2e/react-start/i18n-paraglide/src/routeTree.gen.ts b/e2e/react-start/i18n-paraglide/src/routeTree.gen.ts
new file mode 100644
index 0000000000..421daf2790
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/src/routeTree.gen.ts
@@ -0,0 +1,86 @@
+/* eslint-disable */
+
+// @ts-nocheck
+
+// noinspection JSUnusedGlobalSymbols
+
+// This file was automatically generated by TanStack Router.
+// You should NOT make any changes in this file as it will be overwritten.
+// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
+
+import { Route as rootRouteImport } from './routes/__root'
+import { Route as AboutRouteImport } from './routes/about'
+import { Route as IndexRouteImport } from './routes/index'
+
+const AboutRoute = AboutRouteImport.update({
+  id: '/about',
+  path: '/about',
+  getParentRoute: () => rootRouteImport,
+} as any)
+const IndexRoute = IndexRouteImport.update({
+  id: '/',
+  path: '/',
+  getParentRoute: () => rootRouteImport,
+} as any)
+
+export interface FileRoutesByFullPath {
+  '/': typeof IndexRoute
+  '/about': typeof AboutRoute
+}
+export interface FileRoutesByTo {
+  '/': typeof IndexRoute
+  '/about': typeof AboutRoute
+}
+export interface FileRoutesById {
+  __root__: typeof rootRouteImport
+  '/': typeof IndexRoute
+  '/about': typeof AboutRoute
+}
+export interface FileRouteTypes {
+  fileRoutesByFullPath: FileRoutesByFullPath
+  fullPaths: '/' | '/about'
+  fileRoutesByTo: FileRoutesByTo
+  to: '/' | '/about'
+  id: '__root__' | '/' | '/about'
+  fileRoutesById: FileRoutesById
+}
+export interface RootRouteChildren {
+  IndexRoute: typeof IndexRoute
+  AboutRoute: typeof AboutRoute
+}
+
+declare module '@tanstack/react-router' {
+  interface FileRoutesByPath {
+    '/about': {
+      id: '/about'
+      path: '/about'
+      fullPath: '/about'
+      preLoaderRoute: typeof AboutRouteImport
+      parentRoute: typeof rootRouteImport
+    }
+    '/': {
+      id: '/'
+      path: '/'
+      fullPath: '/'
+      preLoaderRoute: typeof IndexRouteImport
+      parentRoute: typeof rootRouteImport
+    }
+  }
+}
+
+const rootRouteChildren: RootRouteChildren = {
+  IndexRoute: IndexRoute,
+  AboutRoute: AboutRoute,
+}
+export const routeTree = rootRouteImport
+  ._addFileChildren(rootRouteChildren)
+  ._addFileTypes<FileRouteTypes>()
+
+import type { getRouter } from './router.tsx'
+import type { createStart } from '@tanstack/react-start'
+declare module '@tanstack/react-start' {
+  interface Register {
+    ssr: true
+    router: Awaited<ReturnType<typeof getRouter>>
+  }
+}
diff --git a/e2e/react-start/i18n-paraglide/src/router.tsx b/e2e/react-start/i18n-paraglide/src/router.tsx
new file mode 100644
index 0000000000..3a8413a964
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/src/router.tsx
@@ -0,0 +1,18 @@
+import { createRouter } from '@tanstack/react-router'
+
+// Import the generated route tree
+import { routeTree } from './routeTree.gen'
+import { deLocalizeUrl, localizeUrl } from './paraglide/runtime'
+
+// Create a new router instance
+export const getRouter = () => {
+  return createRouter({
+    routeTree,
+    scrollRestoration: true,
+    defaultPreloadStaleTime: 0,
+    rewrite: {
+      input: ({ url }) => deLocalizeUrl(url),
+      output: ({ url }) => localizeUrl(url),
+    },
+  })
+}
diff --git a/e2e/react-start/i18n-paraglide/src/routes/__root.tsx b/e2e/react-start/i18n-paraglide/src/routes/__root.tsx
new file mode 100644
index 0000000000..c5c84d708a
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/src/routes/__root.tsx
@@ -0,0 +1,85 @@
+import {
+  HeadContent,
+  Link,
+  Outlet,
+  Scripts,
+  createRootRoute,
+} from '@tanstack/react-router'
+import styles from '../styles.css?url'
+import { getLocale, locales, setLocale } from '@/paraglide/runtime'
+import { m } from '@/paraglide/messages'
+
+export const Route = createRootRoute({
+  head: () => ({
+    meta: [
+      {
+        charSet: 'utf-8',
+      },
+      {
+        name: 'viewport',
+        content: 'width=device-width, initial-scale=1',
+      },
+      {
+        title: 'TanStack Start Starter',
+      },
+    ],
+    links: [{ rel: 'stylesheet', href: styles }],
+  }),
+
+  component: RootComponent,
+})
+
+function RootComponent() {
+  return (
+    <html lang={getLocale()}>
+      <head>
+        <HeadContent />
+      </head>
+      <body>
+        <div className="p-2 flex gap-2 text-lg justify-between">
+          <div className="flex gap-2 text-lg">
+            <Link
+              to="/"
+              activeProps={{
+                className: 'font-bold',
+              }}
+              activeOptions={{ exact: true }}
+            >
+              {m.home_page()}
+            </Link>
+
+            <Link
+              to="/about"
+              activeProps={{
+                className: 'font-bold',
+              }}
+            >
+              {m.about_page()}
+            </Link>
+          </div>
+
+          <div className="flex gap-2 text-lg">
+            {locales.map((locale) => (
+              <button
+                key={locale}
+                onClick={() => setLocale(locale)}
+                data-active-locale={locale === getLocale()}
+                className="rounded p-1 px-2 border border-gray-300 cursor-pointer [&[data-active-locale=true]]:bg-gray-500 [&[data-active-locale=true]]:text-white"
+              >
+                {locale}
+              </button>
+            ))}
+          </div>
+        </div>
+
+        <hr />
+
+        <div className="p-2">
+          <Outlet />
+        </div>
+
+        <Scripts />
+      </body>
+    </html>
+  )
+}
diff --git a/e2e/react-start/i18n-paraglide/src/routes/about.tsx b/e2e/react-start/i18n-paraglide/src/routes/about.tsx
new file mode 100644
index 0000000000..0ee95a577a
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/src/routes/about.tsx
@@ -0,0 +1,10 @@
+import { createFileRoute } from '@tanstack/react-router'
+import { m } from '@/paraglide/messages'
+
+export const Route = createFileRoute('/about')({
+  component: RouteComponent,
+})
+
+function RouteComponent() {
+  return <div>{m.about_message()}</div>
+}
diff --git a/e2e/react-start/i18n-paraglide/src/routes/index.tsx b/e2e/react-start/i18n-paraglide/src/routes/index.tsx
new file mode 100644
index 0000000000..d86af585cb
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/src/routes/index.tsx
@@ -0,0 +1,30 @@
+import { createFileRoute } from '@tanstack/react-router'
+import { m } from '@/paraglide/messages.js'
+import { createServerFn } from '@tanstack/react-start'
+
+const getServerMessage = createServerFn()
+  .inputValidator((emoji: string) => emoji)
+  .handler((ctx) => {
+    return m.server_message({ emoji: ctx.data })
+  })
+
+export const Route = createFileRoute('/')({
+  component: Home,
+  loader: async () => {
+    return {
+      messageFromLoader: m.example_message({ username: 'John Doe' }),
+      serverFunctionMessage: await getServerMessage({ data: '📩' }),
+    }
+  },
+})
+
+function Home() {
+  const { serverFunctionMessage, messageFromLoader } = Route.useLoaderData()
+  return (
+    <div className="p-2">
+      <h2>Message from loader: {messageFromLoader}</h2>
+      <h2>Server function message: {serverFunctionMessage}:</h2>
+      <h2>{m.example_message({ username: 'John Doe' })}</h2>
+    </div>
+  )
+}
diff --git a/e2e/react-start/i18n-paraglide/src/server.ts b/e2e/react-start/i18n-paraglide/src/server.ts
new file mode 100644
index 0000000000..9542b01d4a
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/src/server.ts
@@ -0,0 +1,8 @@
+import { paraglideMiddleware } from './paraglide/server.js'
+import handler from '@tanstack/react-start/server-entry'
+
+export default {
+  fetch(req: Request): Promise<Response> {
+    return paraglideMiddleware(req, ({ request }) => handler.fetch(request))
+  },
+}
diff --git a/e2e/react-start/i18n-paraglide/src/styles.css b/e2e/react-start/i18n-paraglide/src/styles.css
new file mode 100644
index 0000000000..d4b5078586
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/src/styles.css
@@ -0,0 +1 @@
+@import 'tailwindcss';
diff --git a/e2e/react-start/i18n-paraglide/src/utils/prerender.ts b/e2e/react-start/i18n-paraglide/src/utils/prerender.ts
new file mode 100644
index 0000000000..0cb1630595
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/src/utils/prerender.ts
@@ -0,0 +1,8 @@
+import { localizeHref } from '../paraglide/runtime'
+
+export const prerenderRoutes = ['/', '/about'].map((path) => ({
+  path: localizeHref(path),
+  prerender: {
+    enabled: true,
+  },
+}))
diff --git a/e2e/react-start/i18n-paraglide/src/utils/seo.ts b/e2e/react-start/i18n-paraglide/src/utils/seo.ts
new file mode 100644
index 0000000000..d18ad84b74
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/src/utils/seo.ts
@@ -0,0 +1,33 @@
+export const seo = ({
+  title,
+  description,
+  keywords,
+  image,
+}: {
+  title: string
+  description?: string
+  image?: string
+  keywords?: string
+}) => {
+  const tags = [
+    { title },
+    { name: 'description', content: description },
+    { name: 'keywords', content: keywords },
+    { name: 'twitter:title', content: title },
+    { name: 'twitter:description', content: description },
+    { name: 'twitter:creator', content: '@tannerlinsley' },
+    { name: 'twitter:site', content: '@tannerlinsley' },
+    { name: 'og:type', content: 'website' },
+    { name: 'og:title', content: title },
+    { name: 'og:description', content: description },
+    ...(image
+      ? [
+          { name: 'twitter:image', content: image },
+          { name: 'twitter:card', content: 'summary_large_image' },
+          { name: 'og:image', content: image },
+        ]
+      : []),
+  ]
+
+  return tags
+}
diff --git a/e2e/react-start/i18n-paraglide/src/utils/translated-pathnames.ts b/e2e/react-start/i18n-paraglide/src/utils/translated-pathnames.ts
new file mode 100644
index 0000000000..bb8649ff4e
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/src/utils/translated-pathnames.ts
@@ -0,0 +1,56 @@
+import { Locale } from '@/paraglide/runtime'
+import { FileRoutesByTo } from '../routeTree.gen'
+
+type RoutePath = keyof FileRoutesByTo
+
+const excludedPaths = ['admin', 'docs', 'api'] as const
+
+type PublicRoutePath = Exclude<
+  RoutePath,
+  `${string}${(typeof excludedPaths)[number]}${string}`
+>
+
+type TranslatedPathname = {
+  pattern: string
+  localized: Array<[Locale, string]>
+}
+
+function toUrlPattern(path: string) {
+  return (
+    path
+      // catch-all
+      .replace(/\/\$$/, '/:path(.*)?')
+      // optional parameters: {-$param}
+      .replace(/\{-\$([a-zA-Z0-9_]+)\}/g, ':$1?')
+      // named parameters: $param
+      .replace(/\$([a-zA-Z0-9_]+)/g, ':$1')
+      // remove trailing slash
+      .replace(/\/+$/, '')
+  )
+}
+
+function createTranslatedPathnames(
+  input: Record<PublicRoutePath, Record<Locale, string>>,
+): TranslatedPathname[] {
+  return Object.entries(input).map(([pattern, locales]) => ({
+    pattern: toUrlPattern(pattern),
+    localized: Object.entries(locales).map(
+      ([locale, path]) =>
+        [locale as Locale, `/${locale}${toUrlPattern(path)}`] satisfies [
+          Locale,
+          string,
+        ],
+    ),
+  }))
+}
+
+export const translatedPathnames = createTranslatedPathnames({
+  '/': {
+    en: '/',
+    de: '/',
+  },
+  '/about': {
+    en: '/about',
+    de: '/ueber',
+  },
+})
diff --git a/e2e/react-start/i18n-paraglide/tests/navigation.spec.ts b/e2e/react-start/i18n-paraglide/tests/navigation.spec.ts
new file mode 100644
index 0000000000..ebb1890049
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/tests/navigation.spec.ts
@@ -0,0 +1,101 @@
+import { expect, test } from '@playwright/test'
+
+test('should not cause redirect loops when accessing the home page', async ({
+  page,
+}) => {
+  // This test verifies that accessing the root URL does not cause a redirect loop
+  // The issue is that with i18n rewrites, the server may keep redirecting between
+  // / and /en (or similar locale prefixed paths) causing "too many redirects"
+
+  // Navigate to the root - should eventually land on a locale-prefixed page
+  await page.goto('/')
+  await page.waitForLoadState('networkidle')
+
+  // Verify the page loaded successfully and shows content
+  expect(await page.getByText('Hello world').first().isVisible()).toBe(true)
+})
+
+test('should not cause redirect loops when accessing locale-prefixed home page', async ({
+  page,
+}) => {
+  // Navigate to the English home page
+  await page.goto('/en')
+  await page.waitForLoadState('networkidle')
+
+  // Verify the page loaded successfully
+  expect(await page.getByText('Hello world').first().isVisible()).toBe(true)
+})
+
+test('should not cause redirect loops when accessing German home page', async ({
+  page,
+}) => {
+  // Navigate to the German home page
+  await page.goto('/de')
+  await page.waitForLoadState('networkidle')
+
+  // Verify the page loaded successfully - German message
+  expect(await page.getByText('Guten Tag').first().isVisible()).toBe(true)
+})
+
+test('should navigate between locales without redirect loops', async ({
+  page,
+}) => {
+  // Start at English page
+  await page.goto('/en')
+  await page.waitForLoadState('networkidle')
+
+  // Click the German locale button
+  await page.getByRole('button', { name: 'de' }).click()
+  await page.waitForLoadState('networkidle')
+
+  // Verify we're now on the German page
+  expect(page.url()).toContain('/de')
+  expect(await page.getByText('Guten Tag').first().isVisible()).toBe(true)
+})
+
+test('server-side navigation to about page should not cause redirect loops', async ({
+  page,
+}) => {
+  // Navigate directly to English about page
+  await page.goto('/en/about')
+  await page.waitForLoadState('networkidle')
+
+  // Verify the page loaded successfully
+  expect(await page.getByText('About message').isVisible()).toBe(true)
+})
+
+test('server-side navigation to German about page should not cause redirect loops', async ({
+  page,
+}) => {
+  // Navigate directly to German about page (translated path)
+  await page.goto('/de/ueber')
+  await page.waitForLoadState('networkidle')
+
+  // Verify the page loaded successfully by checking the URL
+  expect(page.url()).toContain('/de/ueber')
+
+  // Verify the page content loaded - check for the German nav link which is always present
+  // The about page also contains "Über uns" as the content
+  await expect(page.locator('a[href="/de/ueber"]')).toBeVisible()
+})
+
+test('check redirect behavior does not loop', async ({ page }) => {
+  // Test that requesting the root without locale prefix works with a single redirect
+  const response = await page.request.get('/', { maxRedirects: 0 })
+
+  // We expect either a 200 (if no redirect needed) or a redirect to a locale-prefixed path
+  const status = response.status()
+  if (status >= 300 && status < 400) {
+    const location = response.headers()['location']
+    // The redirect should be to a locale-prefixed path
+    expect(location).toMatch(/^\/(en|de)/)
+
+    // Following the redirect should not cause another redirect loop
+    const followUp = await page.request.get(location!, { maxRedirects: 0 })
+    // The follow-up should be a 200 or another valid response, not another redirect to the same location
+    expect(followUp.status()).toBeLessThan(400)
+  } else {
+    // If no redirect, the page should load successfully
+    expect(status).toBe(200)
+  }
+})
diff --git a/e2e/react-start/i18n-paraglide/tsconfig.json b/e2e/react-start/i18n-paraglide/tsconfig.json
new file mode 100644
index 0000000000..3e42c72626
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/tsconfig.json
@@ -0,0 +1,29 @@
+{
+  "include": ["**/*.ts", "**/*.tsx"],
+  "compilerOptions": {
+    "target": "ES2022",
+    "jsx": "react-jsx",
+    "module": "ESNext",
+    "lib": ["ES2022", "DOM", "DOM.Iterable"],
+    "types": ["vite/client"],
+    "allowJs": true,
+
+    /* Bundler mode */
+    "moduleResolution": "bundler",
+    "allowImportingTsExtensions": true,
+    "verbatimModuleSyntax": false,
+    "noEmit": true,
+
+    /* Linting */
+    "skipLibCheck": true,
+    "strict": true,
+    "noUnusedLocals": true,
+    "noUnusedParameters": true,
+    "noFallthroughCasesInSwitch": true,
+    "noUncheckedSideEffectImports": true,
+    "baseUrl": ".",
+    "paths": {
+      "@/*": ["./src/*"]
+    }
+  }
+}
diff --git a/e2e/react-start/i18n-paraglide/vite.config.ts b/e2e/react-start/i18n-paraglide/vite.config.ts
new file mode 100644
index 0000000000..a0d8a6f77e
--- /dev/null
+++ b/e2e/react-start/i18n-paraglide/vite.config.ts
@@ -0,0 +1,47 @@
+import { paraglideVitePlugin } from '@inlang/paraglide-js'
+import { defineConfig } from 'vite'
+import { tanstackStart } from '@tanstack/react-start/plugin/vite'
+import viteReact from '@vitejs/plugin-react'
+import viteTsConfigPaths from 'vite-tsconfig-paths'
+import tailwindcss from '@tailwindcss/vite'
+
+const config = defineConfig({
+  plugins: [
+    paraglideVitePlugin({
+      project: './project.inlang',
+      outdir: './src/paraglide',
+      outputStructure: 'message-modules',
+      cookieName: 'PARAGLIDE_LOCALE',
+      strategy: ['url', 'cookie', 'preferredLanguage', 'baseLocale'],
+      urlPatterns: [
+        {
+          pattern: '/',
+          localized: [
+            ['en', '/en'],
+            ['de', '/de'],
+          ],
+        },
+        {
+          pattern: '/about',
+          localized: [
+            ['en', '/en/about'],
+            ['de', '/de/ueber'],
+          ],
+        },
+        {
+          pattern: '/:path(.*)?',
+          localized: [
+            ['en', '/en/:path(.*)?'],
+            ['de', '/de/:path(.*)?'],
+          ],
+        },
+      ],
+    }),
+    viteTsConfigPaths(),
+    tanstackStart(),
+    viteReact(),
+    tailwindcss(),
+  ],
+})
+
+export default config
diff --git a/e2e/solid-start/custom-basepath/tests/navigation.spec.ts b/e2e/solid-start/custom-basepath/tests/navigation.spec.ts
index e66f14be9e..e238134d2e 100644
--- a/e2e/solid-start/custom-basepath/tests/navigation.spec.ts
+++ b/e2e/solid-start/custom-basepath/tests/navigation.spec.ts
@@ -61,14 +61,15 @@ test('server-side redirect', async ({ page, baseURL }) => {
   expect(page.url()).toBe(`${baseURL}/posts/1`)
 
   // do not follow redirects since we want to test the Location header
-  // first go to the route WITHOUT the base path, this will just add the base path
+  // Both requests (with or without basepath) should redirect directly to the final destination.
+  // The router is smart enough to skip the intermediate "add basepath" redirect and go
+  // straight to where the route's beforeLoad redirect points to.
   await page.request
     .get('/redirect/throw-it', { maxRedirects: 0 })
     .then((res) => {
       const headers = new Headers(res.headers())
-      expect(headers.get('location')).toBe('/custom/basepath/redirect/throw-it')
+      expect(headers.get('location')).toBe('/custom/basepath/posts/1')
     })
-  // now go to the route WITH the base path, this will redirect to the final destination
   await page.request
     .get('/custom/basepath/redirect/throw-it', { maxRedirects: 0 })
     .then((res) => {
diff --git a/e2e/vue-start/custom-basepath/tests/navigation.spec.ts b/e2e/vue-start/custom-basepath/tests/navigation.spec.ts
index e66f14be9e..e238134d2e 100644
--- a/e2e/vue-start/custom-basepath/tests/navigation.spec.ts
+++ b/e2e/vue-start/custom-basepath/tests/navigation.spec.ts
@@ -61,14 +61,15 @@ test('server-side redirect', async ({ page, baseURL }) => {
   expect(page.url()).toBe(`${baseURL}/posts/1`)
 
   // do not follow redirects since we want to test the Location header
-  // first go to the route WITHOUT the base path, this will just add the base path
+  // Both requests (with or without basepath) should redirect directly to the final destination.
+  // The router is smart enough to skip the intermediate "add basepath" redirect and go
+  // straight to where the route's beforeLoad redirect points to.
   await page.request
     .get('/redirect/throw-it', { maxRedirects: 0 })
     .then((res) => {
       const headers = new Headers(res.headers())
-      expect(headers.get('location')).toBe('/custom/basepath/redirect/throw-it')
+      expect(headers.get('location')).toBe('/custom/basepath/posts/1')
     })
-  // now go to the route WITH the base path, this will redirect to the final destination
   await page.request
     .get('/custom/basepath/redirect/throw-it', { maxRedirects: 0 })
     .then((res) => {
diff --git a/packages/react-router/src/Transitioner.tsx b/packages/react-router/src/Transitioner.tsx
index f547cdd5f5..83fb46cfe0 100644
--- a/packages/react-router/src/Transitioner.tsx
+++ b/packages/react-router/src/Transitioner.tsx
@@ -52,9 +52,12 @@ export function Transitioner() {
       _includeValidateSearch: true,
     })
 
+    // Check if the current URL matches the canonical form.
+    // Compare publicHref (browser-facing URL) for consistency with
+    // the server-side redirect check in router.beforeLoad.
     if (
-      trimPathRight(router.latestLocation.href) !==
-      trimPathRight(nextLocation.href)
+      trimPathRight(router.latestLocation.publicHref) !==
+      trimPathRight(nextLocation.publicHref)
     ) {
       router.commitLocation({ ...nextLocation, replace: true })
     }
diff --git a/packages/react-router/tests/router.test.tsx b/packages/react-router/tests/router.test.tsx
index 1228f83711..4708552d86 100644
--- a/packages/react-router/tests/router.test.tsx
+++ b/packages/react-router/tests/router.test.tsx
@@ -3124,6 +3124,247 @@ describe('Router rewrite functionality', () => {
 
     expect(history.location.pathname).toBe('/user')
   })
+
+  it('should not cause redirect loops with i18n locale prefix rewriting', async () => {
+    // This test simulates an i18n middleware that:
+    // - Input: strips locale prefix (e.g., /en/home -> /home)
+    // - Output: adds locale prefix back (e.g., /home -> /en/home)
+
+    const rootRoute = createRootRoute({
+      component: () => <Outlet />,
+    })
+
+    const homeRoute = createRoute({
+      getParentRoute: () => rootRoute,
+      path: '/home',
+      component: () => <div data-testid="home">Home</div>,
+    })
+
+    const routeTree = rootRoute.addChildren([homeRoute])
+
+    // The history starts at the public-facing locale-prefixed URL.
+    // The input rewrite strips the locale prefix for internal routing.
+    const history = createMemoryHistory({ initialEntries: ['/en/home'] })
+
+    const router = createRouter({
+      routeTree,
+      history,
+      rewrite: {
+        input: ({ url }) => {
+          // Strip locale prefix: /en/home -> /home
+          if (url.pathname.startsWith('/en')) {
+            url.pathname = url.pathname.replace(/^\/en/, '')
+          }
+          return url
+        },
+      },
+    })
+
+    render(<RouterProvider router={router} />)
+
+    await waitFor(() => {
+      expect(screen.getByTestId('home')).toBeInTheDocument()
+    })
+
+    // The internal pathname should be /home (after input rewrite strips /en)
+    expect(router.state.location.pathname).toBe('/home')
+
+    // The publicHref should include the locale prefix (via output rewrite)
+    // Since we only have input rewrite here, publicHref equals the internal href
+    expect(router.state.location.publicHref).toBe('/home')
+  })
+
+  it('should handle i18n rewriting with navigation between localized routes', async () => {
+    // Tests navigation between routes with i18n locale prefix rewriting
+
+    const rootRoute = createRootRoute({
+      component: () => <Outlet />,
+    })
+
+    const homeRoute = createRoute({
+      getParentRoute: () => rootRoute,
+      path: '/',
+      component: () => (
+        <div data-testid="home">
+          Home
+          <Link to="/about" data-testid="about-link">
+            About
+          </Link>
+        </div>
+      ),
+    })
+
+    const aboutRoute = createRoute({
+      getParentRoute: () => rootRoute,
+      path: '/about',
+      component: () => <div data-testid="about">About</div>,
+    })
+
+    const routeTree = rootRoute.addChildren([homeRoute, aboutRoute])
+
+    // Start at the public-facing locale-prefixed URL
+    const history = createMemoryHistory({ initialEntries: ['/en'] })
+
+    const router = createRouter({
+      routeTree,
+      history,
+      rewrite: {
+        input: ({ url }) => {
+          // Strip locale prefix
+          if (url.pathname.startsWith('/en')) {
+            url.pathname = url.pathname.replace(/^\/en/, '') || '/'
+            return url
+          }
+          return url
+        },
+        output: ({ url }) => {
+          // Add locale prefix
+          if (!url.pathname.startsWith('/en')) {
+            url.pathname = `/en${url.pathname === '/' ? '' : url.pathname}`
+            return url
+          }
+          return url
+        },
+      },
+    })
+
+    render(<RouterProvider router={router} />)
+
+    await waitFor(() => {
+      expect(screen.getByTestId('home')).toBeInTheDocument()
+    })
+
+    // Click the about link
+    const aboutLink = screen.getByTestId('about-link')
+    fireEvent.click(aboutLink)
+
+    await waitFor(() => {
+      expect(screen.getByTestId('about')).toBeInTheDocument()
+    })
+
+    // Internal pathname should be /about
+    expect(router.state.location.pathname).toBe('/about')
+
+    // Public href should be /en/about
+    expect(router.state.location.publicHref).toBe('/en/about')
+
+    // History should show the public-facing path
+    expect(history.location.pathname).toBe('/en/about')
+  })
+
+  it('should handle i18n rewriting with direct navigation to localized URL', async () => {
+    // Tests that navigating directly to a locale-prefixed URL works correctly
+
+    const rootRoute = createRootRoute({
+      component: () => <Outlet />,
+    })
+
+    const aboutRoute = createRoute({
+      getParentRoute: () => rootRoute,
+      path: '/about',
+      component: () => <div data-testid="about">About</div>,
+    })
+
+    const routeTree = rootRoute.addChildren([aboutRoute])
+
+    // Start at German locale-prefixed URL
+    const history = createMemoryHistory({ initialEntries: ['/de/about'] })
+
+    const router = createRouter({
+      routeTree,
+      history,
+      rewrite: {
+        input: ({ url }) => {
+          // Strip any locale prefix
+          const match = url.pathname.match(/^\/(en|de)(.*)$/)
+          if (match) {
+            url.pathname = match[2] || '/'
+            return url
+          }
+          return url
+        },
+        output: ({ url }) => {
+          // Default to German locale
+          if (!url.pathname.match(/^\/(en|de)/)) {
+            url.pathname = `/de${url.pathname === '/' ? '' : url.pathname}`
+            return url
+          }
+          return url
+        },
+      },
+    })
+
+    render(<RouterProvider router={router} />)
+
+    await waitFor(() => {
+      expect(screen.getByTestId('about')).toBeInTheDocument()
+    })
+
+    // Internal pathname should be /about (de-localized)
+    expect(router.state.location.pathname).toBe('/about')
+
+    // Public href should include locale
+    expect(router.state.location.publicHref).toBe('/de/about')
+  })
+
+  it('should maintain consistent publicHref between parseLocation and buildLocation', async () => {
+    // This test specifically verifies the fix for the redirect loop bug:
+    // parseLocation and buildLocation must compute the same publicHref
+    // for the same logical location.
+
+    const rootRoute = createRootRoute({
+      component: () => <Outlet />,
+    })
+
+    const homeRoute = createRoute({
+      getParentRoute: () => rootRoute,
+      path: '/',
+      component: () => <div data-testid="home">Home</div>,
+    })
+
+    const routeTree = rootRoute.addChildren([homeRoute])
+
+    // Start at the locale-prefixed URL
+    const history = createMemoryHistory({ initialEntries: ['/fr'] })
+
+    const router = createRouter({
+      routeTree,
+      history,
+      rewrite: {
+        input: ({ url }) => {
+          // De-localize: /fr -> /
+          if (url.pathname.startsWith('/fr')) {
+            url.pathname = url.pathname.replace(/^\/fr/, '') || '/'
+          }
+          return url
+        },
+        output: ({ url }) => {
+          // Re-localize: / -> /fr
+          if (!url.pathname.startsWith('/fr')) {
+            url.pathname = `/fr${url.pathname === '/' ? '' : url.pathname}`
+          }
+          return url
+        },
+      },
+    })
+
+    render(<RouterProvider router={router} />)
+
+    await waitFor(() => {
+      expect(screen.getByTestId('home')).toBeInTheDocument()
+    })
+
+    // Get the current location's publicHref (computed by parseLocation)
+    const parsedPublicHref = router.state.location.publicHref
+
+    // Build a location to the same path and check its publicHref
+    const builtLocation = router.buildLocation({ to: '/' })
+
+    // These must match - if they don't, the router will think it needs
+    // to redirect, causing an infinite loop
+    expect(parsedPublicHref).toBe(builtLocation.publicHref)
+    expect(parsedPublicHref).toBe('/fr')
+  })
 })
 
 describe('basepath', () => {
diff --git a/packages/router-core/src/router.ts b/packages/router-core/src/router.ts
index b0748bc2c0..eb846b0afa 100644
--- a/packages/router-core/src/router.ts
+++ b/packages/router-core/src/router.ts
@@ -1177,6 +1177,7 @@ export class RouterCore<
       // Before we do any processing, we need to allow rewrites to modify the URL
       // build up the full URL by combining the href from history with the router's origin
       const fullUrl = new URL(href, this.origin)
+
       const url = executeRewriteInput(this.rewrite, fullUrl)
 
       const parsedSearch = this.options.parseSearch(url.search)
@@ -1187,11 +1188,33 @@ export class RouterCore<
 
       const fullPath = url.href.replace(url.origin, '')
 
+      // Save the internal pathname for route matching (before output rewrite)
+      const internalPathname = url.pathname
+
+      // Compute publicHref by applying the output rewrite.
+      //
+      // The publicHref represents the URL as it should appear in the browser.
+      // This must match what buildLocation computes for the same logical route,
+      // otherwise the server-side redirect check will see a mismatch and trigger
+      // an infinite redirect loop.
+      //
+      // We always apply the output rewrite (not conditionally) because the
+      // incoming URL may have already been transformed by external middleware
+      // before reaching the router. In that case, the input rewrite has nothing
+      // to do, but we still need the output rewrite to reconstruct the correct
+      // public-facing URL.
+      //
+      // Clone the URL to avoid mutating the one used for route matching.
+      const urlForOutput = new URL(url.href)
+      const rewrittenUrl = executeRewriteOutput(this.rewrite, urlForOutput)
+      const publicHref =
+        rewrittenUrl.pathname + rewrittenUrl.search + rewrittenUrl.hash
+
       return {
         href: fullPath,
-        publicHref: href,
+        publicHref,
         url: url,
-        pathname: decodePath(url.pathname),
+        pathname: decodePath(internalPathname),
         searchStr,
         search: replaceEqualDeep(previousLocation?.search, parsedSearch) as any,
         hash: url.hash.split('#').reverse()[0] ?? '',
diff --git a/packages/solid-router/src/Transitioner.tsx b/packages/solid-router/src/Transitioner.tsx
index 1708f1bcb8..c9df0b2053 100644
--- a/packages/solid-router/src/Transitioner.tsx
+++ b/packages/solid-router/src/Transitioner.tsx
@@ -55,9 +55,12 @@ export function Transitioner() {
       _includeValidateSearch: true,
     })
 
+    // Check if the current URL matches the canonical form.
+    // Compare publicHref (browser-facing URL) for consistency with
+    // the server-side redirect check in router.beforeLoad.
     if (
-      trimPathRight(router.latestLocation.href) !==
-      trimPathRight(nextLocation.href)
+      trimPathRight(router.latestLocation.publicHref) !==
+      trimPathRight(nextLocation.publicHref)
     ) {
       router.commitLocation({ ...nextLocation, replace: true })
     }
diff --git a/packages/vue-router/src/Transitioner.tsx b/packages/vue-router/src/Transitioner.tsx
index 743ac6f7b8..4b4c231677 100644
--- a/packages/vue-router/src/Transitioner.tsx
+++ b/packages/vue-router/src/Transitioner.tsx
@@ -123,9 +123,12 @@ export function useTransitionerSetup() {
       _includeValidateSearch: true,
     })
 
+    // Check if the current URL matches the canonical form.
+    // Compare publicHref (browser-facing URL) for consistency with
+    // the server-side redirect check in router.beforeLoad.
     if (
-      trimPathRight(router.latestLocation.href) !==
-      trimPathRight(nextLocation.href)
+      trimPathRight(router.latestLocation.publicHref) !==
+      trimPathRight(nextLocation.publicHref)
     ) {
       router.commitLocation({ ...nextLocation, replace: true })
     }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ec29f2343b..7f824556f1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -726,6 +726,55 @@ importers:
         specifier: ^7.1.7
         version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)
 
+  e2e/react-router/i18n-paraglide:
+    dependencies:
+      '@tailwindcss/vite':
+        specifier: ^4.1.18
+        version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))
+      '@tanstack/react-router':
+        specifier: workspace:*
+        version: link:../../../packages/react-router
+      react:
+        specifier: ^19.2.0
+        version: 19.2.0
+      react-dom:
+        specifier: ^19.2.0
+        version: 19.2.0(react@19.2.0)
+      tailwindcss:
+        specifier: ^4.1.18
+        version: 4.1.18
+    devDependencies:
+      '@inlang/paraglide-js':
+        specifier: ^2.4.0
+        version: 2.4.0(babel-plugin-macros@3.1.0)
+      '@playwright/test':
+        specifier: ^1.56.1
+        version: 1.56.1
+      '@tanstack/router-e2e-utils':
+        specifier: workspace:^
+        version: link:../../e2e-utils
+      '@tanstack/router-plugin':
+        specifier: workspace:*
+        version: link:../../../packages/router-plugin
+      '@types/node':
+        specifier: 22.10.2
+        version: 22.10.2
+      '@types/react':
+        specifier: ^19.2.2
+        version: 19.2.2
+      '@types/react-dom':
+        specifier: ^19.2.2
+        version: 19.2.2(@types/react@19.2.2)
+      '@vitejs/plugin-react':
+        specifier: ^4.3.4
+        version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))
+      typescript:
+        specifier: ^5.7.2
+        version: 5.9.2
+      vite:
+        specifier: ^7.1.7
+        version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)
+
   e2e/react-router/js-only-file-based:
     dependencies:
       '@tailwindcss/vite':
@@ -1538,6 +1587,61 @@ importers:
         specifier: ^5.1.4
         version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))
 
+  e2e/react-start/i18n-paraglide:
+    dependencies:
+      '@tanstack/react-router':
+        specifier: workspace:*
+        version: link:../../../packages/react-router
+      '@tanstack/react-router-devtools':
+        specifier: workspace:^
+        version: link:../../../packages/react-router-devtools
+      '@tanstack/react-start':
+        specifier: workspace:*
+        version: link:../../../packages/react-start
+      react:
+        specifier: ^19.2.0
+        version: 19.2.0
+      react-dom:
+        specifier: ^19.2.0
+        version: 19.2.0(react@19.2.0)
+    devDependencies:
+      '@inlang/paraglide-js':
+        specifier: ^2.4.0
+        version: 2.4.0(babel-plugin-macros@3.1.0)
+      '@playwright/test':
+        specifier: ^1.56.1
+        version: 1.56.1
+      '@tailwindcss/vite':
+        specifier: ^4.1.18
+        version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))
+      '@tanstack/router-e2e-utils':
+        specifier: workspace:^
+        version: link:../../e2e-utils
+      '@types/node':
+        specifier: 22.10.2
+        version: 22.10.2
+      '@types/react':
+        specifier: ^19.2.2
+        version: 19.2.2
+      '@types/react-dom':
+        specifier: ^19.2.2
+        version: 19.2.2(@types/react@19.2.2)
+      '@vitejs/plugin-react':
+        specifier: ^4.3.4
+        version: 4.7.0(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))
+      tailwindcss:
+        specifier: ^4.1.18
+        version: 4.1.18
+      typescript:
+        specifier: ^5.7.2
+        version: 5.9.2
+      vite:
+        specifier: ^7.1.7
+        version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)
+      vite-tsconfig-paths:
+        specifier: ^5.1.4
+        version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))
+
   e2e/react-start/query-integration:
     dependencies:
       '@tanstack/react-query':
@@ -10167,7 +10271,7 @@ importers:
     devDependencies:
       '@netlify/vite-plugin-tanstack-start':
         specifier: ^1.1.4
-        version: 1.1.4(@tanstack/solid-start@packages+solid-start)(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))
+        version: 1.1.4(@tanstack/solid-start@packages+solid-start)(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(encoding@0.1.13)(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))
       '@tailwindcss/vite':
         specifier: ^4.1.18
         version: 4.1.18(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))
@@ -26395,13 +26499,13 @@ snapshots:
       uuid: 11.1.0
       write-file-atomic: 5.0.1
 
-  '@netlify/dev@4.6.3(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(rollup@4.52.5)':
+  '@netlify/dev@4.6.3(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(encoding@0.1.13)(ioredis@5.8.0)(rollup@4.52.5)':
     dependencies:
       '@netlify/blobs': 10.1.0
       '@netlify/config': 23.2.0
       '@netlify/dev-utils': 4.3.0
       '@netlify/edge-functions-dev': 1.0.0
-      '@netlify/functions-dev': 1.0.0(rollup@4.52.5)
+      '@netlify/functions-dev': 1.0.0(encoding@0.1.13)(rollup@4.52.5)
       '@netlify/headers': 2.1.0
       '@netlify/images': 1.3.0(@netlify/blobs@10.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)
       '@netlify/redirects': 3.1.0
@@ -26469,12 +26573,12 @@ snapshots:
     dependencies:
       '@netlify/types': 2.1.0
 
-  '@netlify/functions-dev@1.0.0(rollup@4.52.5)':
+  '@netlify/functions-dev@1.0.0(encoding@0.1.13)(rollup@4.52.5)':
     dependencies:
       '@netlify/blobs': 10.1.0
       '@netlify/dev-utils': 4.3.0
       '@netlify/functions': 5.0.0
-      '@netlify/zip-it-and-ship-it': 14.1.11(rollup@4.52.5)
+      '@netlify/zip-it-and-ship-it': 14.1.11(encoding@0.1.13)(rollup@4.52.5)
       cron-parser: 4.9.0
       decache: 4.6.2
       extract-zip: 2.0.1
@@ -26564,9 +26668,9 @@ snapshots:
 
   '@netlify/types@2.1.0': {}
 
-  '@netlify/vite-plugin-tanstack-start@1.1.4(@tanstack/solid-start@packages+solid-start)(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))':
+  '@netlify/vite-plugin-tanstack-start@1.1.4(@tanstack/solid-start@packages+solid-start)(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(encoding@0.1.13)(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))':
     dependencies:
-      '@netlify/vite-plugin': 2.7.4(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))
+      '@netlify/vite-plugin': 2.7.4(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(encoding@0.1.13)(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))
       vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)
     optionalDependencies:
       '@tanstack/solid-start': link:packages/solid-start
@@ -26594,9 +26698,9 @@ snapshots:
       - supports-color
       - uploadthing
 
-  '@netlify/vite-plugin@2.7.4(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))':
+  '@netlify/vite-plugin@2.7.4(babel-plugin-macros@3.1.0)(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(encoding@0.1.13)(ioredis@5.8.0)(rollup@4.52.5)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1))':
     dependencies:
-      '@netlify/dev': 4.6.3(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(ioredis@5.8.0)(rollup@4.52.5)
+      '@netlify/dev': 4.6.3(db0@0.3.4(@electric-sql/pglite@0.3.2)(@libsql/client@0.15.15)(mysql2@3.15.3))(encoding@0.1.13)(ioredis@5.8.0)(rollup@4.52.5)
       '@netlify/dev-utils': 4.3.0
       dedent: 1.7.0(babel-plugin-macros@3.1.0)
       vite: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)
@@ -26624,13 +26728,13 @@ snapshots:
       - supports-color
       - uploadthing
 
-  '@netlify/zip-it-and-ship-it@14.1.11(rollup@4.52.5)':
+  '@netlify/zip-it-and-ship-it@14.1.11(encoding@0.1.13)(rollup@4.52.5)':
     dependencies:
       '@babel/parser': 7.28.5
       '@babel/types': 7.28.4
       '@netlify/binary-info': 1.0.0
       '@netlify/serverless-functions-api': 2.7.1
-      '@vercel/nft': 0.29.4(rollup@4.52.5)
+      '@vercel/nft': 0.29.4(encoding@0.1.13)(rollup@4.52.5)
       archiver: 7.0.1
       common-path-prefix: 3.0.0
       copy-file: 11.1.0
@@ -29731,7 +29835,7 @@ snapshots:
   '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
     optional: true
 
-  '@vercel/nft@0.29.4(rollup@4.52.5)':
+  '@vercel/nft@0.29.4(encoding@0.1.13)(rollup@4.52.5)':
     dependencies:
       '@mapbox/node-pre-gyp': 2.0.0(encoding@0.1.13)
       '@rollup/pluginutils': 5.1.4(rollup@4.52.5)
