clerk-tanstack-patterns — скилл для Claude Code: авторизация
Подсказывает агенту, как подключить Clerk к TanStack React Start: защита маршрутов, createServerFn, лоадеры и middleware.
npx skills add clerk/skills --skill clerk-tanstack-patterns -a claude-codeЧто делает clerk-tanstack-patterns
Скилл разбирает авторизацию Clerk в TanStack React Start по четырём файлам-справочникам: references/router-guards.md про beforeLoad, references/server-functions.md про createServerFn и auth(), references/loaders.md про контекст в лоадерах, references/server-setup.md про Vite и request middleware. Агент читает нужный файл, когда задача касается TanStack auth, защиты маршрутов или middleware.
Устройство двухслойное. Серверный слой — createServerFn вместе с auth() из @clerk/tanstack-react-start/server. Роутерный — beforeLoad в определении маршрута, где неавторизованного уводит throw redirect. Обе части выполняются на сервере, а useAuth и useUser остаются браузерными хуками.
Перед началом нужен пакет @clerk/tanstack-react-start и два ключа в .env: VITE_CLERK_PUBLISHABLE_KEY и CLERK_SECRET_KEY. В src/start.ts clerkMiddleware() регистрируется после CSRF-защиты — если поставить его раньше или забыть, auth() падает с ошибкой про ненастроенный middleware. В корне приложения нужен <ClerkProvider>. Ещё одна частая осечка: return redirect(...) вместо throw redirect(...) — редирект просто не сработает.
Какие задачи решает
- закрыть маршрут
/dashboardот неавторизованных черезbeforeLoad - достать
userIdвнутриcreateServerFn - прокинуть состояние авторизации из
beforeLoadв лоадер - настроить
clerkMiddlewareрядом с CSRF вsrc/start.ts - разобраться, почему
auth()ругается на ненастроенный middleware
Примеры запросов агенту
- Защити маршрут /dashboard через beforeLoad и Clerk, неавторизованных отправляй на /sign-in
- Добавь в createServerFn проверку auth() и верни userId
- Как прокинуть userId из beforeLoad в лоадер TanStack Start?
Как установить clerk-tanstack-patterns
1Через Skills CLI (Vercel)
npx skills add clerk/skills --skill clerk-tanstack-patterns -a claude-code2Вручную: положить файлы
~/.claude/skills/clerk-tanstack-patterns/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/clerk-tanstack-patterns/
1Через Skills CLI (Vercel)
npx skills add clerk/skills --skill clerk-tanstack-patterns -a codex2Вручную: положить файлы
.agents/skills/clerk-tanstack-patterns/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add clerk/skills --skill clerk-tanstack-patterns -a cursor2Вручную: положить файлы
.cursor/skills/clerk-tanstack-patterns/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install clerk/skills clerk-tanstack-patterns2Вручную: положить файлы
.github/skills/clerk-tanstack-patterns/SKILL.md1Через Skills CLI (Vercel)
npx skills add clerk/skills --skill clerk-tanstack-patterns -a gemini-cli2Командой платформы
gemini skills install https://github.com/clerk/skills --path skills/clerk-tanstack-patternsВручную: положить файлы
.devin/skills/clerk-tanstack-patterns/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add clerk/skills --skill clerk-tanstack-patterns -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора19
Похожие
Рядом в теме «Фронтенд и UI»
Всё по теме «Фронтенд и UI» →Вопросы о clerk-tanstack-patterns
Как установить clerk-tanstack-patterns в Claude?
Выполните npx skills add clerk/skills --skill clerk-tanstack-patterns -a claude-code. Скилл окажется в ~/.claude/skills/clerk-tanstack-patterns/SKILL.md.
Что делает clerk-tanstack-patterns?
Даёт агенту готовые шаблоны авторизации Clerk для TanStack React Start: защита маршрутов, createServerFn, лоадеры и настройка Vite с request middleware.
Что нужно подготовить до работы со скиллом?
Пакет @clerk/tanstack-react-start и ключи VITE_CLERK_PUBLISHABLE_KEY и CLERK_SECRET_KEY в .env. Без clerkMiddleware в src/start.ts вызов auth() завершится ошибкой.
Исходный текст
SKILL.md · MIT
---
name: clerk-tanstack-patterns
description: 'TanStack React Start auth patterns with @clerk/tanstack-react-start
- createServerFn, beforeLoad guards, loaders, Vite plugin, server middleware. Triggers on: TanStack
auth, createServerFn clerk, beforeLoad protection, TanStack Start middleware.'
license: MIT
allowed-tools: WebFetch
metadata:
author: clerk
version: 1.0.0
---
# 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 Vite + Clerk middleware | references/server-setup.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/server-setup.md` | Vite and request middleware setup |
## Setup
```
npm install @clerk/tanstack-react-start
```
`.env`:
```
VITE_CLERK_PUBLISHABLE_KEY=pk_...
CLERK_SECRET_KEY=sk_...
```
`src/start.ts` (request middleware):
```typescript
import { clerkMiddleware } from '@clerk/tanstack-react-start/server'
import { createCsrfMiddleware, createStart } from '@tanstack/react-start'
const csrfMiddleware = createCsrfMiddleware({
filter: (ctx) => ctx.handlerType === 'serverFn',
})
export const startInstance = createStart(() => {
return {
requestMiddleware: [csrfMiddleware, clerkMiddleware()],
}
})
```
`src/routes/__root.tsx` — wrap with `<ClerkProvider>`:
```tsx
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 uses the `tanstackStart()` Vite plugin. Register CSRF protection before Clerk request middleware in `src/start.ts`; auth then 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
```typescript
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()` throws "without configuring the middleware" | Missing `clerkMiddleware` in start.ts | Add it after CSRF middleware in `requestMiddleware` |
| `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](https://clerk.com/docs/tanstack-react-start/getting-started/quickstart)
© clerk · MIT · clerk/skills