Better Auth Skill
Better Auth is comprehensive, framework-agnostic authentication/authorization framework for TypeScript with built-in email/password, social OAuth, and powerful plugin ecosystem for advanced features.
Quick Start
Installation
Environment Setup
Create .env:
BETTER_AUTH_SECRET=<generated-secret-32-chars-min>
BETTER_AUTH_URL=http://localhost:3000
Basic Server Setup
Create auth.ts (root, lib/, utils/, or under src/app/server/):
export const auth = betterAuth({
database: {
// See references/database-integration.md
},
emailAndPassword: {
enabled: true,
autoSignIn: true
},
socialProviders: {
github: {
clientId: process.env.GITHUB_CLIENT_ID!,
clientSecret: process.env.GITHUB_CLIENT_SECRET!,
}
}
});
Database Schema
Mount API Handler
Next.js App Router:
export const { POST, GET } = toNextJsHandler(auth);
Other frameworks: See references/email-password-auth.md#framework-setup
Client Setup
Create auth-client.ts:
export const authClient = createAuthClient({
baseURL: process.env.NEXT_PUBLIC_BETTER_AUTH_URL || "http://localhost:3000"
});
Basic Usage
// Sign in
await authClient.signIn.email({
email: "user@example.com",
password: "secure123"
});
// OAuth
await authClient.signIn.social({ provider: "github" });
// Session
const { data: session } = authClient.useSession(); // React/Vue/Svelte
const { data: session } = await authClient.getSession(); // Vanilla JS
Feature Selection Matrix
Auth Method Selection Guide
Choose Email/Password when:
- Building standard web app with traditional auth
- Need full control over user credentials
- Targeting users who prefer email-based accounts
Choose OAuth when:
- Want quick signup with minimal friction
- Users already have social accounts
- Need access to social profile data
Choose Passkeys when:
- Want passwordless experience
- Targeting modern browsers/devices
- Security is top priority
Choose Magic Link when:
- Want passwordless without WebAuthn complexity
- Targeting email-first users
- Need temporary access links
Combine Multiple Methods when:
- Want flexibility for different user preferences
- Building enterprise apps with various auth requirements
- Need progressive enhancement (start simple, add more options)
Core Architecture
Better Auth uses client-server architecture:
- Server (
better-auth): Handles auth logic, database ops, API routes
- Client (
better-auth/client): Provides hooks/methods for frontend
- Plugins: Extend both server/client functionality
Implementation Checklist
Reference Documentation
Core Authentication
Advanced Features
- Advanced Features - 2FA/MFA, passkeys, magic links, organizations, rate limiting, session management
Scripts
scripts/better_auth_init.py - Initialize Better Auth configuration with interactive setup
Resources
1---2name: better-auth3description: Implement authentication and authorization with Better Auth - a framework-agnostic TypeScript authentication framework. Features include email/password authentication with verification, OAuth providers (Google, GitHub, Discord, etc.), two-factor authentication (TOTP, SMS), passkeys/WebAuthn support, session management, role-based access control (RBAC), rate limiting, and database adapters. Use when adding authentication to applications, implementing OAuth flows, setting up 2FA/MFA, managing user sessions, configuring authorization rules, or building secure authentication systems for web applications.4license: MIT5---67# Better Auth Skill89Better Auth is comprehensive, framework-agnostic authentication/authorization framework for TypeScript with built-in email/password, social OAuth, and powerful plugin ecosystem for advanced features.1011<triggers>12<trigger>Implementing auth in TypeScript/JavaScript applications</trigger>13<trigger>Adding email/password or social OAuth authentication</trigger>14<trigger>Setting up 2FA, passkeys, magic links, advanced auth features</trigger>15<trigger>Building multi-tenant apps with organization support</trigger>16<trigger>Managing sessions and user lifecycle</trigger>17<trigger>Working with any framework (Next.js, Nuxt, SvelteKit, Remix, Astro, Hono, Express, etc.)</trigger>18</triggers>1920## Quick Start2122### Installation2324<example type="usage">25<code language="bash">26npm install better-auth27# or pnpm/yarn/bun add better-auth28</code>29</example>3031### Environment Setup3233Create `.env`:34```env35BETTER_AUTH_SECRET=<generated-secret-32-chars-min>36BETTER_AUTH_URL=http://localhost:300037```3839### Basic Server Setup4041Create `auth.ts` (root, lib/, utils/, or under src/app/server/):4243<example type="usage">44<code language="typescript">45import { betterAuth } from "better-auth";4647export const auth = betterAuth({48 database: {49 // See references/database-integration.md50 },51 emailAndPassword: {52 enabled: true,53 autoSignIn: true54 },55 socialProviders: {56 github: {57 clientId: process.env.GITHUB_CLIENT_ID!,58 clientSecret: process.env.GITHUB_CLIENT_SECRET!,59 }60 }61});62</code>63</example>6465### Database Schema6667<example type="usage">68<code language="bash">69npx @better-auth/cli generate # Generate schema/migrations70npx @better-auth/cli migrate # Apply migrations (Kysely only)71</code>72</example>7374### Mount API Handler7576**Next.js App Router:**7778<example type="usage">79<code language="typescript">80// app/api/auth/[...all]/route.ts81import { auth } from "@/lib/auth";82import { toNextJsHandler } from "better-auth/next-js";8384export const { POST, GET } = toNextJsHandler(auth);85</code>86</example>8788**Other frameworks:** See references/email-password-auth.md#framework-setup8990### Client Setup9192Create `auth-client.ts`:9394<example type="usage">95<code language="typescript">96import { createAuthClient } from "better-auth/client";9798export const authClient = createAuthClient({99 baseURL: process.env.NEXT_PUBLIC_BETTER_AUTH_URL || "http://localhost:3000"100});101</code>102</example>103104### Basic Usage105106<example type="usage">107<code language="typescript">108// Sign up109await authClient.signUp.email({110 email: "user@example.com",111 password: "secure123",112 name: "John Doe"113});114115// Sign in116await authClient.signIn.email({117 email: "user@example.com",118 password: "secure123"119});120121// OAuth122await authClient.signIn.social({ provider: "github" });123124// Session125const { data: session } = authClient.useSession(); // React/Vue/Svelte126const { data: session } = await authClient.getSession(); // Vanilla JS127</code>128</example>129130## Feature Selection Matrix131132| Feature | Plugin Required | Use Case | Reference |133|---------|----------------|----------|-----------|134| Email/Password | No (built-in) | Basic auth | [email-password-auth.md](./references/email-password-auth.md) |135| OAuth (GitHub, Google, etc.) | No (built-in) | Social login | [oauth-providers.md](./references/oauth-providers.md) |136| Email Verification | No (built-in) | Verify email addresses | [email-password-auth.md](./references/email-password-auth.md#email-verification) |137| Password Reset | No (built-in) | Forgot password flow | [email-password-auth.md](./references/email-password-auth.md#password-reset) |138| Two-Factor Auth (2FA/TOTP) | Yes (`twoFactor`) | Enhanced security | [advanced-features.md](./references/advanced-features.md#two-factor-authentication) |139| Passkeys/WebAuthn | Yes (`passkey`) | Passwordless auth | [advanced-features.md](./references/advanced-features.md#passkeys-webauthn) |140| Magic Link | Yes (`magicLink`) | Email-based login | [advanced-features.md](./references/advanced-features.md#magic-link) |141| Username Auth | Yes (`username`) | Username login | [email-password-auth.md](./references/email-password-auth.md#username-authentication) |142| Organizations/Multi-tenant | Yes (`organization`) | Team/org features | [advanced-features.md](./references/advanced-features.md#organizations) |143| Rate Limiting | No (built-in) | Prevent abuse | [advanced-features.md](./references/advanced-features.md#rate-limiting) |144| Session Management | No (built-in) | User sessions | [advanced-features.md](./references/advanced-features.md#session-management) |145146## Auth Method Selection Guide147148**Choose Email/Password when:**149- Building standard web app with traditional auth150- Need full control over user credentials151- Targeting users who prefer email-based accounts152153**Choose OAuth when:**154- Want quick signup with minimal friction155- Users already have social accounts156- Need access to social profile data157158**Choose Passkeys when:**159- Want passwordless experience160- Targeting modern browsers/devices161- Security is top priority162163**Choose Magic Link when:**164- Want passwordless without WebAuthn complexity165- Targeting email-first users166- Need temporary access links167168**Combine Multiple Methods when:**169- Want flexibility for different user preferences170- Building enterprise apps with various auth requirements171- Need progressive enhancement (start simple, add more options)172173## Core Architecture174175Better Auth uses client-server architecture:1761. **Server** (`better-auth`): Handles auth logic, database ops, API routes1772. **Client** (`better-auth/client`): Provides hooks/methods for frontend1783. **Plugins**: Extend both server/client functionality179180## Implementation Checklist181182- [ ] Install `better-auth` package183- [ ] Set environment variables (SECRET, URL)184- [ ] Create auth server instance with database config185- [ ] Run schema migration (`npx @better-auth/cli generate`)186- [ ] Mount API handler in framework187- [ ] Create client instance188- [ ] Implement sign-up/sign-in UI189- [ ] Add session management to components190- [ ] Set up protected routes/middleware191- [ ] Add plugins as needed (regenerate schema after)192- [ ] Test complete auth flow193- [ ] Configure email sending (verification/reset)194- [ ] Enable rate limiting for production195- [ ] Set up error handling196197<constraints>198<constraint severity="critical">BETTER_AUTH_SECRET must be at least 32 characters and kept secure</constraint>199<constraint severity="critical">Never expose BETTER_AUTH_SECRET in client-side code</constraint>200<constraint severity="high">Always enable rate limiting in production to prevent brute force attacks</constraint>201<constraint severity="high">Regenerate database schema after adding/removing plugins</constraint>202<constraint severity="medium">Use HTTPS in production for all auth endpoints</constraint>203<constraint severity="medium">Implement email verification for email/password auth in production</constraint>204</constraints>205206## Reference Documentation207208### Core Authentication209- [Email/Password Authentication](./references/email-password-auth.md) - Email/password setup, verification, password reset, username auth210- [OAuth Providers](./references/oauth-providers.md) - Social login setup, provider configuration, token management211- [Database Integration](./references/database-integration.md) - Database adapters, schema setup, migrations212213### Advanced Features214- [Advanced Features](./references/advanced-features.md) - 2FA/MFA, passkeys, magic links, organizations, rate limiting, session management215216## Scripts217218- `scripts/better_auth_init.py` - Initialize Better Auth configuration with interactive setup219220## Resources221222- Docs: https://www.better-auth.com/docs223- GitHub: https://github.com/better-auth/better-auth224- Plugins: https://www.better-auth.com/docs/plugins225- Examples: https://www.better-auth.com/docs/examples