create-auth-skill
Install this skill
npx skills add better-auth/skillsWorks across Claude Code, Cursor, Codex, Copilot & Antigravity
Better Auth provides a modular, framework-agnostic authentication library for TypeScript applications. It manages user sessions, identity management, and security protocols by separating server-side logic from client-side state. The architecture relies on core packages paired with optional plugins for specialized needs like passkeys, organizational structures, or enterprise SSO. By centralizing authentication config in an auth.ts file and utilizing framework-specific handlers, the library abstracts complex tasks such as database adapter mapping and token management. It supports major database ORMs including Prisma, Drizzle, and direct SQL drivers, ensuring compatibility with most modern tech stacks. Whether you are bootstrapping a fresh project or migrating an existing backend, this tool offers a standardized approach to handling logins, password resets, and user authentication schemas through an automated migration CLI.
When to Use This Skill
- β’Building a new SaaS platform requiring multi-tenant organization support
- β’Adding secure user authentication to a Next.js or Hono application
- β’Implementing passkey-based passwordless login flow
- β’Migrating from legacy auth systems to a type-safe TypeScript solution
How to Invoke This Skill
Example prompts that trigger this skill in Claude Code, Cursor, or Antigravity:
- βsetup better-auth for my next.js project
- βadd social login to my app using better-auth
- βhow do i configure better-auth with drizzle orm
- βadd 2fa to my existing better-auth implementation
- βgenerate auth schema for better-auth
Pro Tips
- π‘Always begin by consulting the official Better Auth documentation (better-auth.com/docs) for the latest syntax and best practices, especially when dealing with specific framework integrations.
- π‘When migrating existing authentication, plan for incremental adoption. Focus on one part of the auth flow at a time (e.g., login, then registration, then session management) to minimize disruption.
- π‘Utilize the Better Auth CLI commands for migrations and generation (`npm run better-auth migrate`, `npm run better-auth generate`) to ensure your database schema and configuration files are correctly synchronized.
What this skill does
- β’Supports multiple database adapters including Prisma, Drizzle, and native SQL clients
- β’Plugin-based architecture for 2FA, SSO, passkeys, and organization management
- β’Standardized client-side hooks for React, Vue, Svelte, and Solid
- β’Automated schema generation and migration CLI tools
- β’Built-in support for social OAuth providers and email-based authentication
When not to use it
- βProjects requiring deep integration with non-TypeScript/JavaScript backends
- βEnvironments where zero-dependency or pure-manual authentication logic is mandated
- βSimple static sites that do not require server-side session management
Example workflow
- Install the core better-auth package and required database adapter
- Define the authentication config inside auth.ts
- Initialize the server-side route handler for your specific framework
- Run the CLI migration command to sync your database schema
- Configure the auth-client in your frontend and hook into session status
Prerequisites
- βA TypeScript project environment
- βAn active database connection string
- βBasic understanding of your framework's routing structure
Pitfalls & limitations
- !Forgetting to re-run the CLI migration tool after adding new plugins
- !Misconfiguring the BETTER_AUTH_URL environment variable across different deployment stages
- !Incompatibility issues if using unsupported or custom legacy database adapters
FAQ
How it compares
Unlike manual implementations that require writing custom session state and password hashing, Better Auth provides an abstracted, type-safe standard that syncs with ORMs automatically.
π Full skill instructions β original source: better-auth/skills
Guide for adding authentication to TypeScript/JavaScript applications using Better Auth.
**For code examples and syntax, see [better-auth.com/docs](https://better-auth.com/docs).**
---
## Decision Tree
Is this a new/empty project?
ββ YES β New project setup
β 1. Identify framework
β 2. Choose database
β 3. Install better-auth
β 4. Create auth.ts + auth-client.ts
β 5. Set up route handler
β 6. Run CLI migrate/generate
β 7. Add features via plugins
β
ββ NO β Does project have existing auth?
ββ YES β Migration/enhancement
β β’ Audit current auth for gaps
β β’ Plan incremental migration
β β’ See migration guides in docs
β
ββ NO β Add auth to existing project
1. Analyze project structure
2. Install better-auth
3. Create auth config
4. Add route handler
5. Run schema migrations
6. Integrate into existing pages---
## Installation
**Core:**
npm install better-auth**Scoped packages (as needed):**
| Package | Use case |
|---------|----------|
|
@better-auth/passkey | WebAuthn/Passkey auth ||
@better-auth/sso | SAML/OIDC enterprise SSO ||
@better-auth/stripe | Stripe payments ||
@better-auth/scim | SCIM user provisioning ||
@better-auth/expo | React Native/Expo |---
## Environment Variables
BETTER_AUTH_SECRET=<32+ chars, generate with: openssl rand -base64 32>
BETTER_AUTH_URL=http://localhost:3000
DATABASE_URL=<your database connection string>Add OAuth secrets as needed:
GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET, GOOGLE_CLIENT_ID, etc.---
## Server Config (auth.ts)
**Location:**
lib/auth.ts or src/lib/auth.ts**Minimal config needs:**
-
database - Connection or adapter-
emailAndPassword: { enabled: true } - For email/password auth**Standard config adds:**
-
socialProviders - OAuth providers (google, github, etc.)-
emailVerification.sendVerificationEmail - Email verification handler-
emailAndPassword.sendResetPassword - Password reset handler**Full config adds:**
-
plugins - Array of feature plugins-
session - Expiry, cookie cache settings-
account.accountLinking - Multi-provider linking-
rateLimit - Rate limiting config**Export types:**
export type Session = typeof auth.$Infer.Session---
## Client Config (auth-client.ts)
**Import by framework:**
| Framework | Import |
|-----------|--------|
| React/Next.js |
better-auth/react || Vue |
better-auth/vue || Svelte |
better-auth/svelte || Solid |
better-auth/solid || Vanilla JS |
better-auth/client |**Client plugins** go in
createAuthClient({ plugins: [...] }).**Common exports:**
signIn, signUp, signOut, useSession, getSession---
## Route Handler Setup
| Framework | File | Handler |
|-----------|------|---------|
| Next.js App Router |
app/api/auth/[...all]/route.ts | toNextJsHandler(auth) β export { GET, POST } || Next.js Pages |
pages/api/auth/[...all].ts | toNextJsHandler(auth) β default export || Express | Any file |
app.all("/api/auth/*", toNodeHandler(auth)) || SvelteKit |
src/hooks.server.ts | svelteKitHandler(auth) || SolidStart | Route file |
solidStartHandler(auth) || Hono | Route file |
auth.handler(c.req.raw) |**Next.js Server Components:** Add
nextCookies() plugin to auth config.---
## Database Migrations
| Adapter | Command |
|---------|---------|
| Built-in Kysely |
npx @better-auth/cli@latest migrate (applies directly) || Prisma |
npx @better-auth/cli@latest generate --output prisma/schema.prisma then npx prisma migrate dev || Drizzle |
npx @better-auth/cli@latest generate --output src/db/auth-schema.ts then npx drizzle-kit push |**Re-run after adding plugins.**
---
## Database Adapters
| Database | Setup |
|----------|-------|
| SQLite | Pass
better-sqlite3 or bun:sqlite instance directly || PostgreSQL | Pass
pg.Pool instance directly || MySQL | Pass
mysql2 pool directly || Prisma |
prismaAdapter(prisma, { provider: "postgresql" }) from better-auth/adapters/prisma || Drizzle |
drizzleAdapter(db, { provider: "pg" }) from better-auth/adapters/drizzle || MongoDB |
mongodbAdapter(db) from better-auth/adapters/mongodb |---
## Common Plugins
| Plugin | Server Import | Client Import | Purpose |
|--------|---------------|---------------|---------|
|
twoFactor | better-auth/plugins | twoFactorClient | 2FA with TOTP/OTP ||
organization | better-auth/plugins | organizationClient | Teams/orgs ||
admin | better-auth/plugins | adminClient | User management ||
bearer | better-auth/plugins | - | API token auth ||
openAPI | better-auth/plugins | - | API docs ||
passkey | @better-auth/passkey | passkeyClient | WebAuthn ||
sso | @better-auth/sso | - | Enterprise SSO |**Plugin pattern:** Server plugin + client plugin + run migrations.
---
## Auth UI Implementation
**Sign in flow:**
1.
signIn.email({ email, password }) or signIn.social({ provider, callbackURL })2. Handle
error in response3. Redirect on success
**Session check (client):**
useSession() hook returns { data: session, isPending }**Session check (server):**
auth.api.getSession({ headers: await headers() })**Protected routes:** Check session, redirect to
/sign-in if null.---
## Security Checklist
- [ ]
BETTER_AUTH_SECRET set (32+ chars)- [ ]
advanced.useSecureCookies: true in production- [ ]
trustedOrigins configured- [ ] Rate limits enabled
- [ ] Email verification enabled
- [ ] Password reset implemented
- [ ] 2FA for sensitive apps
- [ ] CSRF protection NOT disabled
- [ ]
account.accountLinking reviewed---
## Troubleshooting
| Issue | Fix |
|-------|-----|
| "Secret not set" | Add
BETTER_AUTH_SECRET env var || "Invalid Origin" | Add domain to
trustedOrigins || Cookies not setting | Check
baseURL matches domain; enable secure cookies in prod || OAuth callback errors | Verify redirect URIs in provider dashboard |
| Type errors after adding plugin | Re-run CLI generate/migrate |
---
## Resources
- [Docs](https://better-auth.com/docs)
- [Examples](https://github.com/better-auth/examples)
- [Plugins](https://better-auth.com/docs/concepts/plugins)
- [CLI](https://better-auth.com/docs/concepts/cli)
- [Migration Guides](https://better-auth.com/docs/guides)
How to Use This Skill Unit
Option A: Project-Specific (Recommended)
- Click "Download" above
- In your project, create the directory:
.agent/skills/create-auth/ - Save the file as
SKILL.md - The agent will automatically discover the skill based on its description.
Option B: Global Installation (All Agents)
Save the file to these locations to make it available across all projects:
- Claude Code:
~/.claude/skills/better-auth/skills/create-auth/SKILL.md - Cursor:
~/.cursor/skills/better-auth/skills/create-auth/SKILL.md - Antigravity:
~/.gemini/antigravity/skills/better-auth/skills/create-auth/SKILL.md
π Install with CLI:npx skills add better-auth/skills