From 06ca6179eea967904320c97a942aed9eea33ce02 Mon Sep 17 00:00:00 2001 From: Tanner Linsley Date: Mon, 4 May 2026 15:48:09 -0600 Subject: [PATCH 1/5] feat(remix): scaffold remix-router, remix-start, and basic example Adds a 'remix' target option to router-generator and introduces two new packages plus a basic example exercising the new target. Preserves WIP that was at risk of being dropped from the clever-ellis-6fe30d worktree. --- examples/remix/basic/README.md | 89 ++++ examples/remix/basic/index.html | 12 + examples/remix/basic/package.json | 22 + examples/remix/basic/server.ts | 52 ++ examples/remix/basic/src/client.tsx | 23 + .../basic/src/components/IslandCounter.tsx | 57 +++ .../src/components/LabErrorComponent.tsx | 33 ++ examples/remix/basic/src/routeTree.ts | 12 + examples/remix/basic/src/router.ts | 13 + examples/remix/basic/src/routes/__root.tsx | 60 +++ examples/remix/basic/src/routes/admin.tsx | 33 ++ ...dmin.users.$userId.sessions.$sessionId.tsx | 41 ++ .../basic/src/routes/admin.users.$userId.tsx | 64 +++ .../remix/basic/src/routes/admin.users.tsx | 52 ++ examples/remix/basic/src/routes/catalog.tsx | 159 ++++++ examples/remix/basic/src/routes/counter.tsx | 37 ++ examples/remix/basic/src/routes/deferred.tsx | 110 ++++ examples/remix/basic/src/routes/guestbook.tsx | 128 +++++ examples/remix/basic/src/routes/lab.error.tsx | 26 + .../remix/basic/src/routes/lab.missing.tsx | 36 ++ .../basic/src/routes/lab.render-error.tsx | 23 + examples/remix/basic/src/routes/lab.tsx | 49 ++ .../remix/basic/src/routes/posts.$slug.tsx | 22 + examples/remix/basic/src/routes/posts.tsx | 46 ++ examples/remix/basic/src/routes/slow.tsx | 62 +++ examples/remix/basic/src/routes/streaming.tsx | 67 +++ examples/remix/basic/src/routes/users.$id.tsx | 30 ++ examples/remix/basic/src/routes/users.tsx | 54 ++ examples/remix/basic/src/server/guestbook.ts | 60 +++ examples/remix/basic/src/server/heavyDep.ts | 134 +++++ examples/remix/basic/src/server/markdown.ts | 65 +++ .../remix/basic/src/server/postRenderer.ts | 32 ++ examples/remix/basic/src/server/posts.ts | 131 +++++ examples/remix/basic/src/server/renderers.ts | 74 +++ .../remix/basic/src/server/userRenderer.ts | 49 ++ examples/remix/basic/tsconfig.json | 20 + examples/remix/basic/vite.config.ts | 16 + packages/remix-router/PHILOSOPHY.md | 53 ++ packages/remix-router/README.md | 108 ++++ packages/remix-router/RSC.md | 150 ++++++ packages/remix-router/START.md | 189 +++++++ packages/remix-router/example/README.md | 38 ++ packages/remix-router/example/package.json | 16 + packages/remix-router/example/server.mjs | 21 + .../remix-router/example/src/entry.client.ts | 18 + .../remix-router/example/src/entry.client.tsx | 9 + .../remix-router/example/src/routeTree.ts | 9 + packages/remix-router/example/src/router.ts | 8 + .../example/src/routes/__root.tsx | 26 + .../remix-router/example/src/routes/index.tsx | 23 + .../example/src/routes/users.$id.tsx | 37 ++ .../remix-router/example/src/routes/users.tsx | 52 ++ packages/remix-router/package.json | 81 +++ packages/remix-router/src/Asset.tsx | 47 ++ packages/remix-router/src/CatchBoundary.tsx | 117 +++++ packages/remix-router/src/ClientLink.tsx | 145 ++++++ packages/remix-router/src/ClientOnly.tsx | 48 ++ packages/remix-router/src/FrameOutlet.tsx | 55 ++ packages/remix-router/src/HeadContent.tsx | 42 ++ packages/remix-router/src/Link.tsx | 483 ++++++++++++++++++ packages/remix-router/src/Match.tsx | 88 ++++ packages/remix-router/src/MatchContext.tsx | 41 ++ packages/remix-router/src/MatchRoute.tsx | 58 +++ packages/remix-router/src/Matches.tsx | 67 +++ packages/remix-router/src/Navigate.tsx | 40 ++ packages/remix-router/src/Outlet.tsx | 37 ++ packages/remix-router/src/RouterProvider.tsx | 75 +++ packages/remix-router/src/ScriptOnce.tsx | 28 + packages/remix-router/src/Scripts.tsx | 90 ++++ .../remix-router/src/ScrollRestoration.tsx | 51 ++ packages/remix-router/src/Transitioner.tsx | 116 +++++ packages/remix-router/src/accessors.ts | 94 ++++ packages/remix-router/src/activeRouter.ts | 31 ++ packages/remix-router/src/awaited.tsx | 149 ++++++ packages/remix-router/src/createRouter.ts | 53 ++ packages/remix-router/src/extensions.ts | 69 +++ packages/remix-router/src/fileRoute.ts | 204 ++++++++ packages/remix-router/src/headContentUtils.ts | 176 +++++++ packages/remix-router/src/history.ts | 16 + packages/remix-router/src/index.ts | 219 ++++++++ .../remix-router/src/lazyRouteComponent.tsx | 80 +++ packages/remix-router/src/linkInternals.ts | 89 ++++ packages/remix-router/src/mountRouter.ts | 43 ++ packages/remix-router/src/not-found.tsx | 61 +++ .../remix-router/src/renderRouteNotFound.tsx | 32 ++ packages/remix-router/src/route.ts | 428 ++++++++++++++++ packages/remix-router/src/routeApi.ts | 98 ++++ packages/remix-router/src/routerStores.ts | 98 ++++ packages/remix-router/src/server.tsx | 317 ++++++++++++ packages/remix-router/src/serverComponent.tsx | 206 ++++++++ .../remix-router/src/serverComponentClient.ts | 221 ++++++++ .../src/serverComponentEndpoint.ts | 162 ++++++ .../remix-router/src/serverComponentSSR.tsx | 158 ++++++ .../remix-router/src/ssr/RouterClient.tsx | 35 ++ .../remix-router/src/ssr/RouterServer.tsx | 21 + packages/remix-router/src/ssr/client.ts | 5 + .../src/ssr/defaultRenderHandler.tsx | 21 + .../src/ssr/defaultStreamHandler.tsx | 24 + .../src/ssr/renderRouterToStream.tsx | 255 +++++++++ .../src/ssr/renderRouterToString.tsx | 77 +++ packages/remix-router/src/ssr/server.ts | 38 ++ .../remix-router/src/structuralSharing.ts | 45 ++ packages/remix-router/src/subscribe.ts | 111 ++++ packages/remix-router/src/typePrimitives.ts | 82 +++ packages/remix-router/src/useBlocker.ts | 409 +++++++++++++++ packages/remix-router/src/useCanGoBack.ts | 16 + packages/remix-router/src/useLinkProps.ts | 296 +++++++++++ packages/remix-router/src/useLoaderData.ts | 59 +++ packages/remix-router/src/useLoaderDeps.ts | 54 ++ packages/remix-router/src/useLocation.ts | 53 ++ packages/remix-router/src/useMatch.ts | 138 +++++ packages/remix-router/src/useMatches.ts | 160 ++++++ packages/remix-router/src/useNavigate.ts | 32 ++ packages/remix-router/src/useParams.ts | 77 +++ packages/remix-router/src/useRouteContext.ts | 30 ++ packages/remix-router/src/useRouter.ts | 29 ++ packages/remix-router/src/useRouterState.ts | 56 ++ packages/remix-router/src/useSearch.ts | 73 +++ .../remix-router/src/vite/clientEntries.ts | 183 +++++++ packages/remix-router/src/vite/index.ts | 36 ++ .../remix-router/src/vite/serverComponents.ts | 298 +++++++++++ .../remix-router/tests/clientEntry.test.tsx | 39 ++ .../remix-router/tests/dom/await.test.tsx | 191 +++++++ .../remix-router/tests/dom/blocker.test.tsx | 369 +++++++++++++ .../tests/dom/boundaries.test.tsx | 130 +++++ .../tests/dom/clientOnly.test.tsx | 81 +++ .../tests/dom/createRouterHandler.test.tsx | 120 +++++ .../remix-router/tests/dom/lazyRoute.test.tsx | 67 +++ packages/remix-router/tests/dom/link.test.tsx | 114 +++++ .../tests/dom/matchRoute.test.tsx | 96 ++++ .../tests/dom/navigation.test.tsx | 124 +++++ .../remix-router/tests/dom/nestedNav.test.tsx | 240 +++++++++ .../tests/dom/renderRouterToStream.test.tsx | 204 ++++++++ .../remix-router/tests/dom/router.test.tsx | 105 ++++ .../tests/dom/searchParams.test.tsx | 171 +++++++ .../tests/dom/serverComponent.test.tsx | 89 ++++ .../tests/dom/serverFnRedirect.test.tsx | 84 +++ .../remix-router/tests/dom/spaStress.test.tsx | 231 +++++++++ .../tests/dom/useMatchesHelpers.test.tsx | 146 ++++++ .../tests/dom/useRouteContext.test.tsx | 61 +++ packages/remix-router/tests/dom/wrap.test.tsx | 137 +++++ .../remix-router/tests/matchContext.test.ts | 75 +++ packages/remix-router/tests/route.test-d.ts | 60 +++ packages/remix-router/tests/router.test.ts | 193 +++++++ .../tests/serverComponent.test.tsx | 138 +++++ .../tests/serverComponentPlugin.test.ts | 162 ++++++ .../remix-router/tests/ssr.string.test.tsx | 149 ++++++ packages/remix-router/tests/ssr.test.tsx | 91 ++++ packages/remix-router/tests/subscribe.test.ts | 250 +++++++++ packages/remix-router/tsconfig.build.json | 11 + packages/remix-router/tsconfig.json | 14 + packages/remix-router/vitest.config.ts | 14 + packages/remix-start/README.md | 45 ++ packages/remix-start/package.json | 97 ++++ packages/remix-start/src/client-only.ts | 3 + packages/remix-start/src/client-rpc.ts | 1 + packages/remix-start/src/client.tsx | 41 ++ .../remix-start/src/default-entry/client.tsx | 14 + .../remix-start/src/default-entry/server.ts | 24 + .../remix-start/src/default-entry/start.ts | 7 + packages/remix-start/src/index.ts | 17 + packages/remix-start/src/plugin/shared.ts | 22 + packages/remix-start/src/plugin/vite.ts | 84 +++ packages/remix-start/src/server-only.ts | 3 + packages/remix-start/src/server-rpc.ts | 1 + packages/remix-start/src/server.tsx | 92 ++++ .../src/server/createStartHandler.ts | 105 ++++ packages/remix-start/src/server/index.ts | 19 + packages/remix-start/src/ssr-rpc.ts | 1 + packages/remix-start/src/useServerFn.ts | 47 ++ packages/remix-start/tsconfig.build.json | 10 + packages/remix-start/tsconfig.json | 13 + packages/router-generator/src/config.ts | 2 +- packages/router-generator/src/template.ts | 58 +++ .../core/code-splitter/framework-options.ts | 10 + packages/start-plugin-core/src/types.ts | 2 +- packages/start-server-core/src/index.tsx | 5 + pnpm-workspace.yaml | 1 + 178 files changed, 14854 insertions(+), 2 deletions(-) create mode 100644 examples/remix/basic/README.md create mode 100644 examples/remix/basic/index.html create mode 100644 examples/remix/basic/package.json create mode 100644 examples/remix/basic/server.ts create mode 100644 examples/remix/basic/src/client.tsx create mode 100644 examples/remix/basic/src/components/IslandCounter.tsx create mode 100644 examples/remix/basic/src/components/LabErrorComponent.tsx create mode 100644 examples/remix/basic/src/routeTree.ts create mode 100644 examples/remix/basic/src/router.ts create mode 100644 examples/remix/basic/src/routes/__root.tsx create mode 100644 examples/remix/basic/src/routes/admin.tsx create mode 100644 examples/remix/basic/src/routes/admin.users.$userId.sessions.$sessionId.tsx create mode 100644 examples/remix/basic/src/routes/admin.users.$userId.tsx create mode 100644 examples/remix/basic/src/routes/admin.users.tsx create mode 100644 examples/remix/basic/src/routes/catalog.tsx create mode 100644 examples/remix/basic/src/routes/counter.tsx create mode 100644 examples/remix/basic/src/routes/deferred.tsx create mode 100644 examples/remix/basic/src/routes/guestbook.tsx create mode 100644 examples/remix/basic/src/routes/lab.error.tsx create mode 100644 examples/remix/basic/src/routes/lab.missing.tsx create mode 100644 examples/remix/basic/src/routes/lab.render-error.tsx create mode 100644 examples/remix/basic/src/routes/lab.tsx create mode 100644 examples/remix/basic/src/routes/posts.$slug.tsx create mode 100644 examples/remix/basic/src/routes/posts.tsx create mode 100644 examples/remix/basic/src/routes/slow.tsx create mode 100644 examples/remix/basic/src/routes/streaming.tsx create mode 100644 examples/remix/basic/src/routes/users.$id.tsx create mode 100644 examples/remix/basic/src/routes/users.tsx create mode 100644 examples/remix/basic/src/server/guestbook.ts create mode 100644 examples/remix/basic/src/server/heavyDep.ts create mode 100644 examples/remix/basic/src/server/markdown.ts create mode 100644 examples/remix/basic/src/server/postRenderer.ts create mode 100644 examples/remix/basic/src/server/posts.ts create mode 100644 examples/remix/basic/src/server/renderers.ts create mode 100644 examples/remix/basic/src/server/userRenderer.ts create mode 100644 examples/remix/basic/tsconfig.json create mode 100644 examples/remix/basic/vite.config.ts create mode 100644 packages/remix-router/PHILOSOPHY.md create mode 100644 packages/remix-router/README.md create mode 100644 packages/remix-router/RSC.md create mode 100644 packages/remix-router/START.md create mode 100644 packages/remix-router/example/README.md create mode 100644 packages/remix-router/example/package.json create mode 100644 packages/remix-router/example/server.mjs create mode 100644 packages/remix-router/example/src/entry.client.ts create mode 100644 packages/remix-router/example/src/entry.client.tsx create mode 100644 packages/remix-router/example/src/routeTree.ts create mode 100644 packages/remix-router/example/src/router.ts create mode 100644 packages/remix-router/example/src/routes/__root.tsx create mode 100644 packages/remix-router/example/src/routes/index.tsx create mode 100644 packages/remix-router/example/src/routes/users.$id.tsx create mode 100644 packages/remix-router/example/src/routes/users.tsx create mode 100644 packages/remix-router/package.json create mode 100644 packages/remix-router/src/Asset.tsx create mode 100644 packages/remix-router/src/CatchBoundary.tsx create mode 100644 packages/remix-router/src/ClientLink.tsx create mode 100644 packages/remix-router/src/ClientOnly.tsx create mode 100644 packages/remix-router/src/FrameOutlet.tsx create mode 100644 packages/remix-router/src/HeadContent.tsx create mode 100644 packages/remix-router/src/Link.tsx create mode 100644 packages/remix-router/src/Match.tsx create mode 100644 packages/remix-router/src/MatchContext.tsx create mode 100644 packages/remix-router/src/MatchRoute.tsx create mode 100644 packages/remix-router/src/Matches.tsx create mode 100644 packages/remix-router/src/Navigate.tsx create mode 100644 packages/remix-router/src/Outlet.tsx create mode 100644 packages/remix-router/src/RouterProvider.tsx create mode 100644 packages/remix-router/src/ScriptOnce.tsx create mode 100644 packages/remix-router/src/Scripts.tsx create mode 100644 packages/remix-router/src/ScrollRestoration.tsx create mode 100644 packages/remix-router/src/Transitioner.tsx create mode 100644 packages/remix-router/src/accessors.ts create mode 100644 packages/remix-router/src/activeRouter.ts create mode 100644 packages/remix-router/src/awaited.tsx create mode 100644 packages/remix-router/src/createRouter.ts create mode 100644 packages/remix-router/src/extensions.ts create mode 100644 packages/remix-router/src/fileRoute.ts create mode 100644 packages/remix-router/src/headContentUtils.ts create mode 100644 packages/remix-router/src/history.ts create mode 100644 packages/remix-router/src/index.ts create mode 100644 packages/remix-router/src/lazyRouteComponent.tsx create mode 100644 packages/remix-router/src/linkInternals.ts create mode 100644 packages/remix-router/src/mountRouter.ts create mode 100644 packages/remix-router/src/not-found.tsx create mode 100644 packages/remix-router/src/renderRouteNotFound.tsx create mode 100644 packages/remix-router/src/route.ts create mode 100644 packages/remix-router/src/routeApi.ts create mode 100644 packages/remix-router/src/routerStores.ts create mode 100644 packages/remix-router/src/server.tsx create mode 100644 packages/remix-router/src/serverComponent.tsx create mode 100644 packages/remix-router/src/serverComponentClient.ts create mode 100644 packages/remix-router/src/serverComponentEndpoint.ts create mode 100644 packages/remix-router/src/serverComponentSSR.tsx create mode 100644 packages/remix-router/src/ssr/RouterClient.tsx create mode 100644 packages/remix-router/src/ssr/RouterServer.tsx create mode 100644 packages/remix-router/src/ssr/client.ts create mode 100644 packages/remix-router/src/ssr/defaultRenderHandler.tsx create mode 100644 packages/remix-router/src/ssr/defaultStreamHandler.tsx create mode 100644 packages/remix-router/src/ssr/renderRouterToStream.tsx create mode 100644 packages/remix-router/src/ssr/renderRouterToString.tsx create mode 100644 packages/remix-router/src/ssr/server.ts create mode 100644 packages/remix-router/src/structuralSharing.ts create mode 100644 packages/remix-router/src/subscribe.ts create mode 100644 packages/remix-router/src/typePrimitives.ts create mode 100644 packages/remix-router/src/useBlocker.ts create mode 100644 packages/remix-router/src/useCanGoBack.ts create mode 100644 packages/remix-router/src/useLinkProps.ts create mode 100644 packages/remix-router/src/useLoaderData.ts create mode 100644 packages/remix-router/src/useLoaderDeps.ts create mode 100644 packages/remix-router/src/useLocation.ts create mode 100644 packages/remix-router/src/useMatch.ts create mode 100644 packages/remix-router/src/useMatches.ts create mode 100644 packages/remix-router/src/useNavigate.ts create mode 100644 packages/remix-router/src/useParams.ts create mode 100644 packages/remix-router/src/useRouteContext.ts create mode 100644 packages/remix-router/src/useRouter.ts create mode 100644 packages/remix-router/src/useRouterState.ts create mode 100644 packages/remix-router/src/useSearch.ts create mode 100644 packages/remix-router/src/vite/clientEntries.ts create mode 100644 packages/remix-router/src/vite/index.ts create mode 100644 packages/remix-router/src/vite/serverComponents.ts create mode 100644 packages/remix-router/tests/clientEntry.test.tsx create mode 100644 packages/remix-router/tests/dom/await.test.tsx create mode 100644 packages/remix-router/tests/dom/blocker.test.tsx create mode 100644 packages/remix-router/tests/dom/boundaries.test.tsx create mode 100644 packages/remix-router/tests/dom/clientOnly.test.tsx create mode 100644 packages/remix-router/tests/dom/createRouterHandler.test.tsx create mode 100644 packages/remix-router/tests/dom/lazyRoute.test.tsx create mode 100644 packages/remix-router/tests/dom/link.test.tsx create mode 100644 packages/remix-router/tests/dom/matchRoute.test.tsx create mode 100644 packages/remix-router/tests/dom/navigation.test.tsx create mode 100644 packages/remix-router/tests/dom/nestedNav.test.tsx create mode 100644 packages/remix-router/tests/dom/renderRouterToStream.test.tsx create mode 100644 packages/remix-router/tests/dom/router.test.tsx create mode 100644 packages/remix-router/tests/dom/searchParams.test.tsx create mode 100644 packages/remix-router/tests/dom/serverComponent.test.tsx create mode 100644 packages/remix-router/tests/dom/serverFnRedirect.test.tsx create mode 100644 packages/remix-router/tests/dom/spaStress.test.tsx create mode 100644 packages/remix-router/tests/dom/useMatchesHelpers.test.tsx create mode 100644 packages/remix-router/tests/dom/useRouteContext.test.tsx create mode 100644 packages/remix-router/tests/dom/wrap.test.tsx create mode 100644 packages/remix-router/tests/matchContext.test.ts create mode 100644 packages/remix-router/tests/route.test-d.ts create mode 100644 packages/remix-router/tests/router.test.ts create mode 100644 packages/remix-router/tests/serverComponent.test.tsx create mode 100644 packages/remix-router/tests/serverComponentPlugin.test.ts create mode 100644 packages/remix-router/tests/ssr.string.test.tsx create mode 100644 packages/remix-router/tests/ssr.test.tsx create mode 100644 packages/remix-router/tests/subscribe.test.ts create mode 100644 packages/remix-router/tsconfig.build.json create mode 100644 packages/remix-router/tsconfig.json create mode 100644 packages/remix-router/vitest.config.ts create mode 100644 packages/remix-start/README.md create mode 100644 packages/remix-start/package.json create mode 100644 packages/remix-start/src/client-only.ts create mode 100644 packages/remix-start/src/client-rpc.ts create mode 100644 packages/remix-start/src/client.tsx create mode 100644 packages/remix-start/src/default-entry/client.tsx create mode 100644 packages/remix-start/src/default-entry/server.ts create mode 100644 packages/remix-start/src/default-entry/start.ts create mode 100644 packages/remix-start/src/index.ts create mode 100644 packages/remix-start/src/plugin/shared.ts create mode 100644 packages/remix-start/src/plugin/vite.ts create mode 100644 packages/remix-start/src/server-only.ts create mode 100644 packages/remix-start/src/server-rpc.ts create mode 100644 packages/remix-start/src/server.tsx create mode 100644 packages/remix-start/src/server/createStartHandler.ts create mode 100644 packages/remix-start/src/server/index.ts create mode 100644 packages/remix-start/src/ssr-rpc.ts create mode 100644 packages/remix-start/src/useServerFn.ts create mode 100644 packages/remix-start/tsconfig.build.json create mode 100644 packages/remix-start/tsconfig.json diff --git a/examples/remix/basic/README.md b/examples/remix/basic/README.md new file mode 100644 index 00000000000..8d4a981eb91 --- /dev/null +++ b/examples/remix/basic/README.md @@ -0,0 +1,89 @@ +# `@tanstack/remix-router` + `@tanstack/remix-start` example + +End-to-end demo of TanStack Router on Remix 3 — the routing layer +rendered through `@remix-run/ui`, the full-stack runtime via +`@tanstack/remix-start`, the production-bundle compiler via +`@tanstack/remix-start/plugin/vite`. + +## Routes + +| Path | Demonstrates | +|---|---| +| `/` | Static home page | +| `/users` | Loader-driven list, `` to nested detail | +| `/users/$id` | `useLoaderData` + `useParams`, server-fn-rendered HTML mounted via `innerHTML` | +| `/posts` | Same shape with markdown content | +| `/posts/$slug` | Heavy markdown + syntax highlighting (server-only deps stay out of client bundle) | +| `/admin/users/$userId/sessions/$sessionId` | 4-deep nested layout; exercises ``/`` reactivity at every level | +| `/catalog` | `validateSearch`, `loaderDeps`, ``, form-driven `useNavigate` | +| `/slow` | Async loader (800ms), `pendingComponent` UI | +| `/deferred` | `defer()` + `` — sync part renders immediately, slow chunk streams in | +| `/lab/error` | Loader throws → `errorComponent` | +| `/lab/missing` | Loader calls `notFound()` → `notFoundComponent` | +| `/lab/render-error` | Render-time throw caught by enclosing `` | +| `/guestbook` | `createServerFn({ method: 'POST' })` with `inputValidator`; form submit calls server fn from event handler | +| `/counter` | `clientEntry()`-marked island that hydrates standalone (counter `+`/`reset` buttons) | + +## Bundle savings + +The Vite plugin (`@tanstack/remix-start/plugin/vite` → +`@tanstack/start-plugin-core` under the hood) extracts `createServerFn` +handler bodies from the client bundle, replacing them with RPC +fetchers that hit `${TSS_SERVER_FN_BASE}/`. Heavy server-only +modules (markdown renderers, ORM clients, image pipelines) reachable +only through those handlers fall out of the client bundle entirely. + +In this example: `marked`, `highlight.js`, language grammars, and +`heavyDep` (a deliberately-fat user-bio renderer) are all server-only +— the client bundle (~190 KB minified) contains none of them. + +## Architecture + +``` +Browser + ├─ src/client.tsx + │ hydrateStart() ← consumes seroval-streamed router state + │ run({...}) ← initializes Remix UI document runtime (islands) + │ createRoot(document.body).render() + │ + └─ HTTP request → + ↓ + Server (vite dev server in dev; node http for prod) + └─ default-entry server (auto-generated by plugin) + createStartHandler(defaultStreamHandler) + ↓ + defaultStreamHandler ← `@tanstack/remix-start/server` + renderRouterToStream({ router, request, … }) + - calls `` which provides the document shell + - uses `@remix-run/ui/server`'s `renderToStream` + - pipes through `transformReadableStreamWithRouter` + to splice the dehydration script before `` + - bot user-agents → buffered (`isbot` detection) + - render-time throws → 500 fallback +``` + +### Client hydration + +`__root.tsx` renders only the body content (`