Skill for integrating Better Auth - comprehensive TypeScript authentication framework for Cloudflare D1, Next.js, Nuxt, and 15+ frameworks. Use when adding auth, encountering D1 adapter errors, or implementing OAuth/2FA/RBAC features.
View on GitHubsecondsky/claude-skills
better-auth
January 24, 2026
Select agents to install to:
npx add-skill https://github.com/secondsky/claude-skills/blob/main/plugins/better-auth/skills/better-auth/SKILL.md -a claude-code --skill better-authInstallation paths:
.claude/skills/better-auth/# better-auth
**Status**: Production Ready
**Last Updated**: 2025-12-26
**Package**: `better-auth@1.4.9` (ESM-only)
**Dependencies**: Drizzle ORM or Kysely (required for D1)
---
## Quick Start (5 Minutes)
### Installation
**Option 1: Drizzle ORM (Recommended)**
```bash
bun add better-auth drizzle-orm drizzle-kit
```
**Option 2: Kysely**
```bash
bun add better-auth kysely @noxharmonium/kysely-d1
```
### ⚠️ v1.4.0+ Requirements
better-auth v1.4.0+ is **ESM-only**. Ensure:
**package.json**:
```json
{
"type": "module"
}
```
**Upgrading from v1.3.x?** Load `references/migration-guide-1.4.0.md`
### ⚠️ CRITICAL: D1 Adapter Requirements
better-auth **DOES NOT** have a direct `d1Adapter()`. You **MUST** use either:
1. **Drizzle ORM** (recommended) - `drizzleAdapter()`
2. **Kysely** (alternative) - Kysely instance with D1Dialect
```typescript
// ❌ WRONG - This doesn't exist
import { d1Adapter } from 'better-auth/adapters/d1'
// ✅ CORRECT - Use Drizzle
import { drizzleAdapter } from 'better-auth/adapters/drizzle'
import { drizzle } from 'drizzle-orm/d1'
```
### Minimal Setup (Cloudflare Workers + Drizzle)
**1. Create D1 Database:**
```bash
wrangler d1 create my-app-db
```
**2. Define Schema** (`src/db/schema.ts`):
```typescript
import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
export const user = sqliteTable("user", {
id: text().primaryKey(),
name: text().notNull(),
email: text().notNull().unique(),
emailVerified: integer({ mode: "boolean" }).notNull().default(false),
image: text(),
});
export const session = sqliteTable("session", {
id: text().primaryKey(),
userId: text().notNull().references(() => user.id, { onDelete: "cascade" }),
token: text().notNull(),
expiresAt: integer({ mode: "timestamp" }).notNull(),
});
// See references/database-schema.ts for complete schema
```
**3. Initialize Auth** (`src/auth.ts`):
```typescript
import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapt