Add Clerk authentication to any project by following the official quickstart guides.
npx skills add https://github.com/clerk/stripe-webhooks-example --skill clerk-setup
> Version: Check package.json for the SDK version — see clerk skill for the version table. Core 2 differences are noted inline with > Core 2 ONLY (skip if current SDK): callouts.
This skill sets up Clerk for authentication by following the official quickstart documentation.
| Step | Action |
|------|--------|
| 1. Detect framework | Check package.json dependencies |
| 2. Fetch quickstart | Use WebFetch on the appropriate docs URL |
| 3. Follow instructions | Execute steps; create proxy.ts (Next.js <=15: middleware.ts) |
| 4. Get API keys | From dashboard.clerk.com |
> If the project has components.json (shadcn/ui), apply the shadcn theme after setup. See clerk-custom-ui skill → shadcn Theme.
Check package.json to identify the framework:
| Dependency | Framework | Quickstart URL |
|------------|-----------|----------------|
| next | Next.js | https://clerk.com/docs/nextjs/getting-started/quickstart |
| @remix-run/react | Remix | https://clerk.com/docs/remix/getting-started/quickstart |
| astro | Astro | https://clerk.com/docs/astro/getting-started/quickstart |
| nuxt | Nuxt | https://clerk.com/docs/nuxt/getting-started/quickstart |
| react-router | React Router | https://clerk.com/docs/react-router/getting-started/quickstart |
| @tanstack/react-start | TanStack Start | https://clerk.com/docs/tanstack-react-start/getting-started/quickstart |
| react (no framework) | React SPA | https://clerk.com/docs/react/getting-started/quickstart |
| vue | Vue | https://clerk.com/docs/vue/getting-started/quickstart |
| express | Express | https://clerk.com/docs/expressjs/getting-started/quickstart |
| fastify | Fastify | https://clerk.com/docs/fastify/getting-started/quickstart |
| expo | Expo | https://clerk.com/docs/expo/getting-started/quickstart |
For other platforms:
https://clerk.com/docs/chrome-extension/getting-started/quickstarthttps://clerk.com/docs/android/getting-started/quickstarthttps://clerk.com/docs/ios/getting-started/quickstarthttps://clerk.com/docs/js-frontend/getting-started/quickstartUser Request: "Add Clerk" / "Add authentication"
│
├─ Read package.json
│
├─ Existing auth detected?
│ ├─ YES → Audit → Migration plan
│ └─ NO → Fresh install
│
├─ Identify framework → WebFetch quickstart → Follow instructions
│ └─ Next.js? → Create proxy.ts (Next.js <=15: middleware.ts)
│
└─ components.json exists? → YES → Apply shadcn theme (see clerk-custom-ui)
Read the project's package.json and match dependencies to the table above.
Use WebFetch to retrieve the official quickstart for the detected framework:
WebFetch: https://clerk.com/docs/{framework}/getting-started/quickstart
Prompt: "Extract the complete setup instructions including all code snippets, file paths, and configuration steps."
Execute each step from the quickstart guide:
> Next.js: Create proxy.ts (Next.js <=15: middleware.ts). See the clerk-nextjs-patterns skill for middleware strategies.
> shadcn/ui detected (components.json exists): ALWAYS apply the shadcn theme. See clerk-custom-ui skill → shadcn Theme section.
Two paths for development API keys:
Keyless (Automatic)
Manual (Dashboard)
pk_test_ or pk_live_sk_test_ or sk_live_NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY and CLERK_SECRET_KEYIf the project already has authentication, create a migration plan before replacing it.
Check package.json for existing auth libraries:
next-auth / @auth/core → NextAuth/Auth.js@supabase/supabase-js → Supabase Authfirebase / firebase-admin → Firebase Auth@aws-amplify/auth → AWS Cognitoauth0 / @auth0/nextjs-auth0 → Auth0passport → Passport.jsexternal_id in Clerk| Package | Install |
|---------|---------|
| Next.js | @clerk/nextjs |
| React | @clerk/react |
| Expo | @clerk/expo |
| React Router | @clerk/react-router |
| TanStack Start | @clerk/tanstack-react-start |
> Core 2 ONLY (skip if current SDK): React and Expo packages have different names: @clerk/clerk-react and @clerk/clerk-expo (with clerk- prefix).
ClerkProvider must be placed inside <body>, not wrapping <html>:
// root layout.tsx
export default function RootLayout({ children }) {
return (
<html>
<body>
<ClerkProvider>{children}</ClerkProvider>
</body>
</html>
)
}
> Core 2 ONLY (skip if current SDK): ClerkProvider can wrap <html> directly.
For dynamic rendering with auth data, use the dynamic prop:
<ClerkProvider dynamic>{children}</ClerkProvider>
Requires Node.js 20.9.0 or higher.
> Core 2 ONLY (skip if current SDK): Minimum Node.js 18.17.0.
Themes are installed from @clerk/ui:
npm install @clerk/ui
> Core 2 ONLY (skip if current SDK): Themes are from @clerk/themes instead of @clerk/ui.
If the project uses shadcn/ui (check for components.json in the project root), apply the shadcn theme so Clerk components match the app's design system:
npm install @clerk/ui
import { shadcn } from '@clerk/ui/themes'
<ClerkProvider appearance={{ theme: shadcn }}>{children}</ClerkProvider>
Also import the shadcn CSS in your global styles:
@import 'tailwindcss';
@import '@clerk/ui/themes/shadcn.css';
> Core 2 ONLY (skip if current SDK): Import from @clerk/themes and @clerk/themes/shadcn.css instead.
| Level | Issue | Solution |
|-------|-------|----------|
| CRITICAL | Missing await on auth() | In Next.js 15+, auth() is async: const { userId } = await auth() |
| CRITICAL | Exposing CLERK_SECRET_KEY | Never use secret key in client code; only NEXT_PUBLIC_* keys are safe |
| HIGH | Missing middleware matcher | Include API routes: matcher: ['/((?!.*\\..*|_next).*)', '/'] |
| HIGH | ClerkProvider placement | Must be inside <body> in root layout (Core 2: could wrap <html>) |
| HIGH | Auth routes not public | Allow /sign-in, /sign-up in middleware config |
| HIGH | Landing page requires auth | To keep "/" public, exclude it: matcher: ['/((?!.*\\..*|_next|^/$).*)', '/api/(.*)'] |
| MEDIUM | Wrong import path | Server code uses @clerk/nextjs/server, client uses @clerk/nextjs |
| MEDIUM | Wrong package name | Use @clerk/react not @clerk/clerk-react (Core 2 naming) |
clerk-custom-ui - Custom sign-in/up componentsclerk-nextjs-patterns - Advanced Next.js patternsclerk-react-patterns - React SPA patternsclerk-react-router-patterns - React Router patternsclerk-vue-patterns - Vue patternsclerk-nuxt-patterns - Nuxt patternsclerk-astro-patterns - Astro patternsclerk-tanstack-patterns - TanStack Start patternsclerk-expo-patterns - Expo patternsclerk-chrome-extension-patterns - Chrome Extension patternsclerk-orgs - B2B multi-tenant organizationsclerk-webhooks - Webhook → database syncclerk-testing - E2E testing setupclerk-swift - Native iOS authclerk-android - Native Android authclerk-backend-api - Backend REST API explorerTake clerk/stripe-webhooks-example-clerk-setup from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npm.
Without those the skill loads but fails at the first command.