Loading...
Loading...
TanStack Start (RC) full-stack React with server functions, SSR, Cloudflare Workers. Use for Next.js migration, edge rendering, or encountering hydration, auth, data pattern errors.
npx skill4agent add secondsky/claude-skills tanstack-startscripts/bootstrap-cloudflare-start.sh <app>npm create @tanstack/start@latest my-app
cd my-app
npm run dev@tanstack/react-router@tanstack/react-startvitewebpackesbuildapp/routes/**app/entry.client.tsx<StartClient />app/entry.server.tsxcreateServerEntryapp/config.tsapp/start.tsdefaultSsrspaModecreateFileRoute()validateSearchredirect()notFound()actionrouter.invalidate()QueryClientensureQueryDatahead<title>notFound()redirect()// app/routes/posts.$postId.tsx
import { createFileRoute, redirect } from '@tanstack/react-router'
import { z } from 'zod'
export const Route = createFileRoute('/posts/$postId')({
validateSearch: z.object({ preview: z.boolean().optional() }),
ssr: 'data-only',
loader: async ({ params, search, context }) => {
const post = await context.queryClient.ensureQueryData(['post', params.postId], () =>
fetch(`/api/posts/${params.postId}?preview=${!!search.preview}`).then(r => r.json())
)
if (!post.published && !search.preview) throw redirect({ to: '/drafts' })
return { post }
},
})<Link preload="intent">preload="render"router.preloadRoute({ to, search })/products?slug=abc/p/abcrouter.navigate({ to, replace, from })useBlockerscrollRestorationssr: true | false | 'data-only'defaultSsrlazyloadpreload="intent"defaultPreloadStaleTimependingComponent<RouterDevtools />@tanstack/eslint-plugin-routerbeforeLoadloaderRoutecloudflare({ viteEnvironment: { name: 'ssr' } })npm run cf-typegenpagesssr: 'data-only'validateSearchcreate-route-property-ordernpm run checkrouter.matchescf-typegencurl -N