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.

referencesvinxi-server.md

≈489 tokens on demand. Your agent reads this file only when SKILL.md points to it.

Vinxi Server (HIGH)

clerkMiddleware() Setup

TanStack Start uses Vinxi as its build tool and server runtime. Register clerkMiddleware in src/start.ts:

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

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

Without this, auth() returns an empty object in all server functions.

ClerkProvider in Root

Add ClerkProvider to the root route shell component in src/routes/__root.tsx:

import { ClerkProvider } from '@clerk/tanstack-react-start'
import { createRootRoute, HeadContent, Scripts } from '@tanstack/react-router'

export const Route = createRootRoute({
  shellComponent: RootDocument,
})

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

Environment Variables

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

No framework-specific prefix needed (unlike VITE_ or NEXT_PUBLIC_).

API Routes

TanStack Start API routes live in src/routes/api/:

// src/routes/api/protected.ts
import { createAPIFileRoute } from '@tanstack/react-start/api'
import { auth } from '@clerk/tanstack-react-start/server'

export const Route = createAPIFileRoute('/api/protected')({
  GET: async ({ request }) => {
    const { isAuthenticated, userId } = await auth()

    if (!isAuthenticated) {
      return new Response('Unauthorized', { status: 401 })
    }

    return new Response(JSON.stringify({ userId }), {
      headers: { 'Content-Type': 'application/json' },
    })
  },
})

Docs

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.