diff --git a/docs/router/config.json b/docs/router/config.json
index dc742a73cfb..dcdcb378ef7 100644
--- a/docs/router/config.json
+++ b/docs/router/config.json
@@ -681,6 +681,10 @@
{
"label": "With tRPC",
"to": "framework/solid/examples/with-trpc"
+ },
+ {
+ "label": "Monorepo with Solid Query",
+ "to": "framework/solid/examples/router-monorepo-solid-query"
}
]
}
diff --git a/examples/solid/router-monorepo-solid-query/.gitignore b/examples/solid/router-monorepo-solid-query/.gitignore
new file mode 100644
index 00000000000..e5cc582a454
--- /dev/null
+++ b/examples/solid/router-monorepo-solid-query/.gitignore
@@ -0,0 +1,12 @@
+node_modules
+.DS_Store
+dist
+dist-ssr
+*.local
+*.js
+
+/test-results/
+/playwright-report/
+/blob-report/
+/playwright/.cache/
+pnpm-workspace.yaml
\ No newline at end of file
diff --git a/examples/solid/router-monorepo-solid-query/.stackblitzrc b/examples/solid/router-monorepo-solid-query/.stackblitzrc
new file mode 100644
index 00000000000..5cedc82a840
--- /dev/null
+++ b/examples/solid/router-monorepo-solid-query/.stackblitzrc
@@ -0,0 +1,3 @@
+{
+ "startCommand": "cp pnpm-workspace.yaml.example pnpm-workspace.yaml && pnpm install && pnpm dev"
+}
diff --git a/examples/solid/router-monorepo-solid-query/.vscode/settings.json b/examples/solid/router-monorepo-solid-query/.vscode/settings.json
new file mode 100644
index 00000000000..00b5278e580
--- /dev/null
+++ b/examples/solid/router-monorepo-solid-query/.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/examples/solid/router-monorepo-solid-query/README.md b/examples/solid/router-monorepo-solid-query/README.md
new file mode 100644
index 00000000000..58610fb1e89
--- /dev/null
+++ b/examples/solid/router-monorepo-solid-query/README.md
@@ -0,0 +1,31 @@
+# Example of a monorepo with router and feature libraries
+
+To run this example:
+
+- `npm install` or `yarn`
+- `npm dev` or `yarn dev`
+
+A challenge with TanStack Router in a monorepo setup is that it requires TypeScript type augmentations. However, if you set this up directly in the final app, the links inside the libraries won’t be type-safe. To solve this in a monorepo, you need a separate library just for the router, without any components, and then integrate it with the app.
+
+This example showcases this approach using the following packages:
+
+- `packages/router` is the router library
+- `packages/post-query` is the post query collection library
+- `packages/post-feature` is the posts ui library
+- `packages/app` is the app
+
+With this approach, we can use the query options from the data library both in the router and the feature library without creating circular dependencies.
+
+Since the router library re-exports the router components, importing them in the feature library ensures they remain type-safe, as they’re linked to the TypeScript augmentations.
+
+Finally, in the app, we can create a map of routes to components ([`packages/app/src/main.tsx`](./packages/app/src/main.tsx)), which ties the router to the components. **We could enforce lazy loading here, but it was left out for simplicity.** With this setup, we now have a fully type-safe router!
+
+Here is what it looks like in the monorepo:
+
+
+
+## Stackblitz limitation
+
+### TypeScript IDE feedback
+
+Due to a limitation on Stackblitz, the example's types are not properly inferred in the IDE, however as soon as you click on fork in the bottom right corner, the types should be correctly inferred.
diff --git a/examples/solid/router-monorepo-solid-query/assets/graph.png b/examples/solid/router-monorepo-solid-query/assets/graph.png
new file mode 100644
index 00000000000..1dcfd81f476
Binary files /dev/null and b/examples/solid/router-monorepo-solid-query/assets/graph.png differ
diff --git a/examples/solid/router-monorepo-solid-query/package.json b/examples/solid/router-monorepo-solid-query/package.json
new file mode 100644
index 00000000000..9553e5ddf30
--- /dev/null
+++ b/examples/solid/router-monorepo-solid-query/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "router-solid-monorepo-solid-query",
+ "version": "1.0.0",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "post-query": "pnpm --filter @router-solid-mono-solid-query/post-query",
+ "post-feature": "pnpm --filter @router-solid-mono-solid-query/post-feature",
+ "router": "pnpm --filter @router-solid-mono-solid-query/router",
+ "app": "pnpm --filter @router-solid-mono-solid-query/app",
+ "dev": "pnpm post-query build && pnpm router build && pnpm post-feature build && pnpm app dev"
+ },
+ "dependencies": {
+ "@tanstack/solid-query": "^5.90.0",
+ "@tanstack/solid-query-devtools": "^5.90.0",
+ "@tanstack/solid-router": "^1.135.2",
+ "@tanstack/solid-router-devtools": "^1.135.2",
+ "@tanstack/router-plugin": "^1.135.2",
+ "solid-js": "^1.9.10",
+ "redaxios": "^0.5.1"
+ },
+ "devDependencies": {
+ "@types/node": "^22.10.2",
+ "typescript": "^5.7.2",
+ "vite-plugin-solid": "^2.11.10",
+ "vite": "^7.1.7",
+ "vite-plugin-dts": "^4.5.4"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC"
+}
diff --git a/examples/solid/router-monorepo-solid-query/packages/app/index.html b/examples/solid/router-monorepo-solid-query/packages/app/index.html
new file mode 100644
index 00000000000..9b6335c0ac1
--- /dev/null
+++ b/examples/solid/router-monorepo-solid-query/packages/app/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Vite App
+
+
+
+
+
+
diff --git a/examples/solid/router-monorepo-solid-query/packages/app/package.json b/examples/solid/router-monorepo-solid-query/packages/app/package.json
new file mode 100644
index 00000000000..ed728b34759
--- /dev/null
+++ b/examples/solid/router-monorepo-solid-query/packages/app/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "@router-solid-mono-solid-query/app",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vite --port=3001",
+ "build": "vite build && tsc --noEmit",
+ "serve": "vite preview",
+ "start": "vite"
+ },
+ "dependencies": {
+ "@tanstack/solid-query": "^5.90.0",
+ "@router-solid-mono-solid-query/post-feature": "workspace:*",
+ "@router-solid-mono-solid-query/router": "workspace:*",
+ "solid-js": "^1.9.10"
+ },
+ "devDependencies": {
+ "vite-plugin-solid": "^2.11.10",
+ "typescript": "^5.7.2",
+ "@tanstack/solid-router-devtools": "^1.135.2",
+ "postcss": "^8.5.1",
+ "autoprefixer": "^10.4.20",
+ "tailwindcss": "^3.4.17",
+ "vite": "^7.1.7",
+ "vite-plugin-dts": "^4.5.4"
+ },
+ "nx": {
+ "targets": {
+ "dev": {
+ "dependsOn": [
+ "^build"
+ ]
+ }
+ }
+ }
+}
diff --git a/examples/solid/router-monorepo-solid-query/packages/app/src/main.tsx b/examples/solid/router-monorepo-solid-query/packages/app/src/main.tsx
new file mode 100644
index 00000000000..8740ce06a79
--- /dev/null
+++ b/examples/solid/router-monorepo-solid-query/packages/app/src/main.tsx
@@ -0,0 +1,60 @@
+import { render } from 'solid-js/web'
+import { RouterProvider } from '@tanstack/solid-router'
+import { QueryClientProvider } from '@tanstack/solid-query'
+import { queryClient, router } from '@router-solid-mono-solid-query/router'
+import {
+ PostErrorComponent,
+ PostIdComponent,
+ PostsListComponent,
+} from '@router-solid-mono-solid-query/post-feature'
+import { RootComponent } from './rootComponent'
+import type { RouterIds } from '@router-solid-mono-solid-query/router'
+import './style.css'
+import type { JSX } from 'solid-js'
+// Not lazy loaded for simplicity, but you could expose from your library component
+// individually, and enforce here to use react lazy components via typings
+// so that you have code splitting
+const routerMap = {
+ '/': PostsListComponent,
+ '/$postId': PostIdComponent,
+ __root__: RootComponent,
+} as const satisfies Record JSX.Element>
+
+Object.entries(routerMap).forEach(([path, component]) => {
+ const foundRoute = router.routesById[path as RouterIds]
+
+ foundRoute.update({
+ component: component,
+ })
+})
+
+// And you can do the same logic with custom error pages, and any other properties
+const errorComponentMap = {
+ '/': null,
+ '/$postId': PostErrorComponent,
+ __root__: null,
+}
+
+Object.entries(errorComponentMap).forEach(([path, component]) => {
+ if (!component) {
+ return
+ }
+
+ const foundRoute = router.routesById[path as RouterIds]
+ foundRoute.update({
+ errorComponent: component,
+ })
+})
+
+const rootElement = document.getElementById('app')!
+
+if (!rootElement.innerHTML) {
+ render(
+ () => (
+
+
+
+ ),
+ rootElement,
+ )
+}
diff --git a/examples/solid/router-monorepo-solid-query/packages/app/src/rootComponent.tsx b/examples/solid/router-monorepo-solid-query/packages/app/src/rootComponent.tsx
new file mode 100644
index 00000000000..294d380fdd7
--- /dev/null
+++ b/examples/solid/router-monorepo-solid-query/packages/app/src/rootComponent.tsx
@@ -0,0 +1,25 @@
+import { Link, Outlet } from '@router-solid-mono-solid-query/router'
+import { TanStackRouterDevtools } from '@tanstack/solid-router-devtools'
+import { SolidQueryDevtools } from '@tanstack/solid-query-devtools'
+
+export function RootComponent() {
+ return (
+ <>
+