All skills
clerk avatar

/clerk-tanstack-patterns

@ca5e365 official
by clerkclerk/skills83 stars
5

TanStack React Start auth patterns with @clerk/tanstack-react-start - createServerFn, beforeLoad guards, loaders, Vinxi server. Triggers on: TanStack auth, createServerFn clerk, beforeLoad protection, TanStack Start middleware.

Use this Skill: https://skilld.dev/gh/clerk/skills/clerk-tanstack-patterns

This session only. Nothing lands on disk.

SKILL.md

≈63 tokens always: the name and description. ≈784 when used: this file. ≈3.4k more on demand in 7 files.

TanStack React Start Patterns

What Do You Need?

Task Reference
Protect routes with beforeLoad references/router-guards.md
Auth in createServerFn references/server-functions.md
Pass auth to loaders references/loaders.md
Configure Vinxi + clerkMiddleware references/vinxi-server.md

References

Reference Description
references/router-guards.md beforeLoad auth redirect
references/server-functions.md createServerFn with auth()
references/loaders.md Auth context in loaders
references/vinxi-server.md clerkMiddleware() setup

Setup

npm install @clerk/tanstack-react-start

.env:

CLERK_PUBLISHABLE_KEY=pk_...
CLERK_SECRET_KEY=sk_...

src/start.ts (Vinxi entry):

import { clerkMiddleware } from '@clerk/tanstack-react-start/server'
import { createStart } from '@tanstack/react-start'

export const startInstance = createStart(() => {
  return {
    requestMiddleware: [clerkMiddleware()],
  }
})

src/routes/__root.tsx — wrap with <ClerkProvider>:

import { ClerkProvider } from '@clerk/tanstack-react-start'

function RootDocument({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <body>
        <ClerkProvider>
          {children}
        </ClerkProvider>
      </body>
    </html>
  )
}

Mental Model

TanStack Start runs on Vinxi. Auth flows through two layers:

  1. Server layer — createServerFn + auth() from @clerk/tanstack-react-start/server
  2. Router layer — beforeLoad on route definitions, throws redirect for unauthenticated

Both layers are server-executed. Client hooks (useAuth, useUser) are React hooks for the browser side.

Minimal Pattern

import { createFileRoute, redirect } from '@tanstack/react-router'
import { createServerFn } from '@tanstack/react-start'
import { auth } from '@clerk/tanstack-react-start/server'

const authStateFn = createServerFn().handler(async () => {
  const { isAuthenticated, userId } = await auth()
  if (!isAuthenticated) {
    throw redirect({ to: '/sign-in' })
  }
  return { userId }
})

export const Route = createFileRoute('/dashboard')({
  beforeLoad: async () => await authStateFn(),
})

Common Pitfalls

Symptom Cause Fix
auth() returns empty Missing clerkMiddleware in start.ts Add to requestMiddleware array
redirect not thrown Using return instead of throw throw redirect(...) in TanStack
Wrong import for auth Mixing client/server imports Server: @clerk/tanstack-react-start/server
Loader context missing userId Not passing from beforeLoad Return from beforeLoad, access via context
ClerkProvider missing Forgot root wrapping Add to __root.tsx shell component

See Also

  • clerk-setup - Initial Clerk install
  • clerk-custom-ui - Custom flows & appearance
  • clerk-orgs - B2B organizations

Docs

TanStack React Start SDK

Source: SKILL.md on GitHub

No alerts16d4 checks · Risk SAFE
  • Gen Agent Trust Hub16d

    The skill provides instructional patterns for integrating Clerk authentication with TanStack React Start apps. All configurations, package dependencies, environment variables, and code implementations follow standardized practices for the Clerk platform without any security anomalies or risks.

  • Socket16d

    No alerts

  • Snyk16d

    Risk: LOW · No issues

  • ZeroLeaks5mo

    Score: 93/100 · 2 sections analyzed

Signed by skilld at ca5e365. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub yesterday.

Activeupdated 6 months ago
What it can do
Network
metadata
{
  "author": "clerk",
  "version": "1.0.0"
}
All 1 allowed tools
WebFetch
  • TypeScript
  • clerk
  • tanstack
  • react-start
  • authentication
  • server-functions
  • route-guards
  • vinxi

README badge

README badge for clerk/skills/clerk-tanstack-patterns

Implements Clerk authentication patterns for TanStack React Start using createServerFn, beforeLoad route guards, and Vinxi server middleware. Covers server-side auth checks, redirects for unauthenticated users, and passing auth context through loaders.

Generated from the current SKILL.md.

Does this skill work with TanStack Router without React Start?
No. This skill is specific to TanStack React Start, which runs on Vinxi. It uses createServerFn and clerkMiddleware in a Vinxi-based setup.
How do I protect routes from unauthenticated access?
Use beforeLoad on a route definition with a createServerFn that calls auth() and throws redirect() if not authenticated. The skill provides a minimal pattern example.
What should I import auth() from?
Always import from @clerk/tanstack-react-start/server on the server side. Mixing client and server imports is a common mistake.
Where do I add clerkMiddleware?
Add it to the requestMiddleware array in your Vinxi start.ts entry file. If auth() returns empty, clerkMiddleware is likely missing.
Can I use client-side hooks like useAuth?
Yes, useAuth and useUser are React hooks available on the client side after you wrap your root with ClerkProvider.

Generated from the current SKILL.md. These answers refresh after source changes.